]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceCommon.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceCommon.py
index 41ae684d3ee916f9082c0052932baff360fec5f3..9e506fc646b130845d6e1c17277c3daa3e94d6bb 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Common routines used by workspace\r
 #\r
-# Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR>\r
 # SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
@@ -15,6 +15,7 @@ from Workspace.BuildClassObject import StructurePcd
 from Common.BuildToolError import RESOURCE_NOT_AVAILABLE\r
 from Common.BuildToolError import OPTION_MISSING\r
 from Common.BuildToolError import BUILD_ERROR\r
+import Common.EdkLogger as EdkLogger\r
 \r
 class OrderedListDict(OrderedDict):\r
     def __init__(self, *args, **kwargs):\r
@@ -36,6 +37,8 @@ class OrderedListDict(OrderedDict):
 #\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
@@ -85,9 +88,11 @@ def GetDeclaredPcd(Platform, BuildDatabase, Arch, Target, Toolchain, additionalP
 #  @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
@@ -95,7 +100,7 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
     # If a module has a MODULE_TYPE of USER_DEFINED,\r
     # do not link in NULL library class instances from the global [LibraryClasses.*] sections.\r
     #\r
-    if Module.ModuleType != SUP_MODULE_USER_DEFINED and Module.ModuleType != SUP_MODULE_HOST_APPLICATION:\r
+    if Module.ModuleType != SUP_MODULE_USER_DEFINED:\r
         for LibraryClass in Platform.LibraryClasses.GetKeys():\r
             if LibraryClass.startswith("NULL") and Platform.LibraryClasses[LibraryClass, Module.ModuleType]:\r
                 Module.LibraryClasses[LibraryClass] = Platform.LibraryClasses[LibraryClass, Module.ModuleType]\r
@@ -111,7 +116,7 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
     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
@@ -124,7 +129,7 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
                 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
@@ -141,17 +146,19 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
                      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
@@ -232,7 +239,7 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
     #\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
@@ -246,4 +253,6 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
     # 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