# 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
% (" ".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
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
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
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
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
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
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
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
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
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
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
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
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