]> 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 921b97916327a6988592243d24acb1e34315b21d..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
@@ -330,15 +331,21 @@ class WorkspaceAutoGen(AutoGen):
                     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 Platform_cache[Arch].Modules:\r
+                            if ModuleFile in MetaFile_cache[Arch]:\r
                                 break\r
                         else:\r
                             ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
@@ -349,9 +356,12 @@ class WorkspaceAutoGen(AutoGen):
                     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 Platform.Modules:\r
+                                if ModuleFile in MetaFileList:\r
                                     continue\r
                                 ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
                                 if not ModuleData.IsBinaryModule:\r
@@ -2581,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
@@ -3105,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
@@ -3267,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
@@ -3299,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
@@ -4045,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
@@ -4052,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