]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools: Enhance BaseTools supports FixedAtBuild usage in VFR file
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index 2cc6970325fffb4a5ee2d4a5b189e77f770a8990..c35f0b2fdb86e52699e393ae55954f7d3dfaad49 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Generate AutoGen.h, AutoGen.c and *.depex files\r
 #\r
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2017, 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
@@ -72,7 +72,8 @@ gAutoGenHeaderFileName = "AutoGen.h"
 gAutoGenStringFileName = "%(module_name)sStrDefs.h"\r
 gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk"\r
 gAutoGenDepexFileName = "%(module_name)s.depex"\r
-\r
+gAutoGenImageDefFileName = "%(module_name)sImgDefs.h"\r
+gAutoGenIdfFileName = "%(module_name)sIdf.hpk"\r
 gInfSpecVersion = "0x00010017"\r
 \r
 #\r
@@ -329,6 +330,43 @@ class WorkspaceAutoGen(AutoGen):
                 if fvname.upper() not in self.FdfProfile.FvDict:\r
                     EdkLogger.error("build", OPTION_VALUE_INVALID,\r
                                     "No such an FV in FDF file: %s" % fvname)\r
+\r
+            # In DSC file may use FILE_GUID to override the module, then in the Platform.Modules use FILE_GUIDmodule.inf as key,\r
+            # but the path (self.MetaFile.Path) is the real path\r
+            for key in self.FdfProfile.InfDict:\r
+                if key == 'ArchTBD':\r
+                    Platform_cache = {}\r
+                    MetaFile_cache = {}\r
+                    for Arch in self.ArchList:\r
+                        Platform_cache[Arch] = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
+                        MetaFile_cache[Arch] = []\r
+                        for Pkey in Platform_cache[Arch].Modules.keys():\r
+                            MetaFile_cache[Arch].append(Platform_cache[Arch].Modules[Pkey].MetaFile)\r
+                    for Inf in self.FdfProfile.InfDict[key]:\r
+                        ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch)\r
+                        for Arch in self.ArchList:\r
+                            if ModuleFile in MetaFile_cache[Arch]:\r
+                                break\r
+                        else:\r
+                            ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
+                            if not ModuleData.IsBinaryModule:\r
+                                EdkLogger.error('build', PARSER_ERROR, "Module %s NOT found in DSC file; Is it really a binary module?" % ModuleFile)\r
+\r
+                else:\r
+                    for Arch in self.ArchList:\r
+                        if Arch == key:\r
+                            Platform = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
+                            MetaFileList = []\r
+                            for Pkey in Platform.Modules.keys():\r
+                                MetaFileList.append(Platform.Modules[Pkey].MetaFile)\r
+                            for Inf in self.FdfProfile.InfDict[key]:\r
+                                ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch)\r
+                                if ModuleFile in MetaFileList:\r
+                                    continue\r
+                                ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
+                                if not ModuleData.IsBinaryModule:\r
+                                    EdkLogger.error('build', PARSER_ERROR, "Module %s NOT found in DSC file; Is it really a binary module?" % ModuleFile)\r
+\r
         else:\r
             PcdSet = {}\r
             ModuleList = []\r
@@ -1115,7 +1153,7 @@ class PlatformAutoGen(AutoGen):
     ## Generate Fds Command\r
     def _GenFdsCommand(self):\r
         return self.Workspace.GenFdsCommand\r
-               \r
+\r
     ## Create makefile for the platform and mdoules in it\r
     #\r
     #   @param      CreateModuleMakeFile    Flag indicating if the makefile for\r
@@ -1914,6 +1952,10 @@ class PlatformAutoGen(AutoGen):
     #   @retval library_list    List of library instances sorted\r
     #\r
     def ApplyLibraryInstance(self, Module):\r
+        # Cover the case that the binary INF file is list in the FDF file but not DSC file, return empty list directly\r
+        if str(Module) not in self.Platform.Modules:\r
+            return []\r
+\r
         ModuleType = Module.ModuleType\r
 \r
         # for overridding library instances with module specific setting\r
@@ -2174,7 +2216,7 @@ class PlatformAutoGen(AutoGen):
             for SkuId in PcdInModule.SkuInfoList:\r
                 Sku = PcdInModule.SkuInfoList[SkuId]\r
                 if Sku.VariableGuid == '': continue\r
-                Sku.VariableGuidValue = GuidValue(Sku.VariableGuid, self.PackageList)\r
+                Sku.VariableGuidValue = GuidValue(Sku.VariableGuid, self.PackageList, self.MetaFile.Path)\r
                 if Sku.VariableGuidValue == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.PackageList])\r
                     EdkLogger.error(\r
@@ -2549,6 +2591,8 @@ class ModuleAutoGen(AutoGen):
         self._IncludePathLength = 0\r
         self._AutoGenFileList = None\r
         self._UnicodeFileList = None\r
+        self._VfrFileList = None\r
+        self._IdfFileList = None\r
         self._SourceFileList  = None\r
         self._ObjectFileList  = None\r
         self._BinaryFileList  = None\r
@@ -2812,17 +2856,18 @@ class ModuleAutoGen(AutoGen):
             for DepexExpresion in DepexExpresionList:\r
                 for key in DepexExpresion.keys():\r
                     Arch, ModuleType = key\r
+                    DepexExpr = [x for x in DepexExpresion[key] if not str(x).startswith('#')]\r
                     # the type of build module is USER_DEFINED.\r
                     # All different DEPEX section tags would be copied into the As Built INF file\r
                     # and there would be separate DEPEX section tags\r
                     if self.ModuleType.upper() == SUP_MODULE_USER_DEFINED:\r
                         if (Arch.upper() == self.Arch.upper()) and (ModuleType.upper() != TAB_ARCH_COMMON):\r
-                            DepexList.append({(Arch, ModuleType): DepexExpresion[key][:]})\r
+                            DepexList.append({(Arch, ModuleType): DepexExpr})\r
                     else:\r
                         if Arch.upper() == TAB_ARCH_COMMON or \\r
                           (Arch.upper() == self.Arch.upper() and \\r
                           ModuleType.upper() in [TAB_ARCH_COMMON, self.ModuleType.upper()]):\r
-                            DepexList.append({(Arch, ModuleType): DepexExpresion[key][:]})\r
+                            DepexList.append({(Arch, ModuleType): DepexExpr})\r
         \r
         #the type of build module is USER_DEFINED.\r
         if self.ModuleType.upper() == SUP_MODULE_USER_DEFINED:\r
@@ -3072,6 +3117,24 @@ class ModuleAutoGen(AutoGen):
                 self._UnicodeFileList = []\r
         return self._UnicodeFileList\r
 \r
+    ## Return the list of vfr files\r
+    def _GetVfrFileList(self):\r
+        if self._VfrFileList == None:\r
+            if TAB_VFR_FILE in self.FileTypes:\r
+                self._VfrFileList = self.FileTypes[TAB_VFR_FILE]\r
+            else:\r
+                self._VfrFileList = []\r
+        return self._VfrFileList\r
+\r
+    ## Return the list of Image Definition files\r
+    def _GetIdfFileList(self):\r
+        if self._IdfFileList == None:\r
+            if TAB_IMAGE_FILE in self.FileTypes:\r
+                self._IdfFileList = self.FileTypes[TAB_IMAGE_FILE]\r
+            else:\r
+                self._IdfFileList = []\r
+        return self._IdfFileList\r
+\r
     ## Return a list of files which can be built from binary\r
     #\r
     #  "Build" binary files are just to copy them to build directory.\r
@@ -3234,15 +3297,19 @@ class ModuleAutoGen(AutoGen):
     #\r
     def _GetAutoGenFileList(self):\r
         UniStringAutoGenC = True\r
+        IdfStringAutoGenC = True\r
         UniStringBinBuffer = StringIO()\r
+        IdfGenBinBuffer = StringIO()\r
         if self.BuildType == 'UEFI_HII':\r
             UniStringAutoGenC = False\r
+            IdfStringAutoGenC = False\r
         if self._AutoGenFileList == None:\r
             self._AutoGenFileList = {}\r
             AutoGenC = TemplateString()\r
             AutoGenH = TemplateString()\r
             StringH = TemplateString()\r
-            GenC.CreateCode(self, AutoGenC, AutoGenH, StringH, UniStringAutoGenC, UniStringBinBuffer)\r
+            StringIdf = TemplateString()\r
+            GenC.CreateCode(self, AutoGenC, AutoGenH, StringH, UniStringAutoGenC, UniStringBinBuffer, StringIdf, IdfStringAutoGenC, IdfGenBinBuffer)\r
             #\r
             # AutoGen.c is generated if there are library classes in inf, or there are object files\r
             #\r
@@ -3266,6 +3333,17 @@ class ModuleAutoGen(AutoGen):
                 self._ApplyBuildRule(AutoFile, TAB_UNKNOWN_FILE)\r
             if UniStringBinBuffer != None:\r
                 UniStringBinBuffer.close()\r
+            if str(StringIdf) != "":\r
+                AutoFile = PathClass(gAutoGenImageDefFileName % {"module_name":self.Name}, self.DebugDir)\r
+                self._AutoGenFileList[AutoFile] = str(StringIdf)\r
+                self._ApplyBuildRule(AutoFile, TAB_UNKNOWN_FILE)\r
+            if IdfGenBinBuffer != None and IdfGenBinBuffer.getvalue() != "":\r
+                AutoFile = PathClass(gAutoGenIdfFileName % {"module_name":self.Name}, self.OutputDir)\r
+                self._AutoGenFileList[AutoFile] = IdfGenBinBuffer.getvalue()\r
+                AutoFile.IsBinary = True\r
+                self._ApplyBuildRule(AutoFile, TAB_UNKNOWN_FILE)\r
+            if IdfGenBinBuffer != None:\r
+                IdfGenBinBuffer.close()\r
         return self._AutoGenFileList\r
 \r
     ## Return the list of library modules explicitly or implicityly used by this module\r
@@ -3394,7 +3472,11 @@ class ModuleAutoGen(AutoGen):
                 PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)\r
                 if PackageDir not in self._IncludePathList:\r
                     self._IncludePathList.append(PackageDir)\r
-                for Inc in Package.Includes:\r
+                IncludesList = Package.Includes\r
+                if Package._PrivateIncludes:\r
+                    if not self.MetaFile.Path.startswith(PackageDir):\r
+                        IncludesList = list(set(Package.Includes).difference(set(Package._PrivateIncludes)))\r
+                for Inc in IncludesList:\r
                     if Inc not in self._IncludePathList:\r
                         self._IncludePathList.append(str(Inc))\r
         return self._IncludePathList\r
@@ -3461,7 +3543,7 @@ class ModuleAutoGen(AutoGen):
             for SkuName in Pcd.SkuInfoList:\r
                 SkuInfo = Pcd.SkuInfoList[SkuName]\r
                 Name = ConvertStringToByteArray(SkuInfo.VariableName)\r
-                Value = GuidValue(SkuInfo.VariableGuid, self.PlatformInfo.PackageList)\r
+                Value = GuidValue(SkuInfo.VariableGuid, self.PlatformInfo.PackageList, self.MetaFile.Path)\r
                 if not Value:\r
                     continue\r
                 Guid = GuidStructureStringToGuidString(Value)\r
@@ -3568,13 +3650,13 @@ class ModuleAutoGen(AutoGen):
         # Find all DynamicEx and PatchableInModule PCDs used by this module and dependent libraries\r
         # Also find all packages that the DynamicEx PCDs depend on\r
         Pcds = []\r
-        PatchablePcds = {}\r
+        PatchablePcds = []\r
         Packages = []\r
         PcdCheckList = []\r
         PcdTokenSpaceList = []\r
         for Pcd in self.ModulePcdList + self.LibraryPcdList:\r
             if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
-                PatchablePcds[Pcd.TokenCName] = Pcd\r
+                PatchablePcds += [Pcd]\r
                 PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, 'PatchableInModule'))\r
             elif Pcd.Type in GenC.gDynamicExPcd:\r
                 if Pcd not in Pcds:\r
@@ -3666,34 +3748,29 @@ class ModuleAutoGen(AutoGen):
             AsBuiltInfDict['pcd_is_driver_string'] += [DriverType]\r
 \r
         if 'UEFI_SPECIFICATION_VERSION' in self.Specification:\r
-          AsBuiltInfDict['module_uefi_specification_version'] += [self.Specification['UEFI_SPECIFICATION_VERSION']]\r
+            AsBuiltInfDict['module_uefi_specification_version'] += [self.Specification['UEFI_SPECIFICATION_VERSION']]\r
         if 'PI_SPECIFICATION_VERSION' in self.Specification:\r
-          AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
+            AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
 \r
         OutputDir = self.OutputDir.replace('\\', '/').strip('/')\r
-        if self.ModuleType in ['BASE', 'USER_DEFINED']:\r
-          for Item in self.CodaTargetList:\r
+\r
+        for Item in self.CodaTargetList:\r
             File = Item.Target.Path.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
             if Item.Target.Ext.lower() == '.aml':\r
-              AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
+                AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
             elif Item.Target.Ext.lower() == '.acpi':\r
-              AsBuiltInfDict['binary_item'] += ['ACPI|' + File]\r
+                AsBuiltInfDict['binary_item'] += ['ACPI|' + File]\r
+            elif Item.Target.Ext.lower() == '.efi':\r
+                AsBuiltInfDict['binary_item'] += ['PE32|' + self.Name + '.efi']\r
             else:\r
-              AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
-        else:\r
-          for Item in self.CodaTargetList:\r
-            File = Item.Target.Path.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
-            if Item.Target.Ext.lower() == '.efi':\r
-              AsBuiltInfDict['binary_item'] += ['PE32|' + self.Name + '.efi']\r
-            else:\r
-              AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
-          if self.DepexGenerated:\r
+                AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
+        if self.DepexGenerated:\r
             if self.ModuleType in ['PEIM']:\r
-              AsBuiltInfDict['binary_item'] += ['PEI_DEPEX|' + self.Name + '.depex']\r
+                AsBuiltInfDict['binary_item'] += ['PEI_DEPEX|' + self.Name + '.depex']\r
             if self.ModuleType in ['DXE_DRIVER', 'DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER', 'UEFI_DRIVER']:\r
-              AsBuiltInfDict['binary_item'] += ['DXE_DEPEX|' + self.Name + '.depex']\r
+                AsBuiltInfDict['binary_item'] += ['DXE_DEPEX|' + self.Name + '.depex']\r
             if self.ModuleType in ['DXE_SMM_DRIVER']:\r
-              AsBuiltInfDict['binary_item'] += ['SMM_DEPEX|' + self.Name + '.depex']\r
+                AsBuiltInfDict['binary_item'] += ['SMM_DEPEX|' + self.Name + '.depex']\r
 \r
         Bin = self._GenOffsetBin()\r
         if Bin:\r
@@ -3732,15 +3809,17 @@ class ModuleAutoGen(AutoGen):
                             os.path.join(self.OutputDir, self.Name + '.efi')\r
                         )\r
         if PatchList:\r
-            for PatchPcd in PatchList:\r
-                if PatchPcd[0] in PatchablePcds:\r
-                    key = PatchPcd[0]\r
-                elif PatchPcd[0] + '_PatchableInModule' in PatchablePcds:\r
-                    key = PatchPcd[0] + '_PatchableInModule'\r
+            for Pcd in PatchablePcds:\r
+                TokenCName = Pcd.TokenCName\r
+                for PcdItem in GlobalData.MixedPcd:\r
+                    if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
+                        TokenCName = PcdItem[0]\r
+                        break\r
+                for PatchPcd in PatchList:\r
+                    if TokenCName == PatchPcd[0]:\r
+                        break\r
                 else:\r
                     continue\r
-                Pcd = PatchablePcds[key]\r
-                TokenCName = PatchPcd[0]\r
                 PcdValue = ''\r
                 if Pcd.DatumType != 'VOID*':\r
                     HexFormat = '0x%02x'\r
@@ -3845,8 +3924,8 @@ class ModuleAutoGen(AutoGen):
                 PcdEntry = PcdComments + '\n  ' + PcdEntry\r
             AsBuiltInfDict['pcd_item'] += [PcdEntry]\r
         for Item in self.BuildOption:\r
-          if 'FLAGS' in self.BuildOption[Item]:\r
-            AsBuiltInfDict['flags_item'] += ['%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip())]\r
+            if 'FLAGS' in self.BuildOption[Item]:\r
+                AsBuiltInfDict['flags_item'] += ['%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip())]\r
 \r
         # Generated LibraryClasses section in comments.\r
         for Library in self.LibraryAutoGenList:\r
@@ -4011,6 +4090,7 @@ class ModuleAutoGen(AutoGen):
     IncludePathLength = property(_GetIncludePathLength)\r
     AutoGenFileList = property(_GetAutoGenFileList)\r
     UnicodeFileList = property(_GetUnicodeFileList)\r
+    VfrFileList     = property(_GetVfrFileList)\r
     SourceFileList  = property(_GetSourceFileList)\r
     BinaryFileList  = property(_GetBinaryFiles) # FileType : [File List]\r
     Targets         = property(_GetTargets)\r
@@ -4018,6 +4098,7 @@ class ModuleAutoGen(AutoGen):
     CodaTargetList  = property(_GetFinalTargetList)\r
     FileTypes       = property(_GetFileTypes)\r
     BuildRules      = property(_GetBuildRules)\r
+    IdfFileList     = property(_GetIdfFileList)\r
 \r
     DependentPackageList    = property(_GetDependentPackageList)\r
     DependentLibraryList    = property(_GetLibraryList)\r