# 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
from Common.BuildToolError import *\r
from Common.DataType import *\r
from Common.Misc import *\r
-from Common.String import *\r
+from Common.StringUtils import *\r
import Common.GlobalData as GlobalData\r
from GenFds.FdfParser import *\r
from CommonDataClass.CommonClass import SkuInfoClass\r
import Common.VpdInfoFile as VpdInfoFile\r
from GenPcdDb import CreatePcdDatabaseCode\r
from Workspace.MetaFileCommentParser import UsageList\r
+from Workspace.WorkspaceCommon import GetModuleLibInstances\r
from Common.MultipleWorkspace import MultipleWorkspace as mws\r
import InfSectionParser\r
import datetime\r
from GenVar import VariableMgr,var_info\r
from collections import OrderedDict\r
from collections import defaultdict\r
+from Workspace.WorkspaceCommon import OrderedListDict\r
\r
## Regular expression for splitting Dependency Expression string into tokens\r
gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)")\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='\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
#\r
if self.FdfFile:\r
AllWorkSpaceMetaFiles.add (self.FdfFile.Path)\r
- if self.FdfFile:\r
- FdfFiles = GlobalData.gFdfParser.GetAllIncludedFile()\r
- for f in FdfFiles:\r
- AllWorkSpaceMetaFiles.add (f.FileName)\r
+ for f in GlobalData.gFdfParser.GetAllIncludedFile():\r
+ AllWorkSpaceMetaFiles.add (f.FileName)\r
#\r
# add dsc\r
#\r
AllWorkSpaceMetaFiles.add(os.path.join(self.BuildDir, 'PcdTokenNumber'))\r
\r
for Arch in self.ArchList:\r
- Platform = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
- PGen = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch)\r
-\r
#\r
# add dec\r
#\r
- for Package in PGen.PackageList:\r
+ for Package in PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch).PackageList:\r
AllWorkSpaceMetaFiles.add(Package.MetaFile.Path)\r
\r
#\r
# add included dsc\r
#\r
- for filePath in Platform._RawData.IncludedFiles:\r
+ for filePath in self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]._RawData.IncludedFiles:\r
AllWorkSpaceMetaFiles.add(filePath.Path)\r
\r
return AllWorkSpaceMetaFiles\r
\r
\r
def _CheckPcdDefineAndType(self):\r
- PcdTypeList = [\r
- TAB_PCDS_FIXED_AT_BUILD, TAB_PCDS_PATCHABLE_IN_MODULE, TAB_PCDS_FEATURE_FLAG,\r
- TAB_PCDS_DYNAMIC, #TAB_PCDS_DYNAMIC_HII, TAB_PCDS_DYNAMIC_VPD,\r
- TAB_PCDS_DYNAMIC_EX, # TAB_PCDS_DYNAMIC_EX_HII, TAB_PCDS_DYNAMIC_EX_VPD\r
- ]\r
+ PcdTypeSet = {TAB_PCDS_FIXED_AT_BUILD,\r
+ TAB_PCDS_PATCHABLE_IN_MODULE,\r
+ TAB_PCDS_FEATURE_FLAG,\r
+ TAB_PCDS_DYNAMIC,\r
+ TAB_PCDS_DYNAMIC_EX}\r
\r
# This dict store PCDs which are not used by any modules with specified arches\r
UnusedPcd = OrderedDict()\r
# Key of DEC's Pcds dictionary is PcdCName, TokenSpaceGuid, PcdType\r
if (Pcd[0], Pcd[1], PcdType) in Package.Pcds:\r
break\r
- for Type in PcdTypeList:\r
+ for Type in PcdTypeSet:\r
if (Pcd[0], Pcd[1], Type) in Package.Pcds:\r
EdkLogger.error(\r
'build',\r
# modules will be created as well\r
#\r
def CreateMakeFile(self, CreateDepsMakeFile=False):\r
- if CreateDepsMakeFile:\r
- for Pa in self.AutoGenObjectList:\r
- Pa.CreateMakeFile(CreateDepsMakeFile)\r
+ if not CreateDepsMakeFile:\r
+ return\r
+ for Pa in self.AutoGenObjectList:\r
+ Pa.CreateMakeFile(True)\r
\r
## Create autogen code for platform and modules\r
#\r
if not CreateDepsCodeFile:\r
return\r
for Pa in self.AutoGenObjectList:\r
- Pa.CreateCodeFile(CreateDepsCodeFile)\r
+ Pa.CreateCodeFile(True)\r
\r
## Create AsBuilt INF file the platform\r
#\r
del self.Platform.Pcds[key]\r
self.Platform.Pcds[newkey] = Value\r
break\r
- else:\r
- pass\r
break\r
- else:\r
- pass\r
\r
# for gathering error information\r
NoDatumTypePcdList = set()\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
PcdNvStoreDfBuffer.SkuInfoList[skuname].DefaultValue = vardump\r
PcdNvStoreDfBuffer.MaxDatumSize = str(len(vardump.split(",")))\r
\r
- PlatformPcds = self._PlatformPcds.keys()\r
- PlatformPcds.sort()\r
+ PlatformPcds = sorted(self._PlatformPcds.keys())\r
#\r
# Add VPD type PCD into VpdFile and determine whether the VPD PCD need to be fixed up.\r
#\r
if Flags.startswith('='):\r
self._BuildCommand = [self._BuildCommand[0]] + [Flags[1:]]\r
else:\r
- self._BuildCommand += [Flags]\r
+ self._BuildCommand.append(Flags)\r
return self._BuildCommand\r
\r
## Get tool chain definition\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
# TokeNumber 11 ~ 20\r
#\r
for Pcd in self.DynamicPcdList:\r
- if Pcd.Phase == "PEI":\r
- if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
- EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
- self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
- TokenNumber += 1\r
+ if Pcd.Phase == "PEI" and Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
+ EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+ self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+ TokenNumber += 1\r
\r
for Pcd in self.DynamicPcdList:\r
- if Pcd.Phase == "PEI":\r
- if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
- EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
- self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
- TokenNumber += 1\r
+ if Pcd.Phase == "PEI" and Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+ EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+ self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+ TokenNumber += 1\r
\r
for Pcd in self.DynamicPcdList:\r
- if Pcd.Phase == "DXE":\r
- if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
- EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
- self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
- TokenNumber += 1\r
+ if Pcd.Phase == "DXE" and Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
+ EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+ self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+ TokenNumber += 1\r
\r
for Pcd in self.DynamicPcdList:\r
- if Pcd.Phase == "DXE":\r
- if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
- EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
- self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
- TokenNumber += 1\r
+ if Pcd.Phase == "DXE" and Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+ EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+ self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+ TokenNumber += 1\r
\r
for Pcd in self.NonDynamicPcdList:\r
self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
if str(Module) not in self.Platform.Modules:\r
return []\r
\r
- ModuleType = Module.ModuleType\r
-\r
- # for overridding library instances with module specific setting\r
- PlatformModule = self.Platform.Modules[str(Module)]\r
-\r
- # add forced library instances (specified under LibraryClasses sections)\r
- #\r
- # If a module has a MODULE_TYPE of USER_DEFINED,\r
- # do not link in NULL library class instances from the global [LibraryClasses.*] sections.\r
- #\r
- if Module.ModuleType != SUP_MODULE_USER_DEFINED:\r
- for LibraryClass in self.Platform.LibraryClasses.GetKeys():\r
- if LibraryClass.startswith("NULL") and self.Platform.LibraryClasses[LibraryClass, Module.ModuleType]:\r
- Module.LibraryClasses[LibraryClass] = self.Platform.LibraryClasses[LibraryClass, Module.ModuleType]\r
-\r
- # add forced library instances (specified in module overrides)\r
- for LibraryClass in PlatformModule.LibraryClasses:\r
- if LibraryClass.startswith("NULL"):\r
- Module.LibraryClasses[LibraryClass] = PlatformModule.LibraryClasses[LibraryClass]\r
-\r
- # EdkII module\r
- LibraryConsumerList = [Module]\r
- Constructor = []\r
- ConsumedByList = OrderedDict()\r
- LibraryInstance = OrderedDict()\r
-\r
- EdkLogger.verbose("")\r
- EdkLogger.verbose("Library instances of module [%s] [%s]:" % (str(Module), self.Arch))\r
- while len(LibraryConsumerList) > 0:\r
- M = LibraryConsumerList.pop()\r
- for LibraryClassName in M.LibraryClasses:\r
- if LibraryClassName not in LibraryInstance:\r
- # override library instance for this module\r
- if LibraryClassName in PlatformModule.LibraryClasses:\r
- LibraryPath = PlatformModule.LibraryClasses[LibraryClassName]\r
- else:\r
- LibraryPath = self.Platform.LibraryClasses[LibraryClassName, ModuleType]\r
- if LibraryPath is None or LibraryPath == "":\r
- LibraryPath = M.LibraryClasses[LibraryClassName]\r
- if LibraryPath is None or LibraryPath == "":\r
- EdkLogger.error("build", RESOURCE_NOT_AVAILABLE,\r
- "Instance of library class [%s] is not found" % LibraryClassName,\r
- File=self.MetaFile,\r
- ExtraData="in [%s] [%s]\n\tconsumed by module [%s]" % (str(M), self.Arch, str(Module)))\r
-\r
- LibraryModule = self.BuildDatabase[LibraryPath, self.Arch, self.BuildTarget, self.ToolChain]\r
- # for those forced library instance (NULL library), add a fake library class\r
- if LibraryClassName.startswith("NULL"):\r
- LibraryModule.LibraryClass.append(LibraryClassObject(LibraryClassName, [ModuleType]))\r
- elif LibraryModule.LibraryClass is None \\r
- or len(LibraryModule.LibraryClass) == 0 \\r
- or (ModuleType != SUP_MODULE_USER_DEFINED\r
- and ModuleType not in LibraryModule.LibraryClass[0].SupModList):\r
- # only USER_DEFINED can link against any library instance despite of its SupModList\r
- EdkLogger.error("build", OPTION_MISSING,\r
- "Module type [%s] is not supported by library instance [%s]" \\r
- % (ModuleType, LibraryPath), File=self.MetaFile,\r
- ExtraData="consumed by [%s]" % str(Module))\r
-\r
- LibraryInstance[LibraryClassName] = LibraryModule\r
- LibraryConsumerList.append(LibraryModule)\r
- EdkLogger.verbose("\t" + str(LibraryClassName) + " : " + str(LibraryModule))\r
- else:\r
- LibraryModule = LibraryInstance[LibraryClassName]\r
-\r
- if LibraryModule is None:\r
- continue\r
-\r
- if LibraryModule.ConstructorList != [] and LibraryModule not in Constructor:\r
- Constructor.append(LibraryModule)\r
-\r
- if LibraryModule not in ConsumedByList:\r
- ConsumedByList[LibraryModule] = []\r
- # don't add current module itself to consumer list\r
- if M != Module:\r
- if M in ConsumedByList[LibraryModule]:\r
- continue\r
- ConsumedByList[LibraryModule].append(M)\r
- #\r
- # Initialize the sorted output list to the empty set\r
- #\r
- SortedLibraryList = []\r
- #\r
- # Q <- Set of all nodes with no incoming edges\r
- #\r
- LibraryList = [] #LibraryInstance.values()\r
- Q = []\r
- for LibraryClassName in LibraryInstance:\r
- M = LibraryInstance[LibraryClassName]\r
- LibraryList.append(M)\r
- if ConsumedByList[M] == []:\r
- Q.append(M)\r
-\r
- #\r
- # start the DAG algorithm\r
- #\r
- while True:\r
- EdgeRemoved = True\r
- while Q == [] and EdgeRemoved:\r
- EdgeRemoved = False\r
- # for each node Item with a Constructor\r
- for Item in LibraryList:\r
- if Item not in Constructor:\r
- continue\r
- # for each Node without a constructor with an edge e from Item to Node\r
- for Node in ConsumedByList[Item]:\r
- if Node in Constructor:\r
- continue\r
- # remove edge e from the graph if Node has no constructor\r
- ConsumedByList[Item].remove(Node)\r
- EdgeRemoved = True\r
- if ConsumedByList[Item] == []:\r
- # insert Item into Q\r
- Q.insert(0, Item)\r
- break\r
- if Q != []:\r
- break\r
- # DAG is done if there's no more incoming edge for all nodes\r
- if Q == []:\r
- break\r
-\r
- # remove node from Q\r
- Node = Q.pop()\r
- # output Node\r
- SortedLibraryList.append(Node)\r
-\r
- # for each node Item with an edge e from Node to Item do\r
- for Item in LibraryList:\r
- if Node not in ConsumedByList[Item]:\r
- continue\r
- # remove edge e from the graph\r
- ConsumedByList[Item].remove(Node)\r
-\r
- if ConsumedByList[Item] != []:\r
- continue\r
- # insert Item into Q, if Item has no other incoming edges\r
- Q.insert(0, Item)\r
-\r
- #\r
- # if any remaining node Item in the graph has a constructor and an incoming edge, then the graph has a cycle\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
- 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
- SortedLibraryList.append(Item)\r
-\r
- #\r
- # Build the list of constructor and destructir names\r
- # The DAG Topo sort produces the destructor order, so the list of constructors must generated in the reverse order\r
- #\r
- SortedLibraryList.reverse()\r
- return SortedLibraryList\r
-\r
+ return GetModuleLibInstances(Module,\r
+ self.Platform,\r
+ self.BuildDatabase,\r
+ self.Arch,\r
+ self.BuildTarget,\r
+ self.ToolChain,\r
+ self.MetaFile,\r
+ EdkLogger)\r
\r
## Override PCD setting (type, value, ...)\r
#\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
- and (ToPcd.Type != FromPcd.Type) and (ToPcd.Type in FromPcd.Type):\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
if (Key[0] == self.BuildRuleFamily and\r
(ModuleStyle is None or len(Key) < 3 or (len(Key) > 2 and Key[2] == ModuleStyle))):\r
Target, ToolChain, Arch, CommandType, Attr = Key[1].split('_')\r
- if Target == self.BuildTarget or Target == "*":\r
- if ToolChain == self.ToolChain or ToolChain == "*":\r
- if Arch == self.Arch or Arch == "*":\r
- if Options[Key].startswith("="):\r
- if OverrideList.get(Key[1]) is not None:\r
- OverrideList.pop(Key[1])\r
- OverrideList[Key[1]] = Options[Key]\r
+ if (Target == self.BuildTarget or Target == "*") and\\r
+ (ToolChain == self.ToolChain or ToolChain == "*") and\\r
+ (Arch == self.Arch or Arch == "*") and\\r
+ Options[Key].startswith("="):\r
+\r
+ if OverrideList.get(Key[1]) is not None:\r
+ OverrideList.pop(Key[1])\r
+ OverrideList[Key[1]] = Options[Key]\r
\r
#\r
# Use the highest priority value. \r
# Compare two Key, if one is included by another, choose the higher priority one\r
# \r
Target2, ToolChain2, Arch2, CommandType2, Attr2 = NextKey.split("_")\r
- if Target1 == Target2 or Target1 == "*" or Target2 == "*":\r
- if ToolChain1 == ToolChain2 or ToolChain1 == "*" or ToolChain2 == "*":\r
- if Arch1 == Arch2 or Arch1 == "*" or Arch2 == "*":\r
- if CommandType1 == CommandType2 or CommandType1 == "*" or CommandType2 == "*":\r
- if Attr1 == Attr2 or Attr1 == "*" or Attr2 == "*":\r
- if self.CalculatePriorityValue(NowKey) > self.CalculatePriorityValue(NextKey):\r
- if Options.get((self.BuildRuleFamily, NextKey)) is not None:\r
- Options.pop((self.BuildRuleFamily, NextKey))\r
- else:\r
- if Options.get((self.BuildRuleFamily, NowKey)) is not None:\r
- Options.pop((self.BuildRuleFamily, NowKey))\r
+ if (Target1 == Target2 or Target1 == "*" or Target2 == "*") and\\r
+ (ToolChain1 == ToolChain2 or ToolChain1 == "*" or ToolChain2 == "*") and\\r
+ (Arch1 == Arch2 or Arch1 == "*" or Arch2 == "*") and\\r
+ (CommandType1 == CommandType2 or CommandType1 == "*" or CommandType2 == "*") and\\r
+ (Attr1 == Attr2 or Attr1 == "*" or Attr2 == "*"):\r
+\r
+ if self.CalculatePriorityValue(NowKey) > self.CalculatePriorityValue(NextKey):\r
+ if Options.get((self.BuildRuleFamily, NextKey)) is not None:\r
+ Options.pop((self.BuildRuleFamily, NextKey))\r
+ else:\r
+ if Options.get((self.BuildRuleFamily, NowKey)) is not None:\r
+ Options.pop((self.BuildRuleFamily, NowKey))\r
\r
for Key in Options:\r
if ModuleStyle is not None and len (Key) > 2:\r
LibraryAutoGenList = property(_GetLibraryAutoGenList)\r
GenFdsCommand = property(_GenFdsCommand)\r
\r
+#\r
+# extend lists contained in a dictionary with lists stored in another dictionary\r
+# if CopyToDict is not derived from DefaultDict(list) then this may raise exception\r
+#\r
+def ExtendCopyDictionaryLists(CopyToDict, CopyFromDict):\r
+ for Key in CopyFromDict:\r
+ CopyToDict[Key].extend(CopyFromDict[Key])\r
+\r
+\r
## ModuleAutoGen class\r
#\r
# This class encapsules the AutoGen behaviors for the build tools. In addition to\r
self._MakeFileDir = None\r
\r
self._IncludePathList = None\r
- self._IncludePathLength = 0\r
self._AutoGenFileList = None\r
self._UnicodeFileList = None\r
self._VfrFileList = None\r
self._DerivedPackageList = None\r
self._ModulePcdList = None\r
self._LibraryPcdList = None\r
- self._PcdComments = OrderedDict()\r
+ self._PcdComments = OrderedListDict()\r
self._GuidList = None\r
self._GuidsUsedByPcd = None\r
- self._GuidComments = OrderedDict()\r
+ self._GuidComments = OrderedListDict()\r
self._ProtocolList = None\r
- self._ProtocolComments = OrderedDict()\r
+ self._ProtocolComments = OrderedListDict()\r
self._PpiList = None\r
- self._PpiComments = OrderedDict()\r
- self._DepexList = None\r
- self._DepexExpressionList = None\r
+ self._PpiComments = OrderedListDict()\r
+ self._DepexDict = None\r
+ self._DepexExpressionDict = None\r
self._BuildOption = None\r
self._BuildOptionIncPathList = None\r
self._BuildTargets = None\r
# \r
self._FixedAtBuildPcds = []\r
self.ConstPcd = {}\r
- return True\r
\r
def __repr__(self):\r
return "%s [%s]" % (self.MetaFile, self.Arch)\r
## Check if the module is library or not\r
def _IsLibrary(self):\r
if self._LibraryFlag is None:\r
- if self.Module.LibraryClass is not None and self.Module.LibraryClass != []:\r
- self._LibraryFlag = True\r
- else:\r
- self._LibraryFlag = False\r
+ self._LibraryFlag = True if self.Module.LibraryClass else False\r
return self._LibraryFlag\r
\r
## Check if the module is binary module or not\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
# @retval list The token list of the dependency expression after parsed\r
#\r
def _GetDepexTokenList(self):\r
- if self._DepexList is None:\r
- self._DepexList = {}\r
+ if self._DepexDict is None:\r
+ self._DepexDict = {}\r
if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:\r
- return self._DepexList\r
+ return self._DepexDict\r
\r
- self._DepexList[self.ModuleType] = []\r
+ self._DepexDict[self.ModuleType] = []\r
\r
- for ModuleType in self._DepexList:\r
- DepexList = self._DepexList[ModuleType]\r
+ for ModuleType in self._DepexDict:\r
+ DepexList = self._DepexDict[ModuleType]\r
#\r
# Append depex from dependent libraries, if not "BEFORE", "AFTER" expresion\r
#\r
break\r
if len(DepexList) > 0:\r
EdkLogger.verbose('')\r
- return self._DepexList\r
+ return self._DepexDict\r
\r
## Merge dependency expression\r
#\r
# @retval list The token list of the dependency expression after parsed\r
#\r
def _GetDepexExpressionTokenList(self):\r
- if self._DepexExpressionList is None:\r
- self._DepexExpressionList = {}\r
+ if self._DepexExpressionDict is None:\r
+ self._DepexExpressionDict = {}\r
if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:\r
- return self._DepexExpressionList\r
+ return self._DepexExpressionDict\r
\r
- self._DepexExpressionList[self.ModuleType] = ''\r
+ self._DepexExpressionDict[self.ModuleType] = ''\r
\r
- for ModuleType in self._DepexExpressionList:\r
- DepexExpressionList = self._DepexExpressionList[ModuleType]\r
+ for ModuleType in self._DepexExpressionDict:\r
+ DepexExpressionString = self._DepexExpressionDict[ModuleType]\r
#\r
# Append depex from dependent libraries, if not "BEFORE", "AFTER" expresion\r
#\r
for M in [self.Module] + self.DependentLibraryList:\r
Inherited = False\r
for D in M.DepexExpression[self.Arch, ModuleType]:\r
- if DepexExpressionList != '':\r
- DepexExpressionList += ' AND '\r
- DepexExpressionList += '('\r
- DepexExpressionList += D\r
- DepexExpressionList = DepexExpressionList.rstrip('END').strip()\r
- DepexExpressionList += ')'\r
+ if DepexExpressionString != '':\r
+ DepexExpressionString += ' AND '\r
+ DepexExpressionString += '('\r
+ DepexExpressionString += D\r
+ DepexExpressionString = DepexExpressionString.rstrip('END').strip()\r
+ DepexExpressionString += ')'\r
Inherited = True\r
if Inherited:\r
- EdkLogger.verbose("DEPEX[%s] (+%s) = %s" % (self.Name, M.BaseName, DepexExpressionList))\r
- if 'BEFORE' in DepexExpressionList or 'AFTER' in DepexExpressionList:\r
+ EdkLogger.verbose("DEPEX[%s] (+%s) = %s" % (self.Name, M.BaseName, DepexExpressionString))\r
+ if 'BEFORE' in DepexExpressionString or 'AFTER' in DepexExpressionString:\r
break\r
- if len(DepexExpressionList) > 0:\r
+ if len(DepexExpressionString) > 0:\r
EdkLogger.verbose('')\r
- self._DepexExpressionList[ModuleType] = DepexExpressionList\r
- return self._DepexExpressionList\r
+ self._DepexExpressionDict[ModuleType] = DepexExpressionString\r
+ return self._DepexExpressionDict\r
\r
# Get the tiano core user extension, it is contain dependent library.\r
# @retval: a list contain tiano core userextension.\r
\r
BuildOptionIncPathList = []\r
for Tool in ('CC', 'PP', 'VFRPP', 'ASLPP', 'ASLCC', 'APP', 'ASM'):\r
- Attr = 'FLAGS'\r
try:\r
- FlagOption = self.BuildOption[Tool][Attr]\r
+ FlagOption = self.BuildOption[Tool]['FLAGS']\r
except KeyError:\r
FlagOption = ''\r
\r
IncPathList = []\r
for Path in BuildOptIncludeRegEx.findall(FlagOption):\r
PathList = GetSplitList(Path, TAB_COMMA_SPLIT)\r
- IncPathList += [NormPath(PathEntry, self.Macros) for PathEntry in PathList]\r
+ IncPathList.extend(NormPath(PathEntry, self.Macros) for PathEntry in PathList)\r
\r
#\r
# EDK II modules must not reference header files outside of the packages they depend on or \r
# within the module's directory tree. Report error if violation.\r
#\r
- if self.AutoGenVersion >= 0x00010005 and len(IncPathList) > 0:\r
+ if self.AutoGenVersion >= 0x00010005:\r
for Path in IncPathList:\r
if (Path not in self.IncludePathList) and (CommonPath([Path, self.MetaFile.Dir]) != self.MetaFile.Dir):\r
ErrMsg = "The include directory for the EDK II module in this line is invalid %s specified in %s FLAGS '%s'" % (Path, Tool, FlagOption)\r
if not os.path.exists(SubDirectory):\r
CreateDirectory(SubDirectory)\r
LastTarget = None\r
- RuleChain = []\r
+ RuleChain = set()\r
SourceList = [File]\r
Index = 0\r
#\r
if FileType in RuleChain:\r
break\r
\r
- RuleChain.append(FileType)\r
+ RuleChain.add(FileType)\r
SourceList.extend(Target.Outputs)\r
LastTarget = Target\r
FileType = TAB_UNKNOWN_FILE\r
self._DependentLibraryList = self.PlatformInfo.ApplyLibraryInstance(self.Module)\r
return self._DependentLibraryList\r
\r
- @staticmethod\r
- def UpdateComments(Recver, Src):\r
- for Key in Src:\r
- if Key not in Recver:\r
- Recver[Key] = []\r
- Recver[Key].extend(Src[Key])\r
## Get the list of PCDs from current module\r
#\r
# @retval list The list of PCD\r
if self._ModulePcdList is None:\r
# apply PCD settings from platform\r
self._ModulePcdList = self.PlatformInfo.ApplyPcdSetting(self.Module, self.Module.Pcds)\r
- self.UpdateComments(self._PcdComments, self.Module.PcdComments)\r
+ ExtendCopyDictionaryLists(self._PcdComments, self.Module.PcdComments)\r
return self._ModulePcdList\r
\r
## Get the list of PCDs from dependent libraries\r
Pcds = OrderedDict()\r
if not self.IsLibrary:\r
# get PCDs from dependent libraries\r
+ self._LibraryPcdList = []\r
for Library in self.DependentLibraryList:\r
- self.UpdateComments(self._PcdComments, Library.PcdComments)\r
+ PcdsInLibrary = OrderedDict()\r
+ ExtendCopyDictionaryLists(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
self._GuidList.update(self.Module.Guids)\r
for Library in self.DependentLibraryList:\r
self._GuidList.update(Library.Guids)\r
- self.UpdateComments(self._GuidComments, Library.GuidComments)\r
- self.UpdateComments(self._GuidComments, self.Module.GuidComments)\r
+ ExtendCopyDictionaryLists(self._GuidComments, Library.GuidComments)\r
+ ExtendCopyDictionaryLists(self._GuidComments, self.Module.GuidComments)\r
return self._GuidList\r
\r
def GetGuidsUsedByPcd(self):\r
self._ProtocolList.update(self.Module.Protocols)\r
for Library in self.DependentLibraryList:\r
self._ProtocolList.update(Library.Protocols)\r
- self.UpdateComments(self._ProtocolComments, Library.ProtocolComments)\r
- self.UpdateComments(self._ProtocolComments, self.Module.ProtocolComments)\r
+ ExtendCopyDictionaryLists(self._ProtocolComments, Library.ProtocolComments)\r
+ ExtendCopyDictionaryLists(self._ProtocolComments, self.Module.ProtocolComments)\r
return self._ProtocolList\r
\r
## Get the PPI value mapping\r
self._PpiList.update(self.Module.Ppis)\r
for Library in self.DependentLibraryList:\r
self._PpiList.update(Library.Ppis)\r
- self.UpdateComments(self._PpiComments, Library.PpiComments)\r
- self.UpdateComments(self._PpiComments, self.Module.PpiComments)\r
+ ExtendCopyDictionaryLists(self._PpiComments, Library.PpiComments)\r
+ ExtendCopyDictionaryLists(self._PpiComments, self.Module.PpiComments)\r
return self._PpiList\r
\r
## Get the list of include search path\r
return self._IncludePathList\r
\r
def _GetIncludePathLength(self):\r
- self._IncludePathLength = 0\r
- if self._IncludePathList:\r
- for inc in self._IncludePathList:\r
- self._IncludePathLength += len(' ' + inc)\r
- return self._IncludePathLength\r
+ return sum(len(inc)+1 for inc in self._IncludePathList)\r
\r
## Get HII EX PCDs which maybe used by VFR\r
#\r
for Pcd in self.PlatformInfo.Platform.Pcds.values():\r
if Pcd.Type != TAB_PCDS_DYNAMIC_EX_HII:\r
continue\r
- for SkuName in Pcd.SkuInfoList:\r
- SkuInfo = Pcd.SkuInfoList[SkuName]\r
- Name = ConvertStringToByteArray(SkuInfo.VariableName)\r
+ for SkuInfo in Pcd.SkuInfoList.values():\r
Value = GuidValue(SkuInfo.VariableGuid, self.PlatformInfo.PackageList, self.MetaFile.Path)\r
if not Value:\r
continue\r
+ Name = ConvertStringToByteArray(SkuInfo.VariableName)\r
Guid = GuidStructureStringToGuidString(Value)\r
if (Name, Guid) in NameGuids and Pcd not in HiiExPcds:\r
HiiExPcds.append(Pcd)\r
# search the .map file to find the offset of vfr binary in the PE32+/TE file. \r
#\r
VfrUniBaseName[SourceFile.BaseName] = (SourceFile.BaseName + "Bin")\r
- if SourceFile.Type.upper() == ".UNI" :\r
+ elif SourceFile.Type.upper() == ".UNI" :\r
#\r
# search the .map file to find the offset of Uni strings binary in the PE32+/TE file. \r
#\r
VfrUniBaseName["UniOffsetName"] = (self.Name + "Strings")\r
\r
- if len(VfrUniBaseName) == 0:\r
+ if not VfrUniBaseName:\r
return None\r
MapFileName = os.path.join(self.OutputDir, self.Name + ".map")\r
EfiFileName = os.path.join(self.OutputDir, self.Name + ".efi")\r
#\r
def CreateAsBuiltInf(self, IsOnlyCopy = False):\r
self.OutputFile = set()\r
- if IsOnlyCopy:\r
- if GlobalData.gBinCacheDest:\r
- self.CopyModuleToCache()\r
- return\r
+ if IsOnlyCopy and GlobalData.gBinCacheDest:\r
+ self.CopyModuleToCache()\r
+ return\r
\r
if self.IsAsBuiltInfCreated:\r
return\r
PcdTokenSpaceList = []\r
for Pcd in self.ModulePcdList + self.LibraryPcdList:\r
if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
- PatchablePcds += [Pcd]\r
+ PatchablePcds.append(Pcd)\r
PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_PATCHABLE_IN_MODULE))\r
elif Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
if Pcd not in Pcds:\r
- Pcds += [Pcd]\r
+ Pcds.append(Pcd)\r
PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC_EX))\r
PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC))\r
PcdTokenSpaceList.append(Pcd.TokenSpaceGuidCName)\r
for Index in range(len(BeChecked)):\r
for Item in CheckList[Index]:\r
if Item in BeChecked[Index]:\r
- Packages += [Package]\r
+ Packages.append(Package)\r
Found = True\r
break\r
- if Found: break\r
+ if Found:\r
+ break\r
\r
VfrPcds = self._GetPcdsMaybeUsedByVfr()\r
for Pkg in self.PlatformInfo.PackageList:\r
for VfrPcd in VfrPcds:\r
if ((VfrPcd.TokenCName, VfrPcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC_EX) in Pkg.Pcds or\r
(VfrPcd.TokenCName, VfrPcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC) in Pkg.Pcds):\r
- Packages += [Pkg]\r
+ Packages.append(Pkg)\r
break\r
\r
- ModuleType = self.ModuleType\r
- if ModuleType == SUP_MODULE_UEFI_DRIVER and self.DepexGenerated:\r
- ModuleType = SUP_MODULE_DXE_DRIVER\r
-\r
- DriverType = ''\r
- if self.PcdIsDriver != '':\r
- DriverType = self.PcdIsDriver\r
-\r
+ ModuleType = SUP_MODULE_DXE_DRIVER if self.ModuleType == SUP_MODULE_UEFI_DRIVER and self.DepexGenerated else self.ModuleType\r
+ DriverType = self.PcdIsDriver if self.PcdIsDriver else ''\r
Guid = self.Guid\r
MDefs = self.Module.Defines\r
\r
'module_uefi_hii_resource_section' : [MDefs['UEFI_HII_RESOURCE_SECTION']] if 'UEFI_HII_RESOURCE_SECTION' in MDefs else [],\r
'module_uni_file' : [MDefs['MODULE_UNI_FILE']] if 'MODULE_UNI_FILE' in MDefs else [],\r
'module_arch' : self.Arch,\r
- 'package_item' : ['%s' % (Package.MetaFile.File.replace('\\', '/')) for Package in Packages],\r
+ 'package_item' : [Package.MetaFile.File.replace('\\', '/') for Package in Packages],\r
'binary_item' : [],\r
'patchablepcd_item' : [],\r
'pcd_item' : [],\r
AsBuiltInfDict['module_inf_version'] = gInfSpecVersion\r
\r
if DriverType:\r
- AsBuiltInfDict['pcd_is_driver_string'] += [DriverType]\r
+ AsBuiltInfDict['pcd_is_driver_string'].append(DriverType)\r
\r
if 'UEFI_SPECIFICATION_VERSION' in self.Specification:\r
- AsBuiltInfDict['module_uefi_specification_version'] += [self.Specification['UEFI_SPECIFICATION_VERSION']]\r
+ AsBuiltInfDict['module_uefi_specification_version'].append(self.Specification['UEFI_SPECIFICATION_VERSION'])\r
if 'PI_SPECIFICATION_VERSION' in self.Specification:\r
- AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
+ AsBuiltInfDict['module_pi_specification_version'].append(self.Specification['PI_SPECIFICATION_VERSION'])\r
\r
OutputDir = self.OutputDir.replace('\\', '/').strip('/')\r
DebugDir = self.DebugDir.replace('\\', '/').strip('/')\r
if os.path.isabs(File):\r
File = File.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
if Item.Target.Ext.lower() == '.aml':\r
- AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
+ AsBuiltInfDict['binary_item'].append('ASL|' + File)\r
elif Item.Target.Ext.lower() == '.acpi':\r
- AsBuiltInfDict['binary_item'] += ['ACPI|' + File]\r
+ AsBuiltInfDict['binary_item'].append('ACPI|' + File)\r
elif Item.Target.Ext.lower() == '.efi':\r
- AsBuiltInfDict['binary_item'] += ['PE32|' + self.Name + '.efi']\r
+ AsBuiltInfDict['binary_item'].append('PE32|' + self.Name + '.efi')\r
else:\r
- AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
+ AsBuiltInfDict['binary_item'].append('BIN|' + File)\r
if self.DepexGenerated:\r
self.OutputFile.add(self.Name + '.depex')\r
if self.ModuleType in [SUP_MODULE_PEIM]:\r
- AsBuiltInfDict['binary_item'] += ['PEI_DEPEX|' + self.Name + '.depex']\r
- if self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]:\r
- AsBuiltInfDict['binary_item'] += ['DXE_DEPEX|' + self.Name + '.depex']\r
- if self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]:\r
- AsBuiltInfDict['binary_item'] += ['SMM_DEPEX|' + self.Name + '.depex']\r
+ AsBuiltInfDict['binary_item'].append('PEI_DEPEX|' + self.Name + '.depex')\r
+ elif self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]:\r
+ AsBuiltInfDict['binary_item'].append('DXE_DEPEX|' + self.Name + '.depex')\r
+ elif self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]:\r
+ AsBuiltInfDict['binary_item'].append('SMM_DEPEX|' + self.Name + '.depex')\r
\r
Bin = self._GenOffsetBin()\r
if Bin:\r
- AsBuiltInfDict['binary_item'] += ['BIN|%s' % Bin]\r
+ AsBuiltInfDict['binary_item'].append('BIN|%s' % Bin)\r
self.OutputFile.add(Bin)\r
\r
for Root, Dirs, Files in os.walk(OutputDir):\r
for File in Files:\r
if File.lower().endswith('.pdb'):\r
- AsBuiltInfDict['binary_item'] += ['DISPOSABLE|' + File]\r
+ AsBuiltInfDict['binary_item'].append('DISPOSABLE|' + File)\r
self.OutputFile.add(File)\r
HeaderComments = self.Module.HeaderComments\r
StartPos = 0\r
]\r
for Item in GenList:\r
for CName in Item[0]:\r
- Comments = ''\r
- if CName in Item[1]:\r
- Comments = '\n '.join(Item[1][CName])\r
- Entry = CName\r
- if Comments:\r
- Entry = Comments + '\n ' + CName\r
+ Comments = '\n '.join(Item[1][CName]) if CName in Item[1] else ''\r
+ Entry = Comments + '\n ' + CName if Comments else CName\r
AsBuiltInfDict[Item[2]].append(Entry)\r
PatchList = parsePcdInfoFromMapFile(\r
os.path.join(self.OutputDir, self.Name + '.map'),\r
\r
HiiPcds = set()\r
for Pcd in Pcds + VfrPcds:\r
- PcdComments = ''\r
PcdCommentList = []\r
HiiInfo = ''\r
SkuId = ''\r
PcdEntry = Pcd.TokenSpaceGuidCName + '.' + TokenCName\r
if PcdComments:\r
PcdEntry = PcdComments + '\n ' + PcdEntry\r
- AsBuiltInfDict['pcd_item'] += [PcdEntry]\r
+ AsBuiltInfDict['pcd_item'].append(PcdEntry)\r
for Item in self.BuildOption:\r
if 'FLAGS' in self.BuildOption[Item]:\r
- AsBuiltInfDict['flags_item'] += ['%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip())]\r
+ AsBuiltInfDict['flags_item'].append('%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip()))\r
\r
# Generated LibraryClasses section in comments.\r
for Library in self.LibraryAutoGenList:\r
- AsBuiltInfDict['libraryclasses_item'] += [Library.MetaFile.File.replace('\\', '/')]\r
+ AsBuiltInfDict['libraryclasses_item'].append(Library.MetaFile.File.replace('\\', '/'))\r
\r
# Generated UserExtensions TianoCore section.\r
# All tianocore user extensions are copied.\r
AsBuiltInfDict['userextension_tianocore_item'] = UserExtStr\r
\r
# Generated depex expression section in comments.\r
- AsBuiltInfDict['depexsection_item'] = ''\r
DepexExpresion = self._GetDepexExpresionString()\r
- if DepexExpresion:\r
- AsBuiltInfDict['depexsection_item'] = DepexExpresion\r
+ AsBuiltInfDict['depexsection_item'] = DepexExpresion if DepexExpresion else ''\r
\r
AsBuiltInf = TemplateString()\r
AsBuiltInf.Append(gAsBuiltInfHeaderString.Replace(AsBuiltInfDict))\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
if self.Name not in GlobalData.gModuleHash[self.Arch]:\r
GlobalData.gModuleHash[self.Arch][self.Name] = m.hexdigest()\r
if GlobalData.gBinCacheSource:\r
- CacheValid = self.AttemptModuleCacheCopy()\r
- if CacheValid:\r
+ if self.AttemptModuleCacheCopy():\r
return False\r
return SaveFileOnChange(ModuleHashFile, m.hexdigest(), True)\r
\r
return self._TimeStampPath\r
def CreateTimeStamp(self, Makefile):\r
\r
- FileSet = set()\r
-\r
- FileSet.add (self.MetaFile.Path)\r
+ FileSet = {self.MetaFile.Path}\r
\r
for SourceFile in self.Module.Sources:\r
FileSet.add (SourceFile.Path)\r
PpiList = property(_GetPpiList)\r
DepexList = property(_GetDepexTokenList)\r
DxsFile = property(_GetDxsFile)\r
- DepexExpressionList = property(_GetDepexExpressionTokenList)\r
+ DepexExpressionDict = property(_GetDepexExpressionTokenList)\r
BuildOption = property(_GetModuleBuildOption)\r
BuildOptionIncPathList = property(_GetBuildOptionIncPathList)\r
BuildCommand = property(_GetBuildCommand)\r