]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Split WorkspaceAutoGen._InitWorker into multiple functions
authorFeng, Bob C <bob.c.feng@intel.com>
Mon, 27 May 2019 09:43:05 +0000 (17:43 +0800)
committerFeng, Bob C <bob.c.feng@intel.com>
Fri, 9 Aug 2019 15:15:51 +0000 (23:15 +0800)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875

The WorkspaceAutoGen.__InitWorker function is too long, it's hard
to read and understand.
This patch is to separate the __InitWorker into multiple small ones.

Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/AutoGen/AutoGen.py

index c5b3fbb0a87fd6f9057a8f6aba137b92232bd4d8..122696f5cebfbf4cccaeac73ce9f28676cad531c 100644 (file)
@@ -335,9 +335,54 @@ class WorkspaceAutoGen(AutoGen):
         # there's many relative directory operations, so ...\r
         os.chdir(self.WorkspaceDir)\r
 \r
+        self.MergeArch()\r
+        self.ValidateBuildTarget()\r
+\r
+        EdkLogger.info("")\r
+        if self.ArchList:\r
+            EdkLogger.info('%-16s = %s' % ("Architecture(s)", ' '.join(self.ArchList)))\r
+        EdkLogger.info('%-16s = %s' % ("Build target", self.BuildTarget))\r
+        EdkLogger.info('%-16s = %s' % ("Toolchain", self.ToolChain))\r
+\r
+        EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.Platform))\r
+        if BuildModule:\r
+            EdkLogger.info('%-24s = %s' % ("Active Module", BuildModule))\r
+\r
+        if self.FdfFile:\r
+            EdkLogger.info('%-24s = %s' % ("Flash Image Definition", self.FdfFile))\r
+\r
+        EdkLogger.verbose("\nFLASH_DEFINITION = %s" % self.FdfFile)\r
+\r
+        if Progress:\r
+            Progress.Start("\nProcessing meta-data")\r
         #\r
-        # Merge Arch\r
+        # Mark now build in AutoGen Phase\r
         #\r
+        GlobalData.gAutoGenPhase = True\r
+        self.ProcessModuleFromPdf()\r
+        self.ProcessPcdType()\r
+        self.ProcessMixedPcd()\r
+        self.GetPcdsFromFDF()\r
+        self.CollectAllPcds()\r
+        self.GeneratePkgLevelHash()\r
+        #\r
+        # Check PCDs token value conflict in each DEC file.\r
+        #\r
+        self._CheckAllPcdsTokenValueConflict()\r
+        #\r
+        # Check PCD type and definition between DSC and DEC\r
+        #\r
+        self._CheckPcdDefineAndType()\r
+\r
+        self.CreateBuildOptionsFile()\r
+        self.CreatePcdTokenNumberFile()\r
+        self.CreateModuleHashInfo()\r
+        GlobalData.gAutoGenPhase = False\r
+\r
+    #\r
+    # Merge Arch\r
+    #\r
+    def MergeArch(self):\r
         if not self.ArchList:\r
             ArchList = set(self.Platform.SupArchList)\r
         else:\r
@@ -351,53 +396,45 @@ class WorkspaceAutoGen(AutoGen):
                               % (" ".join(SkippedArchList), " ".join(self.Platform.SupArchList)))\r
         self.ArchList = tuple(ArchList)\r
 \r
-        # Validate build target\r
+    # Validate build target\r
+    def ValidateBuildTarget(self):\r
         if self.BuildTarget not in self.Platform.BuildTargets:\r
             EdkLogger.error("build", PARAMETER_INVALID,\r
                             ExtraData="Build target [%s] is not supported by the platform. [Valid target: %s]"\r
                                       % (self.BuildTarget, " ".join(self.Platform.BuildTargets)))\r
-\r
-\r
-        # parse FDF file to get PCDs in it, if any\r
+    @cached_property\r
+    def FdfProfile(self):\r
         if not self.FdfFile:\r
             self.FdfFile = self.Platform.FlashDefinition\r
 \r
-        EdkLogger.info("")\r
-        if self.ArchList:\r
-            EdkLogger.info('%-16s = %s' % ("Architecture(s)", ' '.join(self.ArchList)))\r
-        EdkLogger.info('%-16s = %s' % ("Build target", self.BuildTarget))\r
-        EdkLogger.info('%-16s = %s' % ("Toolchain", self.ToolChain))\r
-\r
-        EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.Platform))\r
-        if BuildModule:\r
-            EdkLogger.info('%-24s = %s' % ("Active Module", BuildModule))\r
-\r
+        FdfProfile = None\r
         if self.FdfFile:\r
-            EdkLogger.info('%-24s = %s' % ("Flash Image Definition", self.FdfFile))\r
-\r
-        EdkLogger.verbose("\nFLASH_DEFINITION = %s" % self.FdfFile)\r
-\r
-        if Progress:\r
-            Progress.Start("\nProcessing meta-data")\r
-\r
-        if self.FdfFile:\r
-            #\r
-            # Mark now build in AutoGen Phase\r
-            #\r
-            GlobalData.gAutoGenPhase = True\r
             Fdf = FdfParser(self.FdfFile.Path)\r
             Fdf.ParseFile()\r
             GlobalData.gFdfParser = Fdf\r
-            GlobalData.gAutoGenPhase = False\r
-            PcdSet = Fdf.Profile.PcdDict\r
             if Fdf.CurrentFdName and Fdf.CurrentFdName in Fdf.Profile.FdDict:\r
                 FdDict = Fdf.Profile.FdDict[Fdf.CurrentFdName]\r
                 for FdRegion in FdDict.RegionList:\r
                     if str(FdRegion.RegionType) is 'FILE' and self.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
                         if int(FdRegion.Offset) % 8 != 0:\r
                             EdkLogger.error("build", FORMAT_INVALID, 'The VPD Base Address %s must be 8-byte aligned.' % (FdRegion.Offset))\r
-            ModuleList = Fdf.Profile.InfList\r
-            self.FdfProfile = Fdf.Profile\r
+            FdfProfile = Fdf.Profile\r
+        else:\r
+            if self.FdTargetList:\r
+                EdkLogger.info("No flash definition file found. FD [%s] will be ignored." % " ".join(self.FdTargetList))\r
+                self.FdTargetList = []\r
+            if self.FvTargetList:\r
+                EdkLogger.info("No flash definition file found. FV [%s] will be ignored." % " ".join(self.FvTargetList))\r
+                self.FvTargetList = []\r
+            if self.CapTargetList:\r
+                EdkLogger.info("No flash definition file found. Capsule [%s] will be ignored." % " ".join(self.CapTargetList))\r
+                self.CapTargetList = []\r
+\r
+        return FdfProfile\r
+\r
+    def ProcessModuleFromPdf(self):\r
+\r
+        if self.FdfProfile:\r
             for fvname in self.FvTargetList:\r
                 if fvname.upper() not in self.FdfProfile.FvDict:\r
                     EdkLogger.error("build", OPTION_VALUE_INVALID,\r
@@ -409,7 +446,7 @@ class WorkspaceAutoGen(AutoGen):
                 if key == 'ArchTBD':\r
                     MetaFile_cache = defaultdict(set)\r
                     for Arch in self.ArchList:\r
-                        Current_Platform_cache = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
+                        Current_Platform_cache = self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, self.ToolChain]\r
                         for Pkey in Current_Platform_cache.Modules:\r
                             MetaFile_cache[Arch].add(Current_Platform_cache.Modules[Pkey].MetaFile)\r
                     for Inf in self.FdfProfile.InfDict[key]:\r
@@ -418,14 +455,14 @@ class WorkspaceAutoGen(AutoGen):
                             if ModuleFile in MetaFile_cache[Arch]:\r
                                 break\r
                         else:\r
-                            ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
+                            ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.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
+                            Platform = self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, self.ToolChain]\r
                             MetaFileList = set()\r
                             for Pkey in Platform.Modules:\r
                                 MetaFileList.add(Platform.Modules[Pkey].MetaFile)\r
@@ -433,36 +470,32 @@ class WorkspaceAutoGen(AutoGen):
                                 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch)\r
                                 if ModuleFile in MetaFileList:\r
                                     continue\r
-                                ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
+                                ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.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
-            self.FdfProfile = None\r
-            if self.FdTargetList:\r
-                EdkLogger.info("No flash definition file found. FD [%s] will be ignored." % " ".join(self.FdTargetList))\r
-                self.FdTargetList = []\r
-            if self.FvTargetList:\r
-                EdkLogger.info("No flash definition file found. FV [%s] will be ignored." % " ".join(self.FvTargetList))\r
-                self.FvTargetList = []\r
-            if self.CapTargetList:\r
-                EdkLogger.info("No flash definition file found. Capsule [%s] will be ignored." % " ".join(self.CapTargetList))\r
-                self.CapTargetList = []\r
 \r
-        # apply SKU and inject PCDs from Flash Definition file\r
-        for Arch in self.ArchList:\r
-            Platform = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
-            PlatformPcds = Platform.Pcds\r
-            self._GuidDict = Platform._GuidDict\r
-            SourcePcdDict = {TAB_PCDS_DYNAMIC_EX:set(), TAB_PCDS_PATCHABLE_IN_MODULE:set(),TAB_PCDS_DYNAMIC:set(),TAB_PCDS_FIXED_AT_BUILD:set()}\r
-            BinaryPcdDict = {TAB_PCDS_DYNAMIC_EX:set(), TAB_PCDS_PATCHABLE_IN_MODULE:set()}\r
-            SourcePcdDict_Keys = SourcePcdDict.keys()\r
-            BinaryPcdDict_Keys = BinaryPcdDict.keys()\r
 \r
+    # parse FDF file to get PCDs in it, if any\r
+    def GetPcdsFromFDF(self):\r
+\r
+        if self.FdfProfile:\r
+            PcdSet = self.FdfProfile.PcdDict\r
+            # handle the mixed pcd in FDF file\r
+            for key in PcdSet:\r
+                if key in GlobalData.MixedPcd:\r
+                    Value = PcdSet[key]\r
+                    del PcdSet[key]\r
+                    for item in GlobalData.MixedPcd[key]:\r
+                        PcdSet[item] = Value\r
+            self.VerifyPcdDeclearation(PcdSet)\r
+\r
+    def ProcessPcdType(self):\r
+        for Arch in self.ArchList:\r
+            Platform = self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, self.ToolChain]\r
+            Platform.Pcds\r
             # generate the SourcePcdDict and BinaryPcdDict\r
-            PGen = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch)\r
+            PGen = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, self.ToolChain, Arch)\r
             for BuildData in list(PGen.BuildDatabase._CACHE_.values()):\r
                 if BuildData.Arch != Arch:\r
                     continue\r
@@ -485,7 +518,7 @@ class WorkspaceAutoGen(AutoGen):
                             else:\r
                                 #Pcd used in Library, Pcd Type from reference module if Pcd Type is Pending\r
                                 if BuildData.Pcds[key].Pending:\r
-                                    MGen = ModuleAutoGen(self, BuildData.MetaFile, Target, Toolchain, Arch, self.MetaFile)\r
+                                    MGen = ModuleAutoGen(self, BuildData.MetaFile, self.BuildTarget, self.ToolChain, Arch, self.MetaFile)\r
                                     if MGen and MGen.IsLibrary:\r
                                         if MGen in PGen.LibraryAutoGenList:\r
                                             ReferenceModules = MGen.ReferenceModules\r
@@ -499,6 +532,20 @@ class WorkspaceAutoGen(AutoGen):
                                                             BuildData.Pcds[key].Pending = False\r
                                                             break\r
 \r
+    def ProcessMixedPcd(self):\r
+        for Arch in self.ArchList:\r
+            SourcePcdDict = {TAB_PCDS_DYNAMIC_EX:set(), TAB_PCDS_PATCHABLE_IN_MODULE:set(),TAB_PCDS_DYNAMIC:set(),TAB_PCDS_FIXED_AT_BUILD:set()}\r
+            BinaryPcdDict = {TAB_PCDS_DYNAMIC_EX:set(), TAB_PCDS_PATCHABLE_IN_MODULE:set()}\r
+            SourcePcdDict_Keys = SourcePcdDict.keys()\r
+            BinaryPcdDict_Keys = BinaryPcdDict.keys()\r
+\r
+            # generate the SourcePcdDict and BinaryPcdDict\r
+            PGen = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, self.ToolChain, Arch)\r
+            for BuildData in list(PGen.BuildDatabase._CACHE_.values()):\r
+                if BuildData.Arch != Arch:\r
+                    continue\r
+                if BuildData.MetaFile.Ext == '.inf':\r
+                    for key in BuildData.Pcds:\r
                         if TAB_PCDS_DYNAMIC_EX in BuildData.Pcds[key].Type:\r
                             if BuildData.IsBinaryModule:\r
                                 BinaryPcdDict[TAB_PCDS_DYNAMIC_EX].add((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
@@ -516,8 +563,7 @@ class WorkspaceAutoGen(AutoGen):
                             SourcePcdDict[TAB_PCDS_DYNAMIC].add((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
                         elif TAB_PCDS_FIXED_AT_BUILD in BuildData.Pcds[key].Type:\r
                             SourcePcdDict[TAB_PCDS_FIXED_AT_BUILD].add((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
-                else:\r
-                    pass\r
+\r
             #\r
             # A PCD can only use one type for all source modules\r
             #\r
@@ -590,23 +636,34 @@ class WorkspaceAutoGen(AutoGen):
                                     break\r
                             break\r
 \r
-            # handle the mixed pcd in FDF file\r
-            for key in PcdSet:\r
-                if key in GlobalData.MixedPcd:\r
-                    Value = PcdSet[key]\r
-                    del PcdSet[key]\r
-                    for item in GlobalData.MixedPcd[key]:\r
-                        PcdSet[item] = Value\r
+    #Collect package set information from INF of FDF\r
+    @cached_property\r
+    def PkgSet(self):\r
+        if not self.FdfFile:\r
+            self.FdfFile = self.Platform.FlashDefinition\r
 \r
-            #Collect package set information from INF of FDF\r
+        if self.FdfFile:\r
+            ModuleList = self.FdfProfile.InfList\r
+        else:\r
+            ModuleList = []\r
+        Pkgs = {}\r
+        for Arch in self.ArchList:\r
+            Platform = self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, self.ToolChain]\r
+            PGen = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, self.ToolChain, Arch)\r
             PkgSet = set()\r
             for Inf in ModuleList:\r
                 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch)\r
                 if ModuleFile in Platform.Modules:\r
                     continue\r
-                ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, Toolchain]\r
+                ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.ToolChain]\r
                 PkgSet.update(ModuleData.Packages)\r
-            Pkgs = list(PkgSet) + list(PGen.PackageList)\r
+            Pkgs[Arch] = list(PkgSet) + list(PGen.PackageList)\r
+        return Pkgs\r
+\r
+    def VerifyPcdDeclearation(self,PcdSet):\r
+        for Arch in self.ArchList:\r
+            Platform = self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, self.ToolChain]\r
+            Pkgs = self.PkgSet[Arch]\r
             DecPcds = set()\r
             DecPcdsKey = set()\r
             for Pkg in Pkgs:\r
@@ -638,8 +695,10 @@ class WorkspaceAutoGen(AutoGen):
                                 File = self.FdfProfile.PcdFileLineDict[Name, Guid, Fileds][0],\r
                                 Line = self.FdfProfile.PcdFileLineDict[Name, Guid, Fileds][1]\r
                         )\r
+    def CollectAllPcds(self):\r
 \r
-            Pa = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch)\r
+        for Arch in self.ArchList:\r
+            Pa = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, self.ToolChain, Arch)\r
             #\r
             # Explicitly collect platform's dynamic PCDs\r
             #\r
@@ -647,24 +706,18 @@ class WorkspaceAutoGen(AutoGen):
             Pa.CollectFixedAtBuildPcds()\r
             self.AutoGenObjectList.append(Pa)\r
 \r
-            #\r
-            # Generate Package level hash value\r
-            #\r
+    #\r
+    # Generate Package level hash value\r
+    #\r
+    def GeneratePkgLevelHash(self):\r
+        for Arch in self.ArchList:\r
             GlobalData.gPackageHash = {}\r
             if GlobalData.gUseHashCache:\r
-                for Pkg in Pkgs:\r
+                for Pkg in self.PkgSet[Arch]:\r
                     self._GenPkgLevelHash(Pkg)\r
 \r
-        #\r
-        # Check PCDs token value conflict in each DEC file.\r
-        #\r
-        self._CheckAllPcdsTokenValueConflict()\r
-\r
-        #\r
-        # Check PCD type and definition between DSC and DEC\r
-        #\r
-        self._CheckPcdDefineAndType()\r
 \r
+    def CreateBuildOptionsFile(self):\r
         #\r
         # Create BuildOptions Macro & PCD metafile, also add the Active Platform and FDF file.\r
         #\r
@@ -683,10 +736,12 @@ class WorkspaceAutoGen(AutoGen):
             content += TAB_LINE_BREAK\r
         SaveFileOnChange(os.path.join(self.BuildDir, 'BuildOptions'), content, False)\r
 \r
+    def CreatePcdTokenNumberFile(self):\r
         #\r
         # Create PcdToken Number file for Dynamic/DynamicEx Pcd.\r
         #\r
         PcdTokenNumber = 'PcdTokenNumber: '\r
+        Pa = self.AutoGenObjectList[0]\r
         if Pa.PcdTokenNumber:\r
             if Pa.DynamicPcdList:\r
                 for Pcd in Pa.DynamicPcdList:\r
@@ -696,10 +751,11 @@ class WorkspaceAutoGen(AutoGen):
                     PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName])\r
         SaveFileOnChange(os.path.join(self.BuildDir, 'PcdTokenNumber'), PcdTokenNumber, False)\r
 \r
+    def CreateModuleHashInfo(self):\r
         #\r
         # Get set of workspace metafiles\r
         #\r
-        AllWorkSpaceMetaFiles = self._GetMetaFiles(Target, Toolchain, Arch)\r
+        AllWorkSpaceMetaFiles = self._GetMetaFiles(self.BuildTarget, self.ToolChain)\r
 \r
         #\r
         # Retrieve latest modified time of all metafiles\r
@@ -761,7 +817,7 @@ class WorkspaceAutoGen(AutoGen):
         SaveFileOnChange(HashFile, m.hexdigest(), False)\r
         GlobalData.gPackageHash[Pkg.PackageName] = m.hexdigest()\r
 \r
-    def _GetMetaFiles(self, Target, Toolchain, Arch):\r
+    def _GetMetaFiles(self, Target, Toolchain):\r
         AllWorkSpaceMetaFiles = set()\r
         #\r
         # add fdf\r