# Generate AutoGen.h, AutoGen.c and *.depex files\r
#\r
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.<BR>\r
+#\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
if BuildData.Pcds[key].Pending:\r
if key in Platform.Pcds:\r
PcdInPlatform = Platform.Pcds[key]\r
- if PcdInPlatform.Type not in [None, '']:\r
+ if PcdInPlatform.Type:\r
BuildData.Pcds[key].Type = PcdInPlatform.Type\r
+ BuildData.Pcds[key].Pending = False\r
\r
if BuildData.MetaFile in Platform.Modules:\r
PlatformModule = Platform.Modules[str(BuildData.MetaFile)]\r
if key in PlatformModule.Pcds:\r
PcdInPlatform = PlatformModule.Pcds[key]\r
- if PcdInPlatform.Type not in [None, '']:\r
+ if PcdInPlatform.Type:\r
BuildData.Pcds[key].Type = PcdInPlatform.Type\r
+ BuildData.Pcds[key].Pending = False\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
+ if MGen and MGen.IsLibrary:\r
+ if MGen in PGen.LibraryAutoGenList:\r
+ ReferenceModules = MGen._ReferenceModules\r
+ for ReferenceModule in ReferenceModules:\r
+ if ReferenceModule.MetaFile in Platform.Modules:\r
+ RefPlatformModule = Platform.Modules[str(ReferenceModule.MetaFile)]\r
+ if key in RefPlatformModule.Pcds:\r
+ PcdInReferenceModule = RefPlatformModule.Pcds[key]\r
+ if PcdInReferenceModule.Type:\r
+ BuildData.Pcds[key].Type = PcdInReferenceModule.Type\r
+ BuildData.Pcds[key].Pending = False\r
+ break\r
\r
if TAB_PCDS_DYNAMIC_EX in BuildData.Pcds[key].Type:\r
if BuildData.IsBinaryModule:\r
'build',\r
FORMAT_INVALID,\r
"Building modules from source INFs, following PCD use %s and %s access method. It must be corrected to use only one access method." % (i, j),\r
- ExtraData="%s" % '\n\t'.join([str(P[1]+'.'+P[0]) for P in Intersections])\r
+ ExtraData="%s" % '\n\t'.join(str(P[1]+'.'+P[0]) for P in Intersections)\r
)\r
\r
#\r
return True\r
\r
def _GenPkgLevelHash(self, Pkg):\r
+ if Pkg.PackageName in GlobalData.gPackageHash[Pkg.Arch]:\r
+ return\r
+\r
PkgDir = os.path.join(self.BuildDir, Pkg.Arch, Pkg.PackageName)\r
CreateDirectory(PkgDir)\r
HashFile = os.path.join(PkgDir, Pkg.PackageName + '.hash')\r
m.update(Content)\r
# Get include files hash value\r
if Pkg.Includes:\r
- for inc in Pkg.Includes:\r
+ for inc in sorted(Pkg.Includes, key=lambda x: str(x)):\r
for Root, Dirs, Files in os.walk(str(inc)):\r
- for File in Files:\r
+ for File in sorted(Files):\r
File_Path = os.path.join(Root, File)\r
f = open(File_Path, 'r')\r
Content = f.read()\r
f.close()\r
m.update(Content)\r
SaveFileOnChange(HashFile, m.hexdigest(), True)\r
- if Pkg.PackageName not in GlobalData.gPackageHash[Pkg.Arch]:\r
- GlobalData.gPackageHash[Pkg.Arch][Pkg.PackageName] = m.hexdigest()\r
+ GlobalData.gPackageHash[Pkg.Arch][Pkg.PackageName] = m.hexdigest()\r
\r
def _GetMetaFiles(self, Target, Toolchain, Arch):\r
AllWorkSpaceMetaFiles = set()\r
## Return the directory to store FV files\r
def _GetFvDir(self):\r
if self._FvDir is None:\r
- self._FvDir = path.join(self.BuildDir, 'FV')\r
+ self._FvDir = path.join(self.BuildDir, TAB_FV_DIRECTORY)\r
return self._FvDir\r
\r
## Return the directory to store all intermediate and final files built\r
\r
def UpdateNVStoreMaxSize(self,OrgVpdFile):\r
if self.VariableInfo:\r
- VpdMapFilePath = os.path.join(self.BuildDir, "FV", "%s.map" % self.Platform.VpdToolGuid)\r
+ VpdMapFilePath = os.path.join(self.BuildDir, TAB_FV_DIRECTORY, "%s.map" % self.Platform.VpdToolGuid)\r
PcdNvStoreDfBuffer = [item for item in self._DynamicPcdList if item.TokenCName == "PcdNvStoreDefaultValueBuffer" and item.TokenSpaceGuidCName == "gEfiMdeModulePkgTokenSpaceGuid"]\r
\r
if PcdNvStoreDfBuffer:\r
\r
for PcdFromModule in M.ModulePcdList + M.LibraryPcdList:\r
# make sure that the "VOID*" kind of datum has MaxDatumSize set\r
- if PcdFromModule.DatumType == TAB_VOID and PcdFromModule.MaxDatumSize in [None, '']:\r
+ if PcdFromModule.DatumType == TAB_VOID and not PcdFromModule.MaxDatumSize:\r
NoDatumTypePcdList.add("%s.%s [%s]" % (PcdFromModule.TokenSpaceGuidCName, PcdFromModule.TokenCName, F))\r
\r
# Check the PCD from Binary INF or Source INF\r
ExtraData="\n\tExisted %s PCD %s in:\n\t\t%s\n"\r
% (PcdFromModule.Type, PcdFromModule.TokenCName, InfName))\r
# make sure that the "VOID*" kind of datum has MaxDatumSize set\r
- if PcdFromModule.DatumType == TAB_VOID and PcdFromModule.MaxDatumSize in [None, '']:\r
+ if PcdFromModule.DatumType == TAB_VOID and not PcdFromModule.MaxDatumSize:\r
NoDatumTypePcdList.add("%s.%s [%s]" % (PcdFromModule.TokenSpaceGuidCName, PcdFromModule.TokenCName, InfName))\r
if M.ModuleType in SUP_MODULE_SET_PEI:\r
PcdFromModule.Phase = "PEI"\r
\r
# Process VPD map file generated by third party BPDG tool\r
if NeedProcessVpdMapFile:\r
- VpdMapFilePath = os.path.join(self.BuildDir, "FV", "%s.map" % self.Platform.VpdToolGuid)\r
+ VpdMapFilePath = os.path.join(self.BuildDir, TAB_FV_DIRECTORY, "%s.map" % self.Platform.VpdToolGuid)\r
if os.path.exists(VpdMapFilePath):\r
VpdFile.Read(VpdMapFilePath)\r
\r
self.AllPcdList = self._NonDynamicPcdList + self._DynamicPcdList\r
\r
def FixVpdOffset(self,VpdFile ):\r
- FvPath = os.path.join(self.BuildDir, "FV")\r
+ FvPath = os.path.join(self.BuildDir, TAB_FV_DIRECTORY)\r
if not os.path.exists(FvPath):\r
try:\r
os.makedirs(FvPath)\r
# retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
BPDGToolName = None\r
for ToolDef in self.ToolDefinition.values():\r
- if ToolDef.has_key("GUID") and ToolDef["GUID"] == self.Platform.VpdToolGuid:\r
+ if ToolDef.has_key(TAB_GUID) and ToolDef[TAB_GUID] == self.Platform.VpdToolGuid:\r
if not ToolDef.has_key("PATH"):\r
EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "PATH attribute was not provided for BPDG guid tool %s in tools_def.txt" % self.Platform.VpdToolGuid)\r
BPDGToolName = ToolDef["PATH"]\r
BuildRuleFile = None\r
if TAB_TAT_DEFINES_BUILD_RULE_CONF in self.Workspace.TargetTxt.TargetTxtDictionary:\r
BuildRuleFile = self.Workspace.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
- if BuildRuleFile in [None, '']:\r
+ if not BuildRuleFile:\r
BuildRuleFile = gDefaultBuildRuleFile\r
self._BuildRule = BuildRule(BuildRuleFile)\r
if self._BuildRule._FileVersion == "":\r
#\r
for Item in LibraryList:\r
if ConsumedByList[Item] != [] and Item in Constructor and len(Constructor) > 1:\r
- ErrorMessage = "\tconsumed by " + "\n\tconsumed by ".join([str(L) for L in ConsumedByList[Item]])\r
+ ErrorMessage = "\tconsumed by " + "\n\tconsumed by ".join(str(L) for L in ConsumedByList[Item])\r
EdkLogger.error("build", BUILD_ERROR, 'Library [%s] with constructors has a cycle' % str(Item),\r
ExtraData=ErrorMessage, File=self.MetaFile)\r
if Item not in SortedLibraryList:\r
# @param ToPcd The PCD to be overrided\r
# @param FromPcd The PCD overrideing from\r
#\r
- def _OverridePcd(self, ToPcd, FromPcd, Module=""):\r
+ def _OverridePcd(self, ToPcd, FromPcd, Module="", Msg="", Library=""):\r
#\r
# in case there's PCDs coming from FDF file, which have no type given.\r
# at this point, ToPcd.Type has the type found from dependent\r
TokenCName = PcdItem[0]\r
break\r
if FromPcd is not None:\r
- if ToPcd.Pending and FromPcd.Type not in [None, '']:\r
+ if ToPcd.Pending and FromPcd.Type:\r
ToPcd.Type = FromPcd.Type\r
- elif (ToPcd.Type not in [None, '']) and (FromPcd.Type not in [None, ''])\\r
+ elif (ToPcd.Type) and (FromPcd.Type)\\r
and (ToPcd.Type != FromPcd.Type) and (ToPcd.Type in FromPcd.Type):\r
if ToPcd.Type.strip() == TAB_PCDS_DYNAMIC_EX:\r
ToPcd.Type = FromPcd.Type\r
- elif ToPcd.Type not in [None, ''] and FromPcd.Type not in [None, ''] \\r
+ elif ToPcd.Type and FromPcd.Type \\r
and ToPcd.Type != FromPcd.Type:\r
+ if Library:\r
+ Module = str(Module) + " 's library file (" + str(Library) + ")"\r
EdkLogger.error("build", OPTION_CONFLICT, "Mismatched PCD type",\r
- ExtraData="%s.%s is defined as [%s] in module %s, but as [%s] in platform."\\r
+ ExtraData="%s.%s is used as [%s] in module %s, but as [%s] in %s."\\r
% (ToPcd.TokenSpaceGuidCName, TokenCName,\r
- ToPcd.Type, Module, FromPcd.Type),\r
+ ToPcd.Type, Module, FromPcd.Type, Msg),\r
File=self.MetaFile)\r
\r
if FromPcd.MaxDatumSize:\r
ToPcd.validlists = FromPcd.validlists\r
ToPcd.expressions = FromPcd.expressions\r
\r
- if FromPcd is not None and ToPcd.DatumType == TAB_VOID and ToPcd.MaxDatumSize in ['', None]:\r
+ if FromPcd is not None and ToPcd.DatumType == TAB_VOID and not ToPcd.MaxDatumSize:\r
EdkLogger.debug(EdkLogger.DEBUG_9, "No MaxDatumSize specified for PCD %s.%s" \\r
% (ToPcd.TokenSpaceGuidCName, TokenCName))\r
Value = ToPcd.DefaultValue\r
- if Value in [None, '']:\r
+ if not Value:\r
ToPcd.MaxDatumSize = '1'\r
elif Value[0] == 'L':\r
ToPcd.MaxDatumSize = str((len(Value) - 2) * 2)\r
\r
# apply default SKU for dynamic PCDS if specified one is not available\r
if (ToPcd.Type in PCD_DYNAMIC_TYPE_SET or ToPcd.Type in PCD_DYNAMIC_EX_TYPE_SET) \\r
- and ToPcd.SkuInfoList in [None, {}, '']:\r
+ and not ToPcd.SkuInfoList:\r
if self.Platform.SkuName in self.Platform.SkuIds:\r
SkuName = self.Platform.SkuName\r
else:\r
#\r
# @retval PCD_list The list PCDs with settings from platform\r
#\r
- def ApplyPcdSetting(self, Module, Pcds):\r
+ def ApplyPcdSetting(self, Module, Pcds, Library=""):\r
# for each PCD in module\r
for Name, Guid in Pcds:\r
PcdInModule = Pcds[Name, Guid]\r
else:\r
PcdInPlatform = None\r
# then override the settings if any\r
- self._OverridePcd(PcdInModule, PcdInPlatform, Module)\r
+ self._OverridePcd(PcdInModule, PcdInPlatform, Module, Msg="DSC PCD sections", Library=Library)\r
# resolve the VariableGuid value\r
for SkuId in PcdInModule.SkuInfoList:\r
Sku = PcdInModule.SkuInfoList[SkuId]\r
if Sku.VariableGuid == '': continue\r
Sku.VariableGuidValue = GuidValue(Sku.VariableGuid, self.PackageList, self.MetaFile.Path)\r
if Sku.VariableGuidValue is None:\r
- PackageList = "\n\t".join([str(P) for P in self.PackageList])\r
+ PackageList = "\n\t".join(str(P) for P in self.PackageList)\r
EdkLogger.error(\r
'build',\r
RESOURCE_NOT_AVAILABLE,\r
Flag = True\r
break\r
if Flag:\r
- self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], Module)\r
+ self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], Module, Msg="DSC Components Module scoped PCD section", Library=Library)\r
# use PCD value to calculate the MaxDatumSize when it is not specified\r
for Name, Guid in Pcds:\r
Pcd = Pcds[Name, Guid]\r
- if Pcd.DatumType == TAB_VOID and Pcd.MaxDatumSize in ['', None]:\r
+ if Pcd.DatumType == TAB_VOID and not Pcd.MaxDatumSize:\r
Pcd.MaxSizeUserSet = None\r
Value = Pcd.DefaultValue\r
- if Value in [None, '']:\r
+ if not Value:\r
Pcd.MaxDatumSize = '1'\r
elif Value[0] == 'L':\r
Pcd.MaxDatumSize = str((len(Value) - 2) * 2)\r
def _GetFfsOutputDir(self):\r
if self._FfsOutputDir is None:\r
if GlobalData.gFdfParser is not None:\r
- self._FfsOutputDir = path.join(self.PlatformInfo.BuildDir, "FV", "Ffs", self.Guid + self.Name)\r
+ self._FfsOutputDir = path.join(self.PlatformInfo.BuildDir, TAB_FV_DIRECTORY, "Ffs", self.Guid + self.Name)\r
else:\r
self._FfsOutputDir = ''\r
return self._FfsOutputDir\r
for Depex in DepexList:\r
for key in Depex:\r
DepexStr += '[Depex.%s.%s]\n' % key\r
- DepexStr += '\n'.join(['# '+ val for val in Depex[key]])\r
+ DepexStr += '\n'.join('# '+ val for val in Depex[key])\r
DepexStr += '\n\n'\r
if not DepexStr:\r
return '[Depex.%s]\n' % self.Arch\r
DepexStr += ' AND '\r
DepexStr += '('\r
for D in Depex.values():\r
- DepexStr += ' '.join([val for val in D])\r
+ DepexStr += ' '.join(val for val in D)\r
Index = DepexStr.find('END')\r
if Index > -1 and Index == len(DepexStr) - 3:\r
DepexStr = DepexStr[:-3]\r
Pcds = OrderedDict()\r
if not self.IsLibrary:\r
# get PCDs from dependent libraries\r
+ self._LibraryPcdList = []\r
for Library in self.DependentLibraryList:\r
+ PcdsInLibrary = OrderedDict()\r
self.UpdateComments(self._PcdComments, Library.PcdComments)\r
for Key in Library.Pcds:\r
# skip duplicated PCDs\r
if Key in self.Module.Pcds or Key in Pcds:\r
continue\r
Pcds[Key] = copy.copy(Library.Pcds[Key])\r
- # apply PCD settings from platform\r
- self._LibraryPcdList = self.PlatformInfo.ApplyPcdSetting(self.Module, Pcds)\r
+ PcdsInLibrary[Key] = Pcds[Key]\r
+ self._LibraryPcdList.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, PcdsInLibrary, Library=Library))\r
else:\r
self._LibraryPcdList = []\r
return self._LibraryPcdList\r
m.update(GlobalData.gPlatformHash)\r
# Add Package level hash\r
if self.DependentPackageList:\r
- for Pkg in self.DependentPackageList:\r
+ for Pkg in sorted(self.DependentPackageList, key=lambda x: x.PackageName):\r
if Pkg.PackageName in GlobalData.gPackageHash[self.Arch]:\r
m.update(GlobalData.gPackageHash[self.Arch][Pkg.PackageName])\r
\r
# Add Library hash\r
if self.LibraryAutoGenList:\r
- for Lib in self.LibraryAutoGenList:\r
+ for Lib in sorted(self.LibraryAutoGenList, key=lambda x: x.Name):\r
if Lib.Name not in GlobalData.gModuleHash[self.Arch]:\r
Lib.GenModuleHash()\r
m.update(GlobalData.gModuleHash[self.Arch][Lib.Name])\r
m.update(Content)\r
# Add Module's source files\r
if self.SourceFileList:\r
- for File in self.SourceFileList:\r
+ for File in sorted(self.SourceFileList, key=lambda x: str(x)):\r
f = open(str(File), 'r')\r
Content = f.read()\r
f.close()\r