From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: redhat.com, ip: 209.85.128.43, mailfrom: philmd@redhat.com) Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) by groups.io with SMTP; Tue, 30 Jul 2019 05:38:33 -0700 Received: by mail-wm1-f43.google.com with SMTP id f17so56484429wme.2 for ; Tue, 30 Jul 2019 05:38:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=4XzmUMDjQ1DxZpWDkRojyFUmu1sOuGS/1fYE60D6lic=; b=eT6jCcMKsAFLqNffognLyLvVDJirxxT0GgwITxPYgsNx6IXFpT3yrHOGAUAyAZQnPQ PfFOPPc61adBmMt8bRLHrgyKsdK0vpJRapn9tU7FSLhGXVZ4JnnZCNU3s2qc8wWoccge vNiLhZeAQzotWd1q5OGQ3jqk2mZzX6qsghlYljGtx5oUbvHhD2teIpTZQBLDeNLLFXhp EQhTtbyGdR0p1AxNQmAs8Z68BBfehgXX1Q7x6EwO4QYK1JdH9foxn540Cqcv8uoI/nov /HZutTkc1k7dEDmIht0Cwdf4/5gz41s2IIZypZPtvYewIxISObRZ5XQLRbnBk5yctRuq kUYQ== X-Gm-Message-State: APjAAAVdMc3dw6gIfg1rykLASCtjiut/BkGNmll/N6ShBX0VjvLEFzUX Am+J+EQ/web62HCwVOOopVaCbQ== X-Google-Smtp-Source: APXvYqz1Zx/oNi8mhTNpXmmHcFHVulXOIc6MKLJ177o2BdIL0esom5VJbHtpazV7Vw0YHk781L4tYg== X-Received: by 2002:a1c:6c14:: with SMTP id h20mr938825wmc.168.1564490311595; Tue, 30 Jul 2019 05:38:31 -0700 (PDT) Return-Path: Received: from [192.168.1.38] (190.red-81-40-121.staticip.rima-tde.net. [81.40.121.190]) by smtp.gmail.com with ESMTPSA id p18sm63361306wrm.16.2019.07.30.05.38.30 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 05:38:31 -0700 (PDT) Subject: Re: [edk2-devel] [Patch 02/11] BaseTools: Split WorkspaceAutoGen._InitWorker into multiple functions To: "Feng, Bob C" , "devel@edk2.groups.io" Cc: "Gao, Liming" References: <20190729084456.18844-1-bob.c.feng@intel.com> <20190729084456.18844-3-bob.c.feng@intel.com> <08650203BA1BD64D8AD9B6D5D74A85D160B4F4CD@SHSMSX105.ccr.corp.intel.com> From: =?UTF-8?B?UGhpbGlwcGUgTWF0aGlldS1EYXVkw6k=?= Openpgp: id=89C1E78F601EE86C867495CBA2A3FD6EDEADC0DE; url=http://pgp.mit.edu/pks/lookup?op=get&search=0xA2A3FD6EDEADC0DE Message-ID: Date: Tue, 30 Jul 2019 14:38:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 MIME-Version: 1.0 In-Reply-To: <08650203BA1BD64D8AD9B6D5D74A85D160B4F4CD@SHSMSX105.ccr.corp.intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit 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:philmd@redhat.com] > Sent: Monday, July 29, 2019 11:03 PM > To: devel@edk2.groups.io; Feng, Bob C > Cc: Gao, Liming > 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 >> Signed-off-by: Bob Feng >> --- >> 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: >>