## @file\r
# Common routines used by workspace\r
#\r
-# Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
from __future__ import absolute_import\r
from collections import OrderedDict, defaultdict\r
from Common.DataType import SUP_MODULE_USER_DEFINED\r
+from Common.DataType import SUP_MODULE_HOST_APPLICATION\r
from .BuildClassObject import LibraryClassObject\r
import Common.GlobalData as GlobalData\r
from Workspace.BuildClassObject import StructurePcd\r
from Common.BuildToolError import RESOURCE_NOT_AVAILABLE\r
from Common.BuildToolError import OPTION_MISSING\r
from Common.BuildToolError import BUILD_ERROR\r
-from Common.BuildToolError import PREBUILD_ERROR\r
-import Common.EdkLogger as EdkLogError\r
+import Common.EdkLogger as EdkLogger\r
\r
class OrderedListDict(OrderedDict):\r
def __init__(self, *args, **kwargs):\r
#\r
def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):\r
PkgSet = set()\r
+ if Platform.Packages:\r
+ PkgSet.update(Platform.Packages)\r
for ModuleFile in Platform.Modules:\r
Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
PkgSet.update(Data.Packages)\r
# @retval: List of dependent libraries which are InfBuildData instances\r
#\r
def GetLiabraryInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain):\r
- return GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain)\r
+ return GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain,Platform.MetaFile,EdkLogger)\r
\r
def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain, FileName = '', EdkLogger = None):\r
+ if Module.LibInstances:\r
+ return Module.LibInstances\r
ModuleType = Module.ModuleType\r
\r
# add forced library instances (specified under LibraryClasses sections)\r
ConsumedByList = OrderedListDict()\r
LibraryInstance = OrderedDict()\r
\r
- if FileName:\r
+ if not Module.LibraryClass:\r
EdkLogger.verbose("")\r
EdkLogger.verbose("Library instances of module [%s] [%s]:" % (str(Module), Arch))\r
\r
if LibraryPath is None:\r
LibraryPath = M.LibraryClasses.get(LibraryClassName)\r
if LibraryPath is None:\r
- if FileName:\r
+ if not Module.LibraryClass:\r
EdkLogger.error("build", RESOURCE_NOT_AVAILABLE,\r
"Instance of library class [%s] is not found" % LibraryClassName,\r
File=FileName,\r
return []\r
\r
LibraryModule = BuildDatabase[LibraryPath, Arch, Target, Toolchain]\r
- if LibraryModule.ModuleEntryPointList and LibraryModule.ModuleType != Module.ModuleType:\r
- EdkLogError.error(\r
- "build", PREBUILD_ERROR,\r
- "Driver's ModuleType must be consistent [%s]" % (str(Module)),\r
- File=str(FileName),\r
- ExtraData="consumed by [%s]" % str(LibraryModule))\r
# for those forced library instance (NULL library), add a fake library class\r
if LibraryClassName.startswith("NULL"):\r
LibraryModule.LibraryClass.append(LibraryClassObject(LibraryClassName, [ModuleType]))\r
elif LibraryModule.LibraryClass is None \\r
or len(LibraryModule.LibraryClass) == 0 \\r
- or (ModuleType != SUP_MODULE_USER_DEFINED\r
+ or (ModuleType != SUP_MODULE_USER_DEFINED and ModuleType != SUP_MODULE_HOST_APPLICATION\r
and ModuleType not in LibraryModule.LibraryClass[0].SupModList):\r
# only USER_DEFINED can link against any library instance despite of its SupModList\r
- if FileName:\r
+ if not Module.LibraryClass:\r
EdkLogger.error("build", OPTION_MISSING,\r
"Module type [%s] is not supported by library instance [%s]" \\r
% (ModuleType, LibraryPath), File=FileName,\r
- ExtraData="consumed by [%s]" % str(Module))\r
+ ExtraData="consumed by library instance [%s] which is consumed by module [%s]" \\r
+ % (str(M), str(Module))\r
+ )\r
else:\r
return []\r
\r
LibraryInstance[LibraryClassName] = LibraryModule\r
LibraryConsumerList.append(LibraryModule)\r
- if FileName:\r
+ if not Module.LibraryClass:\r
EdkLogger.verbose("\t" + str(LibraryClassName) + " : " + str(LibraryModule))\r
else:\r
LibraryModule = LibraryInstance[LibraryClassName]\r
#\r
for Item in LibraryList:\r
if ConsumedByList[Item] and Item in Constructor and len(Constructor) > 1:\r
- if FileName:\r
+ if not Module.LibraryClass:\r
ErrorMessage = "\tconsumed by " + "\n\tconsumed by ".join(str(L) for L in ConsumedByList[Item])\r
EdkLogger.error("build", BUILD_ERROR, 'Library [%s] with constructors has a cycle' % str(Item),\r
ExtraData=ErrorMessage, File=FileName)\r
# The DAG Topo sort produces the destructor order, so the list of constructors must generated in the reverse order\r
#\r
SortedLibraryList.reverse()\r
+ Module.LibInstances = SortedLibraryList\r
+ SortedLibraryList = [lib.SetReferenceModule(Module) for lib in SortedLibraryList]\r
return SortedLibraryList\r