#\r
\r
from __future__ import absolute_import\r
-from Common.StringUtils import *\r
from Common.DataType import *\r
from Common.Misc import *\r
+from Common.caching import cached_property, cached_class_function\r
from types import *\r
from .MetaFileParser import *\r
from collections import OrderedDict\r
-\r
from Workspace.BuildClassObject import ModuleBuildClassObject, LibraryClassObject, PcdClassObject\r
+\r
## Module build information from INF file\r
#\r
# This class is used to retrieve information stored in database and convert them\r
}\r
\r
\r
- ## Constructor of DscBuildData\r
+ ## Constructor of InfBuildData\r
#\r
- # Initialize object of DscBuildData\r
+ # Initialize object of InfBuildData\r
#\r
# @param FilePath The path of platform description file\r
# @param RawData The raw data of DSC file\r
self._Target = Target\r
self._Toolchain = Toolchain\r
self._Platform = TAB_COMMON\r
- self._SourceOverridePath = None\r
if FilePath.Key in GlobalData.gOverrideDir:\r
self._SourceOverridePath = GlobalData.gOverrideDir[FilePath.Key]\r
- self._Clear()\r
+ else:\r
+ self._SourceOverridePath = None\r
+ self._TailComments = None\r
+ self._BaseName = None\r
+ self._DxsFile = None\r
+ self._ModuleType = None\r
+ self._ComponentType = None\r
+ self._BuildType = None\r
+ self._Guid = None\r
+ self._Version = None\r
+ self._PcdIsDriver = None\r
+ self._BinaryModule = None\r
+ self._Shadow = None\r
+ self._MakefileName = None\r
+ self._CustomMakefile = None\r
+ self._Specification = None\r
+ self._LibraryClass = None\r
+ self._ModuleEntryPointList = None\r
+ self._ModuleUnloadImageList = None\r
+ self._ConstructorList = None\r
+ self._DestructorList = None\r
+ self._Defs = OrderedDict()\r
+ self._ProtocolComments = None\r
+ self._PpiComments = None\r
+ self._GuidsUsedByPcd = OrderedDict()\r
+ self._GuidComments = None\r
+ self._PcdComments = None\r
+ self._BuildOptions = None\r
+ self._DependencyFileList = None\r
\r
## XXX[key] = value\r
def __setitem__(self, key, value):\r
def __contains__(self, key):\r
return key in self._PROPERTY_\r
\r
- ## Set all internal used members of InfBuildData to None\r
- def _Clear(self):\r
- self._HeaderComments = None\r
- self._TailComments = None\r
- self._Header_ = None\r
- self._AutoGenVersion = None\r
- self._BaseName = None\r
- self._DxsFile = None\r
- self._ModuleType = None\r
- self._ComponentType = None\r
- self._BuildType = None\r
- self._Guid = None\r
- self._Version = None\r
- self._PcdIsDriver = None\r
- self._BinaryModule = None\r
- self._Shadow = None\r
- self._MakefileName = None\r
- self._CustomMakefile = None\r
- self._Specification = None\r
- self._LibraryClass = None\r
- self._ModuleEntryPointList = None\r
- self._ModuleUnloadImageList = None\r
- self._ConstructorList = None\r
- self._DestructorList = None\r
- self._Defs = OrderedDict()\r
- self._Binaries = None\r
- self._Sources = None\r
- self._LibraryClasses = None\r
- self._Libraries = None\r
- self._Protocols = None\r
- self._ProtocolComments = None\r
- self._Ppis = None\r
- self._PpiComments = None\r
- self._Guids = None\r
- self._GuidsUsedByPcd = OrderedDict()\r
- self._GuidComments = None\r
- self._Includes = None\r
- self._Packages = None\r
- self._Pcds = None\r
- self._PcdComments = None\r
- self._BuildOptions = None\r
- self._Depex = None\r
- self._DepexExpression = None\r
- self._MacroDict = None\r
-\r
## Get current effective macros\r
- @property\r
+ @cached_property\r
def _Macros(self):\r
- if self._MacroDict is None:\r
- self._MacroDict = {}\r
- # EDK_GLOBAL defined macros can be applied to EDK module\r
- if self.AutoGenVersion < 0x00010005:\r
- self._MacroDict.update(GlobalData.gEdkGlobal)\r
- self._MacroDict.update(GlobalData.gGlobalDefines)\r
- return self._MacroDict\r
+ RetVal = {}\r
+ # EDK_GLOBAL defined macros can be applied to EDK module\r
+ if self.AutoGenVersion < 0x00010005:\r
+ RetVal.update(GlobalData.gEdkGlobal)\r
+ RetVal.update(GlobalData.gGlobalDefines)\r
+ return RetVal\r
\r
## Get architecture\r
- @property\r
+ @cached_property\r
def Arch(self):\r
return self._Arch\r
\r
## Return the name of platform employing this module\r
- @property\r
+ @cached_property\r
def Platform(self):\r
return self._Platform\r
\r
-\r
- @property\r
+ @cached_property\r
def HeaderComments(self):\r
- if not self._HeaderComments:\r
- self._HeaderComments = [a[0] for a in self._RawData[MODEL_META_DATA_HEADER_COMMENT]]\r
- return self._HeaderComments\r
+ return [a[0] for a in self._RawData[MODEL_META_DATA_HEADER_COMMENT]]\r
\r
- @property\r
+ @cached_property\r
def TailComments(self):\r
- if not self._TailComments:\r
- self._TailComments = [a[0] for a in self._RawData[MODEL_META_DATA_TAIL_COMMENT]]\r
- return self._TailComments\r
+ return [a[0] for a in self._RawData[MODEL_META_DATA_TAIL_COMMENT]]\r
\r
## Retrieve all information in [Defines] section\r
#\r
# (Retriving all [Defines] information in one-shot is just to save time.)\r
#\r
+ @cached_class_function\r
def _GetHeaderInfo(self):\r
RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
for Record in RecordList:\r
if ErrorCode != 0:\r
EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,\r
File=self.MetaFile, Line=LineNo)\r
- if self.Sources is None:\r
- self._Sources = []\r
- self._Sources.append(File)\r
+ if not self._DependencyFileList:\r
+ self._DependencyFileList = []\r
+ self._DependencyFileList.append(File)\r
else:\r
if not self._ComponentType:\r
EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE,\r
if ErrorCode != 0:\r
EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,\r
File=self.MetaFile, Line=LineNo)\r
- if self.Sources is None:\r
- self._Sources = []\r
- self._Sources.append(File)\r
+ if not self._DependencyFileList:\r
+ self._DependencyFileList = []\r
+ self._DependencyFileList.append(File)\r
else:\r
ToolList = self._NMAKE_FLAG_PATTERN_.findall(Name)\r
if len(ToolList) == 1:\r
else:\r
OptionString = self._BuildOptions[TAB_COMPILER_MSFT, ToolChain]\r
self._BuildOptions[TAB_COMPILER_MSFT, ToolChain] = OptionString + " " + Value\r
- # set _Header to non-None in order to avoid database re-querying\r
- self._Header_ = 'DUMMY'\r
\r
## Retrieve file version\r
- @property\r
+ @cached_property\r
def AutoGenVersion(self):\r
- if self._AutoGenVersion is None:\r
- RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- if Record[1] == TAB_INF_DEFINES_INF_VERSION:\r
- if '.' in Record[2]:\r
- ValueList = Record[2].split('.')\r
- Major = '%04o' % int(ValueList[0], 0)\r
- Minor = '%04o' % int(ValueList[1], 0)\r
- self._AutoGenVersion = int('0x' + Major + Minor, 0)\r
- else:\r
- self._AutoGenVersion = int(Record[2], 0)\r
- break\r
- if self._AutoGenVersion is None:\r
- self._AutoGenVersion = 0x00010000\r
- return self._AutoGenVersion\r
+ RetVal = 0x00010000\r
+ RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ if Record[1] == TAB_INF_DEFINES_INF_VERSION:\r
+ if '.' in Record[2]:\r
+ ValueList = Record[2].split('.')\r
+ Major = '%04o' % int(ValueList[0], 0)\r
+ Minor = '%04o' % int(ValueList[1], 0)\r
+ RetVal = int('0x' + Major + Minor, 0)\r
+ else:\r
+ RetVal = int(Record[2], 0)\r
+ break\r
+ return RetVal\r
\r
## Retrieve BASE_NAME\r
- @property\r
+ @cached_property\r
def BaseName(self):\r
if self._BaseName is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._BaseName is None:\r
EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BASE_NAME name", File=self.MetaFile)\r
return self._BaseName\r
\r
## Retrieve DxsFile\r
- @property\r
+ @cached_property\r
def DxsFile(self):\r
if self._DxsFile is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._DxsFile is None:\r
self._DxsFile = ''\r
return self._DxsFile\r
\r
## Retrieve MODULE_TYPE\r
- @property\r
+ @cached_property\r
def ModuleType(self):\r
if self._ModuleType is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._ModuleType is None:\r
self._ModuleType = SUP_MODULE_BASE\r
if self._ModuleType not in SUP_MODULE_LIST:\r
return self._ModuleType\r
\r
## Retrieve COMPONENT_TYPE\r
- @property\r
+ @cached_property\r
def ComponentType(self):\r
if self._ComponentType is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._ComponentType is None:\r
self._ComponentType = SUP_MODULE_USER_DEFINED\r
return self._ComponentType\r
\r
## Retrieve "BUILD_TYPE"\r
- @property\r
+ @cached_property\r
def BuildType(self):\r
if self._BuildType is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if not self._BuildType:\r
self._BuildType = SUP_MODULE_BASE\r
return self._BuildType\r
\r
## Retrieve file guid\r
- @property\r
+ @cached_property\r
def Guid(self):\r
if self._Guid is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._Guid is None:\r
self._Guid = '00000000-0000-0000-0000-000000000000'\r
return self._Guid\r
\r
## Retrieve module version\r
- @property\r
+ @cached_property\r
def Version(self):\r
if self._Version is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._Version is None:\r
self._Version = '0.0'\r
return self._Version\r
\r
## Retrieve PCD_IS_DRIVER\r
- @property\r
+ @cached_property\r
def PcdIsDriver(self):\r
if self._PcdIsDriver is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._PcdIsDriver is None:\r
self._PcdIsDriver = ''\r
return self._PcdIsDriver\r
\r
## Retrieve SHADOW\r
- @property\r
+ @cached_property\r
def Shadow(self):\r
if self._Shadow is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
- if self._Shadow is not None and self._Shadow.upper() == 'TRUE':\r
+ self._GetHeaderInfo()\r
+ if self._Shadow and self._Shadow.upper() == 'TRUE':\r
self._Shadow = True\r
else:\r
self._Shadow = False\r
return self._Shadow\r
\r
## Retrieve CUSTOM_MAKEFILE\r
- @property\r
+ @cached_property\r
def CustomMakefile(self):\r
if self._CustomMakefile is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._CustomMakefile is None:\r
self._CustomMakefile = {}\r
return self._CustomMakefile\r
\r
## Retrieve EFI_SPECIFICATION_VERSION\r
- @property\r
+ @cached_property\r
def Specification(self):\r
if self._Specification is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._Specification is None:\r
self._Specification = {}\r
return self._Specification\r
\r
## Retrieve LIBRARY_CLASS\r
- @property\r
+ @cached_property\r
def LibraryClass(self):\r
if self._LibraryClass is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._LibraryClass is None:\r
self._LibraryClass = []\r
return self._LibraryClass\r
\r
## Retrieve ENTRY_POINT\r
- @property\r
+ @cached_property\r
def ModuleEntryPointList(self):\r
if self._ModuleEntryPointList is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._ModuleEntryPointList is None:\r
self._ModuleEntryPointList = []\r
return self._ModuleEntryPointList\r
\r
## Retrieve UNLOAD_IMAGE\r
- @property\r
+ @cached_property\r
def ModuleUnloadImageList(self):\r
if self._ModuleUnloadImageList is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._ModuleUnloadImageList is None:\r
self._ModuleUnloadImageList = []\r
return self._ModuleUnloadImageList\r
\r
## Retrieve CONSTRUCTOR\r
- @property\r
+ @cached_property\r
def ConstructorList(self):\r
if self._ConstructorList is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._ConstructorList is None:\r
self._ConstructorList = []\r
return self._ConstructorList\r
\r
## Retrieve DESTRUCTOR\r
- @property\r
+ @cached_property\r
def DestructorList(self):\r
if self._DestructorList is None:\r
- if self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
if self._DestructorList is None:\r
self._DestructorList = []\r
return self._DestructorList\r
\r
## Retrieve definies other than above ones\r
- @property\r
+ @cached_property\r
def Defines(self):\r
- if len(self._Defs) == 0 and self._Header_ is None:\r
- self._GetHeaderInfo()\r
+ self._GetHeaderInfo()\r
return self._Defs\r
\r
## Retrieve binary files\r
+ @cached_class_function\r
def _GetBinaries(self):\r
- if self._Binaries is None:\r
- self._Binaries = []\r
- RecordList = self._RawData[MODEL_EFI_BINARY_FILE, self._Arch, self._Platform]\r
- Macros = self._Macros\r
- Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
- Macros['PROCESSOR'] = self._Arch\r
- for Record in RecordList:\r
- FileType = Record[0]\r
- LineNo = Record[-1]\r
- Target = TAB_COMMON\r
- FeatureFlag = []\r
- if Record[2]:\r
- TokenList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
- if TokenList:\r
- Target = TokenList[0]\r
- if len(TokenList) > 1:\r
- FeatureFlag = Record[1:]\r
-\r
- File = PathClass(NormPath(Record[1], Macros), self._ModuleDir, '', FileType, True, self._Arch, '', Target)\r
- # check the file validation\r
- ErrorCode, ErrorInfo = File.Validate()\r
- if ErrorCode != 0:\r
- EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
- self._Binaries.append(File)\r
- return self._Binaries\r
+ RetVal = []\r
+ RecordList = self._RawData[MODEL_EFI_BINARY_FILE, self._Arch, self._Platform]\r
+ Macros = self._Macros\r
+ Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
+ Macros['PROCESSOR'] = self._Arch\r
+ for Record in RecordList:\r
+ FileType = Record[0]\r
+ LineNo = Record[-1]\r
+ Target = TAB_COMMON\r
+ FeatureFlag = []\r
+ if Record[2]:\r
+ TokenList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
+ if TokenList:\r
+ Target = TokenList[0]\r
+ if len(TokenList) > 1:\r
+ FeatureFlag = Record[1:]\r
+\r
+ File = PathClass(NormPath(Record[1], Macros), self._ModuleDir, '', FileType, True, self._Arch, '', Target)\r
+ # check the file validation\r
+ ErrorCode, ErrorInfo = File.Validate()\r
+ if ErrorCode != 0:\r
+ EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+ RetVal.append(File)\r
+ return RetVal\r
\r
## Retrieve binary files with error check.\r
- @property\r
+ @cached_property\r
def Binaries(self):\r
- Binaries = self._GetBinaries()\r
- if GlobalData.gIgnoreSource and Binaries == []:\r
- ErrorInfo = "The INF file does not contain any Binaries to use in creating the image\n"\r
+ RetVal = self._GetBinaries()\r
+ if GlobalData.gIgnoreSource and not RetVal:\r
+ ErrorInfo = "The INF file does not contain any RetVal to use in creating the image\n"\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, ExtraData=ErrorInfo, File=self.MetaFile)\r
\r
- return Binaries\r
+ return RetVal\r
\r
## Retrieve source files\r
- @property\r
+ @cached_property\r
def Sources(self):\r
+ self._GetHeaderInfo()\r
# Ignore all source files in a binary build mode\r
if GlobalData.gIgnoreSource:\r
- self._Sources = []\r
- return self._Sources\r
+ return []\r
\r
- if self._Sources is None:\r
- self._Sources = []\r
- RecordList = self._RawData[MODEL_EFI_SOURCE_FILE, self._Arch, self._Platform]\r
- Macros = self._Macros\r
- for Record in RecordList:\r
- LineNo = Record[-1]\r
- ToolChainFamily = Record[1]\r
- TagName = Record[2]\r
- ToolCode = Record[3]\r
- FeatureFlag = Record[4]\r
- if self.AutoGenVersion < 0x00010005:\r
- Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
- Macros['PROCESSOR'] = self._Arch\r
- SourceFile = NormPath(Record[0], Macros)\r
- if SourceFile[0] == os.path.sep:\r
- SourceFile = mws.join(GlobalData.gWorkspace, SourceFile[1:])\r
- # old module source files (Edk)\r
- File = PathClass(SourceFile, self._ModuleDir, self._SourceOverridePath,\r
- '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
- # check the file validation\r
- ErrorCode, ErrorInfo = File.Validate(CaseSensitive=False)\r
- if ErrorCode != 0:\r
- if File.Ext.lower() == '.h':\r
- EdkLogger.warn('build', 'Include file not found', ExtraData=ErrorInfo,\r
- File=self.MetaFile, Line=LineNo)\r
- continue\r
- else:\r
- EdkLogger.error('build', ErrorCode, ExtraData=File, File=self.MetaFile, Line=LineNo)\r
- else:\r
- File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, '',\r
- '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
- # check the file validation\r
- ErrorCode, ErrorInfo = File.Validate()\r
- if ErrorCode != 0:\r
- EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+ RetVal = []\r
+ RecordList = self._RawData[MODEL_EFI_SOURCE_FILE, self._Arch, self._Platform]\r
+ Macros = self._Macros\r
+ for Record in RecordList:\r
+ LineNo = Record[-1]\r
+ ToolChainFamily = Record[1]\r
+ TagName = Record[2]\r
+ ToolCode = Record[3]\r
+ if self.AutoGenVersion < 0x00010005:\r
+ Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
+ Macros['PROCESSOR'] = self._Arch\r
+ SourceFile = NormPath(Record[0], Macros)\r
+ if SourceFile[0] == os.path.sep:\r
+ SourceFile = mws.join(GlobalData.gWorkspace, SourceFile[1:])\r
+ # old module source files (Edk)\r
+ File = PathClass(SourceFile, self._ModuleDir, self._SourceOverridePath,\r
+ '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
+ # check the file validation\r
+ ErrorCode, ErrorInfo = File.Validate(CaseSensitive=False)\r
+ if ErrorCode != 0:\r
+ if File.Ext.lower() == '.h':\r
+ EdkLogger.warn('build', 'Include file not found', ExtraData=ErrorInfo,\r
+ File=self.MetaFile, Line=LineNo)\r
+ continue\r
+ else:\r
+ EdkLogger.error('build', ErrorCode, ExtraData=File, File=self.MetaFile, Line=LineNo)\r
+ else:\r
+ File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, '',\r
+ '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
+ # check the file validation\r
+ ErrorCode, ErrorInfo = File.Validate()\r
+ if ErrorCode != 0:\r
+ EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
\r
- self._Sources.append(File)\r
- return self._Sources\r
+ RetVal.append(File)\r
+ # add any previously found dependency files to the source list\r
+ if self._DependencyFileList:\r
+ RetVal.extend(self._DependencyFileList)\r
+ return RetVal\r
\r
## Retrieve library classes employed by this module\r
- @property\r
+ @cached_property\r
def LibraryClasses(self):\r
- if self._LibraryClasses is None:\r
- self._LibraryClasses = OrderedDict()\r
- RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- Lib = Record[0]\r
- Instance = Record[1]\r
- if Instance:\r
- Instance = NormPath(Instance, self._Macros)\r
- self._LibraryClasses[Lib] = Instance\r
- return self._LibraryClasses\r
+ RetVal = OrderedDict()\r
+ RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ Lib = Record[0]\r
+ Instance = Record[1]\r
+ if Instance:\r
+ Instance = NormPath(Instance, self._Macros)\r
+ RetVal[Lib] = Instance\r
+ return RetVal\r
\r
## Retrieve library names (for Edk.x style of modules)\r
- @property\r
+ @cached_property\r
def Libraries(self):\r
- if self._Libraries is None:\r
- self._Libraries = []\r
- RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- LibraryName = ReplaceMacro(Record[0], self._Macros, False)\r
- # in case of name with '.lib' extension, which is unusual in Edk.x inf\r
- LibraryName = os.path.splitext(LibraryName)[0]\r
- if LibraryName not in self._Libraries:\r
- self._Libraries.append(LibraryName)\r
- return self._Libraries\r
-\r
- @property\r
+ RetVal = []\r
+ RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ LibraryName = ReplaceMacro(Record[0], self._Macros, False)\r
+ # in case of name with '.lib' extension, which is unusual in Edk.x inf\r
+ LibraryName = os.path.splitext(LibraryName)[0]\r
+ if LibraryName not in RetVal:\r
+ RetVal.append(LibraryName)\r
+ return RetVal\r
+\r
+ @cached_property\r
def ProtocolComments(self):\r
self.Protocols\r
return self._ProtocolComments\r
\r
## Retrieve protocols consumed/produced by this module\r
- @property\r
+ @cached_property\r
def Protocols(self):\r
- if self._Protocols is None:\r
- self._Protocols = OrderedDict()\r
- self._ProtocolComments = OrderedDict()\r
- RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- CName = Record[0]\r
- Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
- if Value is None:\r
- PackageList = "\n\t".join(str(P) for P in self.Packages)\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
- "Value of Protocol [%s] is not found under [Protocols] section in" % CName,\r
- ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
- self._Protocols[CName] = Value\r
- CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
- Comments = []\r
- for CmtRec in CommentRecords:\r
- Comments.append(CmtRec[0])\r
- self._ProtocolComments[CName] = Comments\r
- return self._Protocols\r
-\r
- @property\r
+ RetVal = OrderedDict()\r
+ self._ProtocolComments = OrderedDict()\r
+ RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ CName = Record[0]\r
+ Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
+ if Value is None:\r
+ PackageList = "\n\t".join(str(P) for P in self.Packages)\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
+ "Value of Protocol [%s] is not found under [Protocols] section in" % CName,\r
+ ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
+ RetVal[CName] = Value\r
+ CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+ self._ProtocolComments[CName] = [a[0] for a in CommentRecords]\r
+ return RetVal\r
+\r
+ @cached_property\r
def PpiComments(self):\r
self.Ppis\r
return self._PpiComments\r
\r
## Retrieve PPIs consumed/produced by this module\r
- @property\r
+ @cached_property\r
def Ppis(self):\r
- if self._Ppis is None:\r
- self._Ppis = OrderedDict()\r
- self._PpiComments = OrderedDict()\r
- RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- CName = Record[0]\r
- Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
- if Value is None:\r
- PackageList = "\n\t".join(str(P) for P in self.Packages)\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
- "Value of PPI [%s] is not found under [Ppis] section in " % CName,\r
- ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
- self._Ppis[CName] = Value\r
- CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
- Comments = []\r
- for CmtRec in CommentRecords:\r
- Comments.append(CmtRec[0])\r
- self._PpiComments[CName] = Comments\r
- return self._Ppis\r
-\r
- @property\r
+ RetVal = OrderedDict()\r
+ self._PpiComments = OrderedDict()\r
+ RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ CName = Record[0]\r
+ Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
+ if Value is None:\r
+ PackageList = "\n\t".join(str(P) for P in self.Packages)\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
+ "Value of PPI [%s] is not found under [Ppis] section in " % CName,\r
+ ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
+ RetVal[CName] = Value\r
+ CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+ self._PpiComments[CName] = [a[0] for a in CommentRecords]\r
+ return RetVal\r
+\r
+ @cached_property\r
def GuidComments(self):\r
self.Guids\r
return self._GuidComments\r
\r
## Retrieve GUIDs consumed/produced by this module\r
- @property\r
+ @cached_property\r
def Guids(self):\r
- if self._Guids is None:\r
- self._Guids = OrderedDict()\r
- self._GuidComments = OrderedDict()\r
- RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- CName = Record[0]\r
- Value = GuidValue(CName, self.Packages, self.MetaFile.Path)\r
- if Value is None:\r
- PackageList = "\n\t".join(str(P) for P in self.Packages)\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
- "Value of Guid [%s] is not found under [Guids] section in" % CName,\r
- ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
- self._Guids[CName] = Value\r
- CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
- Comments = []\r
- for CmtRec in CommentRecords:\r
- Comments.append(CmtRec[0])\r
- self._GuidComments[CName] = Comments\r
- return self._Guids\r
+ RetVal = OrderedDict()\r
+ self._GuidComments = OrderedDict()\r
+ RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ CName = Record[0]\r
+ Value = GuidValue(CName, self.Packages, self.MetaFile.Path)\r
+ if Value is None:\r
+ PackageList = "\n\t".join(str(P) for P in self.Packages)\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
+ "Value of Guid [%s] is not found under [Guids] section in" % CName,\r
+ ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
+ RetVal[CName] = Value\r
+ CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+ self._GuidComments[CName] = [a[0] for a in CommentRecords]\r
+ return RetVal\r
\r
## Retrieve include paths necessary for this module (for Edk.x style of modules)\r
- @property\r
+ @cached_property\r
def Includes(self):\r
- if self._Includes is None:\r
- self._Includes = []\r
- if self._SourceOverridePath:\r
- self._Includes.append(self._SourceOverridePath)\r
+ RetVal = []\r
+ if self._SourceOverridePath:\r
+ RetVal.append(self._SourceOverridePath)\r
\r
- Macros = self._Macros\r
- Macros['PROCESSOR'] = GlobalData.gEdkGlobal.get('PROCESSOR', self._Arch)\r
- RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch, self._Platform]\r
- for Record in RecordList:\r
- if Record[0].find('EDK_SOURCE') > -1:\r
- Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
- File = NormPath(Record[0], self._Macros)\r
- if File[0] == '.':\r
- File = os.path.join(self._ModuleDir, File)\r
- else:\r
- File = os.path.join(GlobalData.gWorkspace, File)\r
- File = RealPath(os.path.normpath(File))\r
- if File:\r
- self._Includes.append(File)\r
-\r
- # TRICK: let compiler to choose correct header file\r
- Macros['EDK_SOURCE'] = GlobalData.gEdkSource\r
- File = NormPath(Record[0], self._Macros)\r
- if File[0] == '.':\r
- File = os.path.join(self._ModuleDir, File)\r
- else:\r
- File = os.path.join(GlobalData.gWorkspace, File)\r
- File = RealPath(os.path.normpath(File))\r
- if File:\r
- self._Includes.append(File)\r
+ Macros = self._Macros\r
+ Macros['PROCESSOR'] = GlobalData.gEdkGlobal.get('PROCESSOR', self._Arch)\r
+ RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch, self._Platform]\r
+ for Record in RecordList:\r
+ if Record[0].find('EDK_SOURCE') > -1:\r
+ Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
+ File = NormPath(Record[0], self._Macros)\r
+ if File[0] == '.':\r
+ File = os.path.join(self._ModuleDir, File)\r
+ else:\r
+ File = os.path.join(GlobalData.gWorkspace, File)\r
+ File = RealPath(os.path.normpath(File))\r
+ if File:\r
+ RetVal.append(File)\r
+\r
+ # TRICK: let compiler to choose correct header file\r
+ Macros['EDK_SOURCE'] = GlobalData.gEdkSource\r
+ File = NormPath(Record[0], self._Macros)\r
+ if File[0] == '.':\r
+ File = os.path.join(self._ModuleDir, File)\r
+ else:\r
+ File = os.path.join(GlobalData.gWorkspace, File)\r
+ File = RealPath(os.path.normpath(File))\r
+ if File:\r
+ RetVal.append(File)\r
+ else:\r
+ File = NormPath(Record[0], Macros)\r
+ if File[0] == '.':\r
+ File = os.path.join(self._ModuleDir, File)\r
else:\r
+ File = mws.join(GlobalData.gWorkspace, File)\r
+ File = RealPath(os.path.normpath(File))\r
+ if File:\r
+ RetVal.append(File)\r
+ if not File and Record[0].find('EFI_SOURCE') > -1:\r
+ # tricky to regard WorkSpace as EFI_SOURCE\r
+ Macros['EFI_SOURCE'] = GlobalData.gWorkspace\r
File = NormPath(Record[0], Macros)\r
if File[0] == '.':\r
File = os.path.join(self._ModuleDir, File)\r
else:\r
- File = mws.join(GlobalData.gWorkspace, File)\r
+ File = os.path.join(GlobalData.gWorkspace, File)\r
File = RealPath(os.path.normpath(File))\r
if File:\r
- self._Includes.append(File)\r
- if not File and Record[0].find('EFI_SOURCE') > -1:\r
- # tricky to regard WorkSpace as EFI_SOURCE\r
- Macros['EFI_SOURCE'] = GlobalData.gWorkspace\r
- File = NormPath(Record[0], Macros)\r
- if File[0] == '.':\r
- File = os.path.join(self._ModuleDir, File)\r
- else:\r
- File = os.path.join(GlobalData.gWorkspace, File)\r
- File = RealPath(os.path.normpath(File))\r
- if File:\r
- self._Includes.append(File)\r
- return self._Includes\r
+ RetVal.append(File)\r
+ return RetVal\r
\r
## Retrieve packages this module depends on\r
- @property\r
+ @cached_property\r
def Packages(self):\r
- if self._Packages is None:\r
- self._Packages = []\r
- RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch, self._Platform]\r
- Macros = self._Macros\r
- Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
- for Record in RecordList:\r
- File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+ RetVal = []\r
+ RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch, self._Platform]\r
+ Macros = self._Macros\r
+ Macros['EDK_SOURCE'] = GlobalData.gEcpSource\r
+ for Record in RecordList:\r
+ File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+ # check the file validation\r
+ ErrorCode, ErrorInfo = File.Validate('.dec')\r
+ if ErrorCode != 0:\r
LineNo = Record[-1]\r
- # check the file validation\r
- ErrorCode, ErrorInfo = File.Validate('.dec')\r
- if ErrorCode != 0:\r
- EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
- # parse this package now. we need it to get protocol/ppi/guid value\r
- Package = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
- self._Packages.append(Package)\r
- return self._Packages\r
+ EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+ # parse this package now. we need it to get protocol/ppi/guid value\r
+ RetVal.append(self._Bdb[File, self._Arch, self._Target, self._Toolchain])\r
+ return RetVal\r
\r
## Retrieve PCD comments\r
- @property\r
+ @cached_property\r
def PcdComments(self):\r
self.Pcds\r
return self._PcdComments\r
\r
## Retrieve PCDs used in this module\r
- @property\r
+ @cached_property\r
def Pcds(self):\r
- if self._Pcds is None:\r
- self._Pcds = OrderedDict()\r
- self._PcdComments = OrderedDict()\r
- self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
- self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
- self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
- self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC))\r
- self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
- return self._Pcds\r
+ self._PcdComments = OrderedDict()\r
+ RetVal = OrderedDict()\r
+ RetVal.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
+ RetVal.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
+ RetVal.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
+ RetVal.update(self._GetPcd(MODEL_PCD_DYNAMIC))\r
+ RetVal.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
+ return RetVal\r
\r
## Retrieve build options specific to this module\r
- @property\r
+ @cached_property\r
def BuildOptions(self):\r
if self._BuildOptions is None:\r
self._BuildOptions = OrderedDict()\r
return self._BuildOptions\r
\r
## Retrieve dependency expression\r
- @property\r
+ @cached_property\r
def Depex(self):\r
- if self._Depex is None:\r
- self._Depex = tdict(False, 2)\r
- RecordList = self._RawData[MODEL_EFI_DEPEX, self._Arch]\r
-\r
- # If the module has only Binaries and no Sources, then ignore [Depex]\r
- if self.Sources is None or self.Sources == []:\r
- if self.Binaries is not None and self.Binaries != []:\r
- return self._Depex\r
-\r
- # PEIM and DXE drivers must have a valid [Depex] section\r
- if len(self.LibraryClass) == 0 and len(RecordList) == 0:\r
- if self.ModuleType == SUP_MODULE_DXE_DRIVER or self.ModuleType == SUP_MODULE_PEIM or self.ModuleType == SUP_MODULE_DXE_SMM_DRIVER or \\r
- self.ModuleType == SUP_MODULE_DXE_SAL_DRIVER or self.ModuleType == SUP_MODULE_DXE_RUNTIME_DRIVER:\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "No [Depex] section or no valid expression in [Depex] section for [%s] module" \\r
- % self.ModuleType, File=self.MetaFile)\r
-\r
- if len(RecordList) != 0 and self.ModuleType == SUP_MODULE_USER_DEFINED:\r
- for Record in RecordList:\r
- if Record[4] not in [SUP_MODULE_PEIM, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER]:\r
- EdkLogger.error('build', FORMAT_INVALID,\r
- "'%s' module must specify the type of [Depex] section" % self.ModuleType,\r
- File=self.MetaFile)\r
+ RetVal = tdict(False, 2)\r
+\r
+ # If the module has only Binaries and no Sources, then ignore [Depex]\r
+ if not self.Sources and self.Binaries:\r
+ return RetVal\r
\r
- Depex = OrderedDict()\r
+ RecordList = self._RawData[MODEL_EFI_DEPEX, self._Arch]\r
+ # PEIM and DXE drivers must have a valid [Depex] section\r
+ if len(self.LibraryClass) == 0 and len(RecordList) == 0:\r
+ if self.ModuleType == SUP_MODULE_DXE_DRIVER or self.ModuleType == SUP_MODULE_PEIM or self.ModuleType == SUP_MODULE_DXE_SMM_DRIVER or \\r
+ self.ModuleType == SUP_MODULE_DXE_SAL_DRIVER or self.ModuleType == SUP_MODULE_DXE_RUNTIME_DRIVER:\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "No [Depex] section or no valid expression in [Depex] section for [%s] module" \\r
+ % self.ModuleType, File=self.MetaFile)\r
+\r
+ if len(RecordList) != 0 and self.ModuleType == SUP_MODULE_USER_DEFINED:\r
for Record in RecordList:\r
- DepexStr = ReplaceMacro(Record[0], self._Macros, False)\r
- Arch = Record[3]\r
- ModuleType = Record[4]\r
- TokenList = DepexStr.split()\r
- if (Arch, ModuleType) not in Depex:\r
- Depex[Arch, ModuleType] = []\r
- DepexList = Depex[Arch, ModuleType]\r
- for Token in TokenList:\r
- if Token in DEPEX_SUPPORTED_OPCODE_SET:\r
- DepexList.append(Token)\r
- elif Token.endswith(".inf"): # module file name\r
- ModuleFile = os.path.normpath(Token)\r
- Module = self.BuildDatabase[ModuleFile]\r
- if Module is None:\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "Module is not found in active platform",\r
- ExtraData=Token, File=self.MetaFile, Line=Record[-1])\r
- DepexList.append(Module.Guid)\r
- else:\r
- # it use the Fixed PCD format\r
- if '.' in Token:\r
- if tuple(Token.split('.')[::-1]) not in self.Pcds:\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "PCD [{}] used in [Depex] section should be listed in module PCD section".format(Token), File=self.MetaFile, Line=Record[-1])\r
- else:\r
- if self.Pcds[tuple(Token.split('.')[::-1])].DatumType != TAB_VOID:\r
- EdkLogger.error('build', FORMAT_INVALID, "PCD [{}] used in [Depex] section should be VOID* datum type".format(Token), File=self.MetaFile, Line=Record[-1])\r
- Value = Token\r
- else:\r
- # get the GUID value now\r
- Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
- if Value is None:\r
- Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
- if Value is None:\r
- Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
+ if Record[4] not in [SUP_MODULE_PEIM, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER]:\r
+ EdkLogger.error('build', FORMAT_INVALID,\r
+ "'%s' module must specify the type of [Depex] section" % self.ModuleType,\r
+ File=self.MetaFile)\r
\r
+ TemporaryDictionary = OrderedDict()\r
+ for Record in RecordList:\r
+ DepexStr = ReplaceMacro(Record[0], self._Macros, False)\r
+ Arch = Record[3]\r
+ ModuleType = Record[4]\r
+ TokenList = DepexStr.split()\r
+ if (Arch, ModuleType) not in TemporaryDictionary:\r
+ TemporaryDictionary[Arch, ModuleType] = []\r
+ DepexList = TemporaryDictionary[Arch, ModuleType]\r
+ for Token in TokenList:\r
+ if Token in DEPEX_SUPPORTED_OPCODE_SET:\r
+ DepexList.append(Token)\r
+ elif Token.endswith(".inf"): # module file name\r
+ ModuleFile = os.path.normpath(Token)\r
+ Module = self.BuildDatabase[ModuleFile]\r
+ if Module is None:\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "Module is not found in active platform",\r
+ ExtraData=Token, File=self.MetaFile, Line=Record[-1])\r
+ DepexList.append(Module.Guid)\r
+ else:\r
+ # it use the Fixed PCD format\r
+ if '.' in Token:\r
+ if tuple(Token.split('.')[::-1]) not in self.Pcds:\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "PCD [{}] used in [Depex] section should be listed in module PCD section".format(Token), File=self.MetaFile, Line=Record[-1])\r
+ else:\r
+ if self.Pcds[tuple(Token.split('.')[::-1])].DatumType != TAB_VOID:\r
+ EdkLogger.error('build', FORMAT_INVALID, "PCD [{}] used in [Depex] section should be VOID* datum type".format(Token), File=self.MetaFile, Line=Record[-1])\r
+ Value = Token\r
+ else:\r
+ # get the GUID value now\r
+ Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
if Value is None:\r
- PackageList = "\n\t".join(str(P) for P in self.Packages)\r
- EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
- "Value of [%s] is not found in" % Token,\r
- ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
- DepexList.append(Value)\r
- for Arch, ModuleType in Depex:\r
- self._Depex[Arch, ModuleType] = Depex[Arch, ModuleType]\r
- return self._Depex\r
+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
+ if Value is None:\r
+ Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
+\r
+ if Value is None:\r
+ PackageList = "\n\t".join(str(P) for P in self.Packages)\r
+ EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
+ "Value of [%s] is not found in" % Token,\r
+ ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
+ DepexList.append(Value)\r
+ for Arch, ModuleType in TemporaryDictionary:\r
+ RetVal[Arch, ModuleType] = TemporaryDictionary[Arch, ModuleType]\r
+ return RetVal\r
\r
## Retrieve depedency expression\r
- @property\r
+ @cached_property\r
def DepexExpression(self):\r
- if self._DepexExpression is None:\r
- self._DepexExpression = tdict(False, 2)\r
- RecordList = self._RawData[MODEL_EFI_DEPEX, self._Arch]\r
- DepexExpression = OrderedDict()\r
- for Record in RecordList:\r
- DepexStr = ReplaceMacro(Record[0], self._Macros, False)\r
- Arch = Record[3]\r
- ModuleType = Record[4]\r
- TokenList = DepexStr.split()\r
- if (Arch, ModuleType) not in DepexExpression:\r
- DepexExpression[Arch, ModuleType] = ''\r
- for Token in TokenList:\r
- DepexExpression[Arch, ModuleType] = DepexExpression[Arch, ModuleType] + Token.strip() + ' '\r
- for Arch, ModuleType in DepexExpression:\r
- self._DepexExpression[Arch, ModuleType] = DepexExpression[Arch, ModuleType]\r
- return self._DepexExpression\r
-\r
+ RetVal = tdict(False, 2)\r
+ RecordList = self._RawData[MODEL_EFI_DEPEX, self._Arch]\r
+ TemporaryDictionary = OrderedDict()\r
+ for Record in RecordList:\r
+ DepexStr = ReplaceMacro(Record[0], self._Macros, False)\r
+ Arch = Record[3]\r
+ ModuleType = Record[4]\r
+ TokenList = DepexStr.split()\r
+ if (Arch, ModuleType) not in TemporaryDictionary:\r
+ TemporaryDictionary[Arch, ModuleType] = ''\r
+ for Token in TokenList:\r
+ TemporaryDictionary[Arch, ModuleType] = TemporaryDictionary[Arch, ModuleType] + Token.strip() + ' '\r
+ for Arch, ModuleType in TemporaryDictionary:\r
+ RetVal[Arch, ModuleType] = TemporaryDictionary[Arch, ModuleType]\r
+ return RetVal\r
+\r
+ @cached_class_function\r
def GetGuidsUsedByPcd(self):\r
+ self.Pcds\r
return self._GuidsUsedByPcd\r
\r
## Retrieve PCD for given type\r