On 7/30/19 4:10 AM, Feng, Bob C wrote: > Hi Phil, > > Thanks for your comments. I agree it will be easier to review if this patch > is split into multiple smaller ones. > Since the later patches in Multiple-process autogen patch series are based on > this patch. It will be bigger effort to recreate this whole patch series. So > I'd like to prefer not to change...
The tradeoff is which will have to do the biggest effort, and how many times, 1 for the commiter or N times for the N reviewers... > I'm willing to answer the questions for this patch. > > Thanks, > Bob > > -----Original Message----- > From: Philippe Mathieu-Daudé [mailto:phi...@redhat.com] > Sent: Monday, July 29, 2019 11:03 PM > To: devel@edk2.groups.io; Feng, Bob C <bob.c.f...@intel.com> > Cc: Gao, Liming <liming....@intel.com> > Subject: Re: [edk2-devel] [Patch 02/11] BaseTools: Split > WorkspaceAutoGen._InitWorker into multiple functions > > Hi Bob, > > On 7/29/19 10:44 AM, Bob Feng wrote: >> 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. > > Patch looks good, however not trivial to review, you are refactoring 1 big > function into 13 (or 14) ones, it would be much simpler to review if you use > 1 patch per function extracted. If you mind and that is not too much effort, > that would be appreciated. If you prefer not, I'll review your patch more > carefully. > > Thanks, > > Phil. > >> >> Cc: Liming Gao <liming....@intel.com> >> Signed-off-by: Bob Feng <bob.c.f...@intel.com> >> --- >> BaseTools/Source/Python/AutoGen/AutoGen.py | 247 >> +++++++++++++-------- >> 1 file changed, 152 insertions(+), 95 deletions(-) >> >> diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py >> b/BaseTools/Source/Python/AutoGen/AutoGen.py >> index c5b3fbb0a87f..9e06bb942126 100644 >> --- a/BaseTools/Source/Python/AutoGen/AutoGen.py >> +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py >> @@ -333,13 +333,58 @@ class WorkspaceAutoGen(AutoGen): >> self._GuidDict = {} >> >> # there's many relative directory operations, so ... >> os.chdir(self.WorkspaceDir) >> >> + self.MergeArch() >> + self.ValidateBuildTarget() >> + >> + EdkLogger.info("") >> + if self.ArchList: >> + EdkLogger.info('%-16s = %s' % ("Architecture(s)", ' >> '.join(self.ArchList))) >> + EdkLogger.info('%-16s = %s' % ("Build target", self.BuildTarget)) >> + EdkLogger.info('%-16s = %s' % ("Toolchain", self.ToolChain)) >> + >> + EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.Platform)) >> + if BuildModule: >> + EdkLogger.info('%-24s = %s' % ("Active Module", >> + BuildModule)) >> + >> + if self.FdfFile: >> + EdkLogger.info('%-24s = %s' % ("Flash Image Definition", >> + self.FdfFile)) >> + >> + EdkLogger.verbose("\nFLASH_DEFINITION = %s" % self.FdfFile) >> + >> + if Progress: >> + Progress.Start("\nProcessing meta-data") >> # >> - # Merge Arch >> + # Mark now build in AutoGen Phase >> # >> + GlobalData.gAutoGenPhase = True >> + self.ProcessModuleFromPdf() >> + self.ProcessPcdType() >> + self.ProcessMixedPcd() >> + self.GetPcdsFromFDF() >> + self.CollectAllPcds() >> + self.GeneratePkgLevelHash() >> + # >> + # Check PCDs token value conflict in each DEC file. >> + # >> + self._CheckAllPcdsTokenValueConflict() >> + # >> + # Check PCD type and definition between DSC and DEC >> + # >> + self._CheckPcdDefineAndType() >> + >> + self.CreateBuildOptionsFile() >> + self.CreatePcdTokenNumberFile() >> + self.CreateModuleHashInfo() >> + GlobalData.gAutoGenPhase = False >> + >> + # >> + # Merge Arch >> + # >> + def MergeArch(self): >> if not self.ArchList: >> ArchList = set(self.Platform.SupArchList) >> else: >> ArchList = set(self.ArchList) & set(self.Platform.SupArchList) >> if not ArchList: >> @@ -349,57 +394,49 @@ class WorkspaceAutoGen(AutoGen): >> SkippedArchList = >> set(self.ArchList).symmetric_difference(set(self.Platform.SupArchList)) >> EdkLogger.verbose("\nArch [%s] is ignored because the platform >> supports [%s] only!" >> % (" ".join(SkippedArchList), " >> ".join(self.Platform.SupArchList))) >> self.ArchList = tuple(ArchList) >> >> - # Validate build target >> + # Validate build target >> + def ValidateBuildTarget(self): >> if self.BuildTarget not in self.Platform.BuildTargets: >> EdkLogger.error("build", PARAMETER_INVALID, >> ExtraData="Build target [%s] is not supported >> by the platform. [Valid target: %s]" >> % (self.BuildTarget, " >> ".join(self.Platform.BuildTargets))) >> - >> - >> - # parse FDF file to get PCDs in it, if any >> + @cached_property >> + def FdfProfile(self): >> if not self.FdfFile: >> self.FdfFile = self.Platform.FlashDefinition >> >> - EdkLogger.info("") >> - if self.ArchList: >> - EdkLogger.info('%-16s = %s' % ("Architecture(s)", ' >> '.join(self.ArchList))) >> - EdkLogger.info('%-16s = %s' % ("Build target", self.BuildTarget)) >> - EdkLogger.info('%-16s = %s' % ("Toolchain", self.ToolChain)) >> - >> - EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.Platform)) >> - if BuildModule: >> - EdkLogger.info('%-24s = %s' % ("Active Module", BuildModule)) >> - >> + FdfProfile = None >> if self.FdfFile: >> - EdkLogger.info('%-24s = %s' % ("Flash Image Definition", >> self.FdfFile)) >> - >> - EdkLogger.verbose("\nFLASH_DEFINITION = %s" % self.FdfFile) >> - >> - if Progress: >> - Progress.Start("\nProcessing meta-data") >> - >> - if self.FdfFile: >> - # >> - # Mark now build in AutoGen Phase >> - # >> - GlobalData.gAutoGenPhase = True >> Fdf = FdfParser(self.FdfFile.Path) >> Fdf.ParseFile() >> GlobalData.gFdfParser = Fdf >> - GlobalData.gAutoGenPhase = False >> - PcdSet = Fdf.Profile.PcdDict >> if Fdf.CurrentFdName and Fdf.CurrentFdName in >> Fdf.Profile.FdDict: >> FdDict = Fdf.Profile.FdDict[Fdf.CurrentFdName] >> for FdRegion in FdDict.RegionList: >> if str(FdRegion.RegionType) is 'FILE' and >> self.Platform.VpdToolGuid in str(FdRegion.RegionDataList): >> if int(FdRegion.Offset) % 8 != 0: >> EdkLogger.error("build", FORMAT_INVALID, 'The >> VPD Base Address %s must be 8-byte aligned.' % (FdRegion.Offset)) >> - ModuleList = Fdf.Profile.InfList >> - self.FdfProfile = Fdf.Profile >> + FdfProfile = Fdf.Profile >> + else: >> + if self.FdTargetList: >> + EdkLogger.info("No flash definition file found. FD [%s] >> will be ignored." % " ".join(self.FdTargetList)) >> + self.FdTargetList = [] >> + if self.FvTargetList: >> + EdkLogger.info("No flash definition file found. FV [%s] >> will be ignored." % " ".join(self.FvTargetList)) >> + self.FvTargetList = [] >> + if self.CapTargetList: >> + EdkLogger.info("No flash definition file found. Capsule >> [%s] will be ignored." % " ".join(self.CapTargetList)) >> + self.CapTargetList = [] >> + >> + return FdfProfile >> + >> + def ProcessModuleFromPdf(self): >> + >> + if self.FdfProfile: >> for fvname in self.FvTargetList: >> if fvname.upper() not in self.FdfProfile.FvDict: >> EdkLogger.error("build", OPTION_VALUE_INVALID, >> "No such an FV in FDF file: %s" % >> fvname) >> >> @@ -407,64 +444,60 @@ class WorkspaceAutoGen(AutoGen): >> # but the path (self.MetaFile.Path) is the real path >> for key in self.FdfProfile.InfDict: >> if key == 'ArchTBD': >> MetaFile_cache = defaultdict(set) >> for Arch in self.ArchList: >> - Current_Platform_cache = >> self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain] >> + Current_Platform_cache = >> + self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, >> + self.ToolChain] >> for Pkey in Current_Platform_cache.Modules: >> >> MetaFile_cache[Arch].add(Current_Platform_cache.Modules[Pkey].MetaFile) >> for Inf in self.FdfProfile.InfDict[key]: >> ModuleFile = PathClass(NormPath(Inf), >> GlobalData.gWorkspace, Arch) >> for Arch in self.ArchList: >> if ModuleFile in MetaFile_cache[Arch]: >> break >> else: >> - ModuleData = self.BuildDatabase[ModuleFile, >> Arch, Target, Toolchain] >> + ModuleData = >> + self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, >> + self.ToolChain] >> if not ModuleData.IsBinaryModule: >> EdkLogger.error('build', >> PARSER_ERROR, "Module %s NOT found in DSC file; Is it really a binary >> module?" % ModuleFile) >> >> else: >> for Arch in self.ArchList: >> if Arch == key: >> - Platform = self.BuildDatabase[self.MetaFile, >> Arch, Target, Toolchain] >> + Platform = >> + self.BuildDatabase[self.MetaFile, Arch, self.BuildTarget, >> + self.ToolChain] >> MetaFileList = set() >> for Pkey in Platform.Modules: >> >> MetaFileList.add(Platform.Modules[Pkey].MetaFile) >> for Inf in self.FdfProfile.InfDict[key]: >> ModuleFile = PathClass(NormPath(Inf), >> GlobalData.gWorkspace, Arch) >> if ModuleFile in MetaFileList: >> continue >> - ModuleData = self.BuildDatabase[ModuleFile, >> Arch, Target, Toolchain] >> + ModuleData = >> + self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, >> + self.ToolChain] >> if not ModuleData.IsBinaryModule: >> EdkLogger.error('build', >> PARSER_ERROR, "Module %s NOT found in DSC file; Is it really a binary >> module?" % ModuleFile) >> >> - else: >> - PcdSet = {} >> - ModuleList = [] >> - self.FdfProfile = None >> - if self.FdTargetList: >> - EdkLogger.info("No flash definition file found. FD [%s] >> will be ignored." % " ".join(self.FdTargetList)) >> - self.FdTargetList = [] >> - if self.FvTargetList: >> - EdkLogger.info("No flash definition file found. FV [%s] >> will be ignored." % " ".join(self.FvTargetList)) >> - self.FvTargetList = [] >> - if self.CapTargetList: >> - EdkLogger.info("No flash definition file found. Capsule >> [%s] will be ignored." % " ".join(self.CapTargetList)) >> - self.CapTargetList = [] >> - >> - # apply SKU and inject PCDs from Flash Definition file >> + >> + >> + # parse FDF file to get PCDs in it, if any >> + def GetPcdsFromFDF(self): >> + >> + if self.FdfProfile: >> + PcdSet = self.FdfProfile.PcdDict >> + # handle the mixed pcd in FDF file >> + for key in PcdSet: >> + if key in GlobalData.MixedPcd: >> + Value = PcdSet[key] >> + del PcdSet[key] >> + for item in GlobalData.MixedPcd[key]: >> + PcdSet[item] = Value >> + self.VerifyPcdDeclearation(PcdSet) >> + >> + def ProcessPcdType(self): >> for Arch in self.ArchList: >> - Platform = self.BuildDatabase[self.MetaFile, Arch, Target, >> Toolchain] >> - PlatformPcds = Platform.Pcds >> - self._GuidDict = Platform._GuidDict >> - SourcePcdDict = {TAB_PCDS_DYNAMIC_EX:set(), >> TAB_PCDS_PATCHABLE_IN_MODULE:set(),TAB_PCDS_DYNAMIC:set(),TAB_PCDS_FIXED_AT_BUILD:set()} >> - BinaryPcdDict = {TAB_PCDS_DYNAMIC_EX:set(), >> TAB_PCDS_PATCHABLE_IN_MODULE:set()} >> - SourcePcdDict_Keys = SourcePcdDict.keys() >> - BinaryPcdDict_Keys = BinaryPcdDict.keys() >> - >> + Platform = self.BuildDatabase[self.MetaFile, Arch, >> self.BuildTarget, self.ToolChain] >> + Platform.Pcds This line is odd, it seems an incorrect copy/paste. Did you mean: PlatformPcds = Platform.Pcds Instead? >> # generate the SourcePcdDict and BinaryPcdDict >> - PGen = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, >> Arch) >> + PGen = PlatformAutoGen(self, self.MetaFile, >> + self.BuildTarget, self.ToolChain, Arch) >> for BuildData in list(PGen.BuildDatabase._CACHE_.values()): >> if BuildData.Arch != Arch: >> continue >> if BuildData.MetaFile.Ext == '.inf': >> for key in BuildData.Pcds: >> @@ -483,11 +516,11 @@ class WorkspaceAutoGen(AutoGen): >> BuildData.Pcds[key].Type = >> PcdInPlatform.Type >> BuildData.Pcds[key].Pending = False >> else: >> #Pcd used in Library, Pcd Type from >> reference module if Pcd Type is Pending >> if BuildData.Pcds[key].Pending: >> - MGen = ModuleAutoGen(self, >> BuildData.MetaFile, Target, Toolchain, Arch, self.MetaFile) >> + MGen = ModuleAutoGen(self, >> + BuildData.MetaFile, self.BuildTarget, self.ToolChain, Arch, >> + self.MetaFile) >> if MGen and MGen.IsLibrary: >> if MGen in PGen.LibraryAutoGenList: >> ReferenceModules = >> MGen.ReferenceModules >> for ReferenceModule in >> ReferenceModules: >> if ReferenceModule.MetaFile >> in Platform.Modules: >> @@ -497,10 +530,24 @@ class WorkspaceAutoGen(AutoGen): >> if >> PcdInReferenceModule.Type: >> >> BuildData.Pcds[key].Type = PcdInReferenceModule.Type >> >> BuildData.Pcds[key].Pending = False >> break >> >> + def ProcessMixedPcd(self): >> + for Arch in self.ArchList: >> + SourcePcdDict = {TAB_PCDS_DYNAMIC_EX:set(), >> TAB_PCDS_PATCHABLE_IN_MODULE:set(),TAB_PCDS_DYNAMIC:set(),TAB_PCDS_FIXED_AT_BUILD:set()} >> + BinaryPcdDict = {TAB_PCDS_DYNAMIC_EX:set(), >> TAB_PCDS_PATCHABLE_IN_MODULE:set()} >> + SourcePcdDict_Keys = SourcePcdDict.keys() >> + BinaryPcdDict_Keys = BinaryPcdDict.keys() >> + >> + # generate the SourcePcdDict and BinaryPcdDict >> + PGen = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, >> self.ToolChain, Arch) >> + for BuildData in list(PGen.BuildDatabase._CACHE_.values()): >> + if BuildData.Arch != Arch: >> + continue >> + if BuildData.MetaFile.Ext == '.inf': >> + for key in BuildData.Pcds: >> if TAB_PCDS_DYNAMIC_EX in BuildData.Pcds[key].Type: >> if BuildData.IsBinaryModule: >> >> BinaryPcdDict[TAB_PCDS_DYNAMIC_EX].add((BuildData.Pcds[key].TokenCName, >> BuildData.Pcds[key].TokenSpaceGuidCName)) >> else: >> >> SourcePcdDict[TAB_PCDS_DYNAMIC_EX].add((BuildData.Pcds[key].TokenCName >> , BuildData.Pcds[key].TokenSpaceGuidCName)) >> @@ -514,12 +561,11 @@ class WorkspaceAutoGen(AutoGen): >> >> elif TAB_PCDS_DYNAMIC in BuildData.Pcds[key].Type: >> >> SourcePcdDict[TAB_PCDS_DYNAMIC].add((BuildData.Pcds[key].TokenCName, >> BuildData.Pcds[key].TokenSpaceGuidCName)) >> elif TAB_PCDS_FIXED_AT_BUILD in >> BuildData.Pcds[key].Type: >> >> SourcePcdDict[TAB_PCDS_FIXED_AT_BUILD].add((BuildData.Pcds[key].TokenCName, >> BuildData.Pcds[key].TokenSpaceGuidCName)) >> - else: >> - pass >> + >> # >> # A PCD can only use one type for all source modules >> # >> for i in SourcePcdDict_Keys: >> for j in SourcePcdDict_Keys: >> @@ -588,27 +634,38 @@ class WorkspaceAutoGen(AutoGen): >> del BuildData.Pcds[key] >> BuildData.Pcds[newkey] = Value >> break >> break >> >> - # handle the mixed pcd in FDF file >> - for key in PcdSet: >> - if key in GlobalData.MixedPcd: >> - Value = PcdSet[key] >> - del PcdSet[key] >> - for item in GlobalData.MixedPcd[key]: >> - PcdSet[item] = Value >> + #Collect package set information from INF of FDF >> + @cached_property >> + def PkgSet(self): >> + if not self.FdfFile: >> + self.FdfFile = self.Platform.FlashDefinition >> >> - #Collect package set information from INF of FDF >> + if self.FdfFile: >> + ModuleList = self.FdfProfile.InfList >> + else: >> + ModuleList = [] >> + Pkgs = {} >> + for Arch in self.ArchList: >> + Platform = self.BuildDatabase[self.MetaFile, Arch, >> self.BuildTarget, self.ToolChain] >> + PGen = PlatformAutoGen(self, self.MetaFile, >> + self.BuildTarget, self.ToolChain, Arch) >> PkgSet = set() >> for Inf in ModuleList: >> ModuleFile = PathClass(NormPath(Inf), >> GlobalData.gWorkspace, Arch) >> if ModuleFile in Platform.Modules: >> continue >> - ModuleData = self.BuildDatabase[ModuleFile, Arch, Target, >> Toolchain] >> + ModuleData = self.BuildDatabase[ModuleFile, Arch, >> + self.BuildTarget, self.ToolChain] >> PkgSet.update(ModuleData.Packages) >> - Pkgs = list(PkgSet) + list(PGen.PackageList) >> + Pkgs[Arch] = list(PkgSet) + list(PGen.PackageList) >> + return Pkgs >> + >> + def VerifyPcdDeclearation(self,PcdSet): >> + for Arch in self.ArchList: >> + Platform = self.BuildDatabase[self.MetaFile, Arch, >> self.BuildTarget, self.ToolChain] >> + Pkgs = self.PkgSet[Arch] >> DecPcds = set() >> DecPcdsKey = set() >> for Pkg in Pkgs: >> for Pcd in Pkg.Pcds: >> DecPcds.add((Pcd[0], Pcd[1])) @@ -636,37 +693,33 >> @@ class WorkspaceAutoGen(AutoGen): >> PARSER_ERROR, >> "Using Dynamic or DynamicEx type of PCD >> [%s.%s] in FDF file is not allowed." % (Guid, Name), >> File = >> self.FdfProfile.PcdFileLineDict[Name, Guid, Fileds][0], >> Line = >> self.FdfProfile.PcdFileLineDict[Name, Guid, Fileds][1] >> ) >> + def CollectAllPcds(self): >> >> - Pa = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, >> Arch) >> + for Arch in self.ArchList: >> + Pa = PlatformAutoGen(self, self.MetaFile, >> + self.BuildTarget, self.ToolChain, Arch) >> # >> # Explicitly collect platform's dynamic PCDs >> # >> Pa.CollectPlatformDynamicPcds() >> Pa.CollectFixedAtBuildPcds() >> self.AutoGenObjectList.append(Pa) >> >> - # >> - # Generate Package level hash value >> - # >> + # >> + # Generate Package level hash value >> + # >> + def GeneratePkgLevelHash(self): >> + for Arch in self.ArchList: >> GlobalData.gPackageHash = {} >> if GlobalData.gUseHashCache: >> - for Pkg in Pkgs: >> + for Pkg in self.PkgSet[Arch]: >> self._GenPkgLevelHash(Pkg) >> >> - # >> - # Check PCDs token value conflict in each DEC file. >> - # >> - self._CheckAllPcdsTokenValueConflict() >> - >> - # >> - # Check PCD type and definition between DSC and DEC >> - # >> - self._CheckPcdDefineAndType() >> >> + def CreateBuildOptionsFile(self): >> # >> # Create BuildOptions Macro & PCD metafile, also add the Active >> Platform and FDF file. >> # >> content = 'gCommandLineDefines: ' >> content += str(GlobalData.gCommandLineDefines) >> @@ -681,27 +734,31 @@ class WorkspaceAutoGen(AutoGen): >> content += 'Flash Image Definition: ' >> content += str(self.FdfFile) >> content += TAB_LINE_BREAK >> SaveFileOnChange(os.path.join(self.BuildDir, 'BuildOptions'), >> content, False) >> >> + def CreatePcdTokenNumberFile(self): >> # >> # Create PcdToken Number file for Dynamic/DynamicEx Pcd. >> # >> PcdTokenNumber = 'PcdTokenNumber: ' >> - if Pa.PcdTokenNumber: >> - if Pa.DynamicPcdList: >> - for Pcd in Pa.DynamicPcdList: >> - PcdTokenNumber += TAB_LINE_BREAK >> - PcdTokenNumber += str((Pcd.TokenCName, >> Pcd.TokenSpaceGuidCName)) >> - PcdTokenNumber += ' : ' >> - PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, >> Pcd.TokenSpaceGuidCName]) >> + for Arch in self.ArchList: >> + Pa = PlatformAutoGen(self, self.MetaFile, self.BuildTarget, >> self.ToolChain, Arch) >> + if Pa.PcdTokenNumber: >> + if Pa.DynamicPcdList: >> + for Pcd in Pa.DynamicPcdList: >> + PcdTokenNumber += TAB_LINE_BREAK >> + PcdTokenNumber += str((Pcd.TokenCName, >> Pcd.TokenSpaceGuidCName)) >> + PcdTokenNumber += ' : ' >> + PcdTokenNumber += >> + str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]) >> SaveFileOnChange(os.path.join(self.BuildDir, >> 'PcdTokenNumber'), PcdTokenNumber, False) >> >> + def CreateModuleHashInfo(self): >> # >> # Get set of workspace metafiles >> # >> - AllWorkSpaceMetaFiles = self._GetMetaFiles(Target, Toolchain, Arch) >> + AllWorkSpaceMetaFiles = self._GetMetaFiles(self.BuildTarget, >> + self.ToolChain) >> >> # >> # Retrieve latest modified time of all metafiles >> # >> SrcTimeStamp = 0 >> @@ -759,11 +816,11 @@ class WorkspaceAutoGen(AutoGen): >> f.close() >> m.update(Content) >> SaveFileOnChange(HashFile, m.hexdigest(), False) >> GlobalData.gPackageHash[Pkg.PackageName] = m.hexdigest() >> >> - def _GetMetaFiles(self, Target, Toolchain, Arch): >> + def _GetMetaFiles(self, Target, Toolchain): >> AllWorkSpaceMetaFiles = set() >> # >> # add fdf >> # >> if self.FdfFile: >> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#44619): https://edk2.groups.io/g/devel/message/44619 Mute This Topic: https://groups.io/mt/32640228/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-