X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FWorkspace%2FWorkspaceDatabase.py;h=83f730e62913675e4e8d6dbb081579889de33e15;hp=71e98a94bea556533cc350df3cbaee22872929f5;hb=97fa0ee9b1cffbb4b97ee35365afa7afcf50e174;hpb=0d2711a69397d2971079121df4326d84736c181e diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index 71e98a94be..83f730e629 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -1,7 +1,7 @@ ## @file # This file is used to create a database used by build tool # -# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -15,8 +15,7 @@ # Import Modules # import sqlite3 -import os -import os.path +import Common.LongFilePathOs as os import pickle import uuid @@ -34,6 +33,13 @@ from MetaDataTable import * from MetaFileTable import * from MetaFileParser import * from BuildClassObject import * +from WorkspaceCommon import GetDeclaredPcd +from Common.Misc import AnalyzeDscPcd +from Common.Misc import ProcessDuplicatedInf +import re +from Common.Parsing import IsValidWord + +import Common.GlobalData as GlobalData ## Platform build information from DSC file # @@ -68,7 +74,7 @@ class DscBuildData(PlatformBuildClassObject): #TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory", #TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList", #TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets", - #TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName", + TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName", #TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition", TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber", TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName", @@ -100,6 +106,7 @@ class DscBuildData(PlatformBuildClassObject): self._Target = Target self._Toolchain = Toolchain self._Clear() + self._HandleOverridePath() ## XXX[key] = value def __setitem__(self, key, value): @@ -124,6 +131,8 @@ class DscBuildData(PlatformBuildClassObject): self._SupArchList = None self._BuildTargets = None self._SkuName = None + self._SkuIdentifier = None + self._PcdInfoFlag = None self._FlashDefinition = None self._BuildNumber = None self._MakefileName = None @@ -134,6 +143,7 @@ class DscBuildData(PlatformBuildClassObject): self._LibraryInstances = None self._LibraryClasses = None self._Pcds = None + self._DecPcds = None self._BuildOptions = None self._LoadFixAddress = None self._RFCLanguages = None @@ -141,6 +151,27 @@ class DscBuildData(PlatformBuildClassObject): self._VpdToolGuid = None self.__Macros = None + + ## handle Override Path of Module + def _HandleOverridePath(self): + RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch] + Macros = self._Macros + Macros["EDK_SOURCE"] = GlobalData.gEcpSource + for Record in RecordList: + ModuleId = Record[5] + LineNo = Record[6] + ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch) + RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId] + if RecordList != []: + SourceOverridePath = os.path.join(GlobalData.gWorkspace, NormPath(RecordList[0][0])) + + # Check if the source override path exists + if not os.path.isdir(SourceOverridePath): + EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo) + + #Add to GlobalData Variables + GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath + ## Get current effective macros def _GetMacros(self): if self.__Macros == None: @@ -178,10 +209,9 @@ class DscBuildData(PlatformBuildClassObject): for Record in RecordList: Name = Record[1] # items defined _PROPERTY_ don't need additional processing - if Name in self: - self[Name] = Record[2] + # some special items in [Defines] section need special treatment - elif Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY: + if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY: self._OutputDirectory = NormPath(Record[2], self._Macros) if ' ' in self._OutputDirectory: EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY", @@ -200,6 +230,9 @@ class DscBuildData(PlatformBuildClassObject): elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER: if self._SkuName == None: self._SkuName = Record[2] + self._SkuIdentifier = Record[2] + elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION: + self._PcdInfoFlag = Record[2] elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS: try: self._LoadFixAddress = int (Record[2], 0) @@ -244,6 +277,8 @@ class DscBuildData(PlatformBuildClassObject): except: EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile) self._VpdToolGuid = Record[2] + elif Name in self: + self[Name] = Record[2] # set _Header to non-None in order to avoid database re-querying self._Header = 'DUMMY' @@ -262,7 +297,7 @@ class DscBuildData(PlatformBuildClassObject): if self._Header == None: self._GetHeaderInfo() if self._Guid == None: - EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No FILE_GUID", File=self.MetaFile) + EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile) return self._Guid ## Retrieve platform version @@ -271,7 +306,7 @@ class DscBuildData(PlatformBuildClassObject): if self._Header == None: self._GetHeaderInfo() if self._Version == None: - self._Version = '' + EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile) return self._Version ## Retrieve platform description file version @@ -280,7 +315,7 @@ class DscBuildData(PlatformBuildClassObject): if self._Header == None: self._GetHeaderInfo() if self._DscSpecification == None: - self._DscSpecification = '' + EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile) return self._DscSpecification ## Retrieve OUTPUT_DIRECTORY @@ -298,7 +333,7 @@ class DscBuildData(PlatformBuildClassObject): if self._Header == None: self._GetHeaderInfo() if self._SupArchList == None: - self._SupArchList = ARCH_LIST + EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile) return self._SupArchList ## Retrieve BUILD_TARGETS @@ -307,24 +342,37 @@ class DscBuildData(PlatformBuildClassObject): if self._Header == None: self._GetHeaderInfo() if self._BuildTargets == None: - self._BuildTargets = ['DEBUG', 'RELEASE', 'NOOPT'] + EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile) return self._BuildTargets - + + def _GetPcdInfoFlag(self): + if self._PcdInfoFlag == None or self._PcdInfoFlag.upper() == 'FALSE': + return False + elif self._PcdInfoFlag.upper() == 'TRUE': + return True + else: + return False + + def _GetSkuIdentifier(self): + if self._SkuName: + return self._SkuName + if self._SkuIdentifier == None: + if self._Header == None: + self._GetHeaderInfo() + return self._SkuIdentifier ## Retrieve SKUID_IDENTIFIER def _GetSkuName(self): if self._SkuName == None: if self._Header == None: self._GetHeaderInfo() - if self._SkuName == None or self._SkuName not in self.SkuIds: + if (self._SkuName == None or self._SkuName not in self.SkuIds): self._SkuName = 'DEFAULT' return self._SkuName ## Override SKUID_IDENTIFIER def _SetSkuName(self, Value): - if Value in self.SkuIds: - self._SkuName = Value - # Needs to re-retrieve the PCD information - self._Pcds = None + self._SkuName = Value + self._Pcds = None def _GetFdfFile(self): if self._FlashDefinition == None: @@ -383,10 +431,21 @@ class DscBuildData(PlatformBuildClassObject): self._LoadFixAddress = int (self._LoadFixAddress, 0) except: EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress)) - if self._LoadFixAddress < 0: - EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value %s" % (self._LoadFixAddress)) - if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0: - EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value %s" % (self._LoadFixAddress)) + + # + # If command line defined, should override the value in DSC file. + # + if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines.keys(): + try: + self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0) + except: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'])) + + if self._LoadFixAddress < 0: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress)) + if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress)) + return self._LoadFixAddress ## Retrieve RFCLanguage filter @@ -429,7 +488,9 @@ class DscBuildData(PlatformBuildClassObject): File=self.MetaFile, Line=Record[-1]) self._SkuIds[Record[1]] = Record[0] if 'DEFAULT' not in self._SkuIds: - self._SkuIds['DEFAULT'] = 0 + self._SkuIds['DEFAULT'] = '0' + if 'COMMON' not in self._SkuIds: + self._SkuIds['COMMON'] = '0' return self._SkuIds ## Retrieve [Components] section information @@ -442,6 +503,7 @@ class DscBuildData(PlatformBuildClassObject): Macros = self._Macros Macros["EDK_SOURCE"] = GlobalData.gEcpSource for Record in RecordList: + DuplicatedFile = False ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch) ModuleId = Record[5] LineNo = Record[6] @@ -452,24 +514,13 @@ class DscBuildData(PlatformBuildClassObject): EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo, ExtraData=ErrorInfo) # Check duplication - if ModuleFile in self._Modules: - EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo) + # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected + if self._Arch != 'COMMON' and ModuleFile in self._Modules: + DuplicatedFile = True Module = ModuleBuildClassObject() Module.MetaFile = ModuleFile - # get module override path - RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId] - if RecordList != []: - Module.SourceOverridePath = os.path.join(GlobalData.gWorkspace, NormPath(RecordList[0][0], Macros)) - - # Check if the source override path exists - if not os.path.isdir(Module.SourceOverridePath): - EdkLogger.error('build', FILE_NOT_FOUND, Message = 'Source override path does not exist:', File=self.MetaFile, ExtraData=Module.SourceOverridePath, Line=LineNo) - - #Add to GlobalData Variables - GlobalData.gOverrideDir[ModuleFile.Key] = Module.SourceOverridePath - # get module private library instance RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId] for Record in RecordList: @@ -526,6 +577,16 @@ class DscBuildData(PlatformBuildClassObject): OptionString = Module.BuildOptions[ToolChainFamily, ToolChain] Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option + RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId] + if DuplicatedFile and not RecordList: + EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo) + if RecordList: + if len(RecordList) != 1: + EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in section.', + File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo) + ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace) + ModuleFile.Arch = self._Arch + self._Modules[ModuleFile] = Module return self._Modules @@ -601,6 +662,63 @@ class DscBuildData(PlatformBuildClassObject): self._LibraryClasses[Library.BaseName, ':dummy:'] = Library return self._LibraryClasses + def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo): + if self._DecPcds == None: + self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain) + FdfInfList = [] + if GlobalData.gFdfParser: + FdfInfList = GlobalData.gFdfParser.Profile.InfList + + PkgSet = set() + for Inf in FdfInfList: + ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) + if ModuleFile in self._Modules: + continue + ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain] + PkgSet.update(ModuleData.Packages) + DecPcds = {} + for Pkg in PkgSet: + for Pcd in Pkg.Pcds: + DecPcds[Pcd[0], Pcd[1]] = Pkg.Pcds[Pcd] + self._DecPcds.update(DecPcds) + + if (PcdCName, TokenSpaceGuid) not in self._DecPcds: + EdkLogger.error('build', PARSER_ERROR, + "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch), + File=self.MetaFile, Line=LineNo) + ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType) + if not IsValid and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: + EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo, + ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) + if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: + try: + ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True) + except WrnExpression, Value: + ValueList[Index] = Value.result + except EvaluationException, Excpt: + if hasattr(Excpt, 'Pcd'): + if Excpt.Pcd in GlobalData.gPlatformOtherPcds: + EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as" + " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section" + " of the DSC file" % Excpt.Pcd, + File=self.MetaFile, Line=LineNo) + else: + EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd, + File=self.MetaFile, Line=LineNo) + else: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), + File=self.MetaFile, Line=LineNo) + if ValueList[Index] == 'True': + ValueList[Index] = '1' + elif ValueList[Index] == 'False': + ValueList[Index] = '0' + if ValueList[Index]: + Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index]) + if not Valid: + EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo, + ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName)) + return ValueList + ## Retrieve all PCD settings in platform def _GetPcds(self): if self._Pcds == None: @@ -646,19 +764,44 @@ class DscBuildData(PlatformBuildClassObject): # tdict is a special dict kind of type, used for selecting correct # PCD settings for certain ARCH # + + SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds) + PcdDict = tdict(True, 3) PcdSet = set() # Find out all possible PCD candidates for self._Arch RecordList = self._RawData[Type, self._Arch] + PcdValueDict = sdict() for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: - PcdSet.add((PcdCName, TokenSpaceGuid)) - PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting - # Remove redundant PCD candidates - for PcdCName, TokenSpaceGuid in PcdSet: - Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid] + if SkuName in (SkuObj.SystemSkuId,'DEFAULT','COMMON'): + PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4)) + PcdDict[Arch, PcdCName, TokenSpaceGuid,SkuName] = Setting + + #handle pcd value override + for PcdCName, TokenSpaceGuid, SkuName,Dummy4 in PcdSet: + Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid,SkuName] if Setting == None: continue - PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting) + PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) + if (PcdCName, TokenSpaceGuid) in PcdValueDict: + PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue,DatumType,MaxDatumSize) + else: + PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue,DatumType,MaxDatumSize)} + + PcdsKeys = PcdValueDict.keys() + for PcdCName,TokenSpaceGuid in PcdsKeys: + + PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid] + PcdValue = None + DatumType = None + MaxDatumSize = None + if 'COMMON' in PcdSetting: + PcdValue,DatumType,MaxDatumSize = PcdSetting['COMMON'] + if 'DEFAULT' in PcdSetting: + PcdValue,DatumType,MaxDatumSize = PcdSetting['DEFAULT'] + if SkuObj.SystemSkuId in PcdSetting: + PcdValue,DatumType,MaxDatumSize = PcdSetting[SkuObj.SystemSkuId] + Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( PcdCName, TokenSpaceGuid, @@ -680,6 +823,9 @@ class DscBuildData(PlatformBuildClassObject): # @retval a dict object contains settings of given PCD type # def _GetDynamicPcd(self, Type): + + SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds) + Pcds = sdict() # # tdict is a special dict kind of type, used for selecting correct @@ -689,30 +835,67 @@ class DscBuildData(PlatformBuildClassObject): PcdList = [] # Find out all possible PCD candidates for self._Arch RecordList = self._RawData[Type, self._Arch] + AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() + + AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0}) for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: - PcdList.append((PcdCName, TokenSpaceGuid)) + if SkuName not in AvailableSkuIdSet: + continue + + PcdList.append((PcdCName, TokenSpaceGuid, SkuName,Dummy4)) PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting # Remove redundant PCD candidates, per the ARCH and SKU - for PcdCName, TokenSpaceGuid in PcdList: - Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid] + for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList: + + Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid] if Setting == None: continue - PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting) - - SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', '', PcdValue) - Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( - PcdCName, - TokenSpaceGuid, - self._PCD_TYPE_STRING_[Type], - DatumType, - PcdValue, - '', - MaxDatumSize, - {self.SkuName : SkuInfo}, - False, - None - ) + PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) + SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', '', PcdValue) + if (PcdCName,TokenSpaceGuid) in Pcds.keys(): + pcdObject = Pcds[PcdCName,TokenSpaceGuid] + pcdObject.SkuInfoList[SkuName] = SkuInfo + if MaxDatumSize.strip(): + CurrentMaxSize = int(MaxDatumSize.strip(),0) + else: + CurrentMaxSize = 0 + if pcdObject.MaxDatumSize: + PcdMaxSize = int(pcdObject.MaxDatumSize,0) + else: + PcdMaxSize = 0 + if CurrentMaxSize > PcdMaxSize: + pcdObject.MaxDatumSize = str(CurrentMaxSize) + else: + Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( + PcdCName, + TokenSpaceGuid, + self._PCD_TYPE_STRING_[Type], + DatumType, + PcdValue, + '', + MaxDatumSize, + {SkuName : SkuInfo}, + False, + None + ) + + for pcd in Pcds.values(): + pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName] + if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys(): + valuefromDec = pcdDecObject.DefaultValue + SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec) + pcd.SkuInfoList['DEFAULT'] = SkuInfo + elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON'] + del(pcd.SkuInfoList['COMMON']) + elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + del(pcd.SkuInfoList['COMMON']) + if SkuObj.SkuUsageType == SkuObj.SINGLE: + if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): + pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] + del(pcd.SkuInfoList['DEFAULT']) + return Pcds ## Retrieve dynamic HII PCD settings @@ -722,6 +905,9 @@ class DscBuildData(PlatformBuildClassObject): # @retval a dict object contains settings of given PCD type # def _GetDynamicHiiPcd(self, Type): + + SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds) + Pcds = sdict() # # tdict is a special dict kind of type, used for selecting correct @@ -731,17 +917,51 @@ class DscBuildData(PlatformBuildClassObject): PcdSet = set() RecordList = self._RawData[Type, self._Arch] # Find out all possible PCD candidates for self._Arch + AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() + + AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0}) for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: - PcdSet.add((PcdCName, TokenSpaceGuid)) + if SkuName not in AvailableSkuIdSet: + continue + PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4)) PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting # Remove redundant PCD candidates, per the ARCH and SKU - for PcdCName, TokenSpaceGuid in PcdSet: - Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid] + for PcdCName, TokenSpaceGuid,SkuName, Dummy4 in PcdSet: + + Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid] if Setting == None: continue - VariableName, VariableGuid, VariableOffset, DefaultValue = AnalyzeHiiPcdData(Setting) - SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue) - Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( + VariableName, VariableGuid, VariableOffset, DefaultValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) + + ExceedMax = False + FormatCorrect = True + if VariableOffset.isdigit(): + if int(VariableOffset,10) > 0xFFFF: + ExceedMax = True + elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$',VariableOffset): + if int(VariableOffset,16) > 0xFFFF: + ExceedMax = True + # For Offset written in "A.B" + elif VariableOffset.find('.') > -1: + VariableOffsetList = VariableOffset.split(".") + if not (len(VariableOffsetList) == 2 + and IsValidWord(VariableOffsetList[0]) + and IsValidWord(VariableOffsetList[1])): + FormatCorrect = False + else: + FormatCorrect = False + if not FormatCorrect: + EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid,PcdCName))) + + if ExceedMax: + EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid,PcdCName))) + + SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue) + if (PcdCName,TokenSpaceGuid) in Pcds.keys(): + pcdObject = Pcds[PcdCName,TokenSpaceGuid] + pcdObject.SkuInfoList[SkuName] = SkuInfo + else: + Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( PcdCName, TokenSpaceGuid, self._PCD_TYPE_STRING_[Type], @@ -749,10 +969,51 @@ class DscBuildData(PlatformBuildClassObject): DefaultValue, '', '', - {self.SkuName : SkuInfo}, + {SkuName : SkuInfo}, False, None ) + + + for pcd in Pcds.values(): + SkuInfoObj = pcd.SkuInfoList.values()[0] + pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName] + # Only fix the value while no value provided in DSC file. + for sku in pcd.SkuInfoList.values(): + if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue==None): + sku.HiiDefaultValue = pcdDecObject.DefaultValue + if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys(): + valuefromDec = pcdDecObject.DefaultValue + SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec) + pcd.SkuInfoList['DEFAULT'] = SkuInfo + elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON'] + del(pcd.SkuInfoList['COMMON']) + elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + del(pcd.SkuInfoList['COMMON']) + + if SkuObj.SkuUsageType == SkuObj.SINGLE: + if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): + pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] + del(pcd.SkuInfoList['DEFAULT']) + + + if pcd.MaxDatumSize.strip(): + MaxSize = int(pcd.MaxDatumSize,0) + else: + MaxSize = 0 + if pcdDecObject.DatumType == 'VOID*': + for (skuname,skuobj) in pcd.SkuInfoList.items(): + datalen = 0 + if skuobj.HiiDefaultValue.startswith("L"): + datalen = (len(skuobj.HiiDefaultValue)- 3 + 1) * 2 + elif skuobj.HiiDefaultValue.startswith("{"): + datalen = len(skuobj.HiiDefaultValue.split(",")) + else: + datalen = len(skuobj.HiiDefaultValue) -2 + 1 + if datalen>MaxSize: + MaxSize = datalen + pcd.MaxDatumSize = str(MaxSize) return Pcds ## Retrieve dynamic VPD PCD settings @@ -762,6 +1023,9 @@ class DscBuildData(PlatformBuildClassObject): # @retval a dict object contains settings of given PCD type # def _GetDynamicVpdPcd(self, Type): + + SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds) + Pcds = sdict() # # tdict is a special dict kind of type, used for selecting correct @@ -771,12 +1035,18 @@ class DscBuildData(PlatformBuildClassObject): PcdList = [] # Find out all possible PCD candidates for self._Arch RecordList = self._RawData[Type, self._Arch] + AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() + + AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0}) for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: - PcdList.append((PcdCName, TokenSpaceGuid)) + if SkuName not in AvailableSkuIdSet: + continue + + PcdList.append((PcdCName, TokenSpaceGuid,SkuName, Dummy4)) PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting # Remove redundant PCD candidates, per the ARCH and SKU - for PcdCName, TokenSpaceGuid in PcdList: - Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid] + for PcdCName, TokenSpaceGuid, SkuName,Dummy4 in PcdList: + Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid] if Setting == None: continue # @@ -785,10 +1055,23 @@ class DscBuildData(PlatformBuildClassObject): # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype # until the DEC parser has been called. # - VpdOffset, MaxDatumSize, InitialValue = AnalyzeVpdPcdData(Setting) - - SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset, InitialValue) - Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( + VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) + SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', VpdOffset, InitialValue) + if (PcdCName,TokenSpaceGuid) in Pcds.keys(): + pcdObject = Pcds[PcdCName,TokenSpaceGuid] + pcdObject.SkuInfoList[SkuName] = SkuInfo + if MaxDatumSize.strip(): + CurrentMaxSize = int(MaxDatumSize.strip(),0) + else: + CurrentMaxSize = 0 + if pcdObject.MaxDatumSize: + PcdMaxSize = int(pcdObject.MaxDatumSize,0) + else: + PcdMaxSize = 0 + if CurrentMaxSize > PcdMaxSize: + pcdObject.MaxDatumSize = str(CurrentMaxSize) + else: + Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( PcdCName, TokenSpaceGuid, self._PCD_TYPE_STRING_[Type], @@ -796,10 +1079,27 @@ class DscBuildData(PlatformBuildClassObject): '', '', MaxDatumSize, - {self.SkuName : SkuInfo}, + {SkuName : SkuInfo}, False, None ) + for pcd in Pcds.values(): + SkuInfoObj = pcd.SkuInfoList.values()[0] + pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName] + if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys(): + valuefromDec = pcdDecObject.DefaultValue + SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '','',SkuInfoObj.VpdOffset, valuefromDec) + pcd.SkuInfoList['DEFAULT'] = SkuInfo + elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON'] + del(pcd.SkuInfoList['COMMON']) + elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): + del(pcd.SkuInfoList['COMMON']) + if SkuObj.SkuUsageType == SkuObj.SINGLE: + if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): + pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] + del(pcd.SkuInfoList['DEFAULT']) + return Pcds ## Add external modules @@ -841,6 +1141,8 @@ class DscBuildData(PlatformBuildClassObject): SupArchList = property(_GetSupArch) BuildTargets = property(_GetBuildTarget) SkuName = property(_GetSkuName, _SetSkuName) + SkuIdentifier = property(_GetSkuIdentifier) + PcdInfoFlag = property(_GetPcdInfoFlag) FlashDefinition = property(_GetFdfFile) BuildNumber = property(_GetBuildNumber) MakefileName = property(_GetMakefileName) @@ -1303,6 +1605,8 @@ class InfBuildData(ModuleBuildClassObject): ## Set all internal used members of InfBuildData to None def _Clear(self): + self._HeaderComments = None + self._TailComments = None self._Header_ = None self._AutoGenVersion = None self._BaseName = None @@ -1329,11 +1633,16 @@ class InfBuildData(ModuleBuildClassObject): self._LibraryClasses = None self._Libraries = None self._Protocols = None + self._ProtocolComments = None self._Ppis = None + self._PpiComments = None self._Guids = None + self._GuidsUsedByPcd = sdict() + self._GuidComments = None self._Includes = None self._Packages = None self._Pcds = None + self._PcdComments = None self._BuildOptions = None self._Depex = None self._DepexExpression = None @@ -1343,10 +1652,10 @@ class InfBuildData(ModuleBuildClassObject): def _GetMacros(self): if self.__Macros == None: self.__Macros = {} - # EDK_GLOBAL defined macros can be applied to EDK modoule + # EDK_GLOBAL defined macros can be applied to EDK module if self.AutoGenVersion < 0x00010005: self.__Macros.update(GlobalData.gEdkGlobal) - self.__Macros.update(GlobalData.gGlobalDefines) + self.__Macros.update(GlobalData.gGlobalDefines) return self.__Macros ## Get architecture @@ -1383,7 +1692,20 @@ class InfBuildData(ModuleBuildClassObject): return self._Platform = Value self._Clear() - + def _GetHeaderComments(self): + if not self._HeaderComments: + self._HeaderComments = [] + RecordList = self._RawData[MODEL_META_DATA_HEADER_COMMENT] + for Record in RecordList: + self._HeaderComments.append(Record[0]) + return self._HeaderComments + def _GetTailComments(self): + if not self._TailComments: + self._TailComments = [] + RecordList = self._RawData[MODEL_META_DATA_TAIL_COMMENT] + for Record in RecordList: + self._TailComments.append(Record[0]) + return self._TailComments ## Retrieve all information in [Defines] section # # (Retriving all [Defines] information in one-shot is just to save time.) @@ -1395,6 +1717,9 @@ class InfBuildData(ModuleBuildClassObject): # items defined _PROPERTY_ don't need additional processing if Name in self: self[Name] = Value + if self._Defs == None: + self._Defs = sdict() + self._Defs[Name] = Value # some special items in [Defines] section need special treatment elif Name in ('EFI_SPECIFICATION_VERSION', 'UEFI_SPECIFICATION_VERSION', 'EDK_RELEASE_VERSION', 'PI_SPECIFICATION_VERSION'): if Name in ('EFI_SPECIFICATION_VERSION', 'UEFI_SPECIFICATION_VERSION'): @@ -1727,7 +2052,7 @@ class InfBuildData(ModuleBuildClassObject): return self._Defs ## Retrieve binary files - def _GetBinaryFiles(self): + def _GetBinaries(self): if self._Binaries == None: self._Binaries = [] RecordList = self._RawData[MODEL_EFI_BINARY_FILE, self._Arch, self._Platform] @@ -1754,14 +2079,31 @@ class InfBuildData(ModuleBuildClassObject): self._Binaries.append(File) return self._Binaries + ## Retrieve binary files with error check. + def _GetBinaryFiles(self): + Binaries = self._GetBinaries() + if GlobalData.gIgnoreSource and Binaries == []: + ErrorInfo = "The INF file does not contain any Binaries to use in creating the image\n" + EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, ExtraData=ErrorInfo, File=self.MetaFile) + + return Binaries + ## Check whether it exists the binaries with current ARCH in AsBuild INF + def _IsSupportedArch(self): + if self._GetBinaries() and not self._GetSourceFiles(): + return True + else: + return False ## Retrieve source files def _GetSourceFiles(self): + #Ignore all source files in a binary build mode + if GlobalData.gIgnoreSource: + self._Sources = [] + return self._Sources + if self._Sources == None: self._Sources = [] RecordList = self._RawData[MODEL_EFI_SOURCE_FILE, self._Arch, self._Platform] Macros = self._Macros - Macros["EDK_SOURCE"] = GlobalData.gEcpSource - Macros['PROCESSOR'] = self._Arch for Record in RecordList: LineNo = Record[-1] ToolChainFamily = Record[1] @@ -1769,6 +2111,8 @@ class InfBuildData(ModuleBuildClassObject): ToolCode = Record[3] FeatureFlag = Record[4] if self.AutoGenVersion < 0x00010005: + Macros["EDK_SOURCE"] = GlobalData.gEcpSource + Macros['PROCESSOR'] = self._Arch # old module source files (Edk) File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, self._SourceOverridePath, '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode) @@ -1818,10 +2162,14 @@ class InfBuildData(ModuleBuildClassObject): self._Libraries.append(LibraryName) return self._Libraries + def _GetProtocolComments(self): + self._GetProtocols() + return self._ProtocolComments ## Retrieve protocols consumed/produced by this module def _GetProtocols(self): if self._Protocols == None: self._Protocols = sdict() + self._ProtocolComments = sdict() RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform] for Record in RecordList: CName = Record[0] @@ -1832,12 +2180,21 @@ class InfBuildData(ModuleBuildClassObject): "Value of Protocol [%s] is not found under [Protocols] section in" % CName, ExtraData=PackageList, File=self.MetaFile, Line=Record[-1]) self._Protocols[CName] = Value + CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]] + Comments = [] + for CmtRec in CommentRecords: + Comments.append(CmtRec[0]) + self._ProtocolComments[CName] = Comments return self._Protocols + def _GetPpiComments(self): + self._GetPpis() + return self._PpiComments ## Retrieve PPIs consumed/produced by this module def _GetPpis(self): if self._Ppis == None: self._Ppis = sdict() + self._PpiComments = sdict() RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform] for Record in RecordList: CName = Record[0] @@ -1848,12 +2205,21 @@ class InfBuildData(ModuleBuildClassObject): "Value of PPI [%s] is not found under [Ppis] section in " % CName, ExtraData=PackageList, File=self.MetaFile, Line=Record[-1]) self._Ppis[CName] = Value + CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]] + Comments = [] + for CmtRec in CommentRecords: + Comments.append(CmtRec[0]) + self._PpiComments[CName] = Comments return self._Ppis + def _GetGuidComments(self): + self._GetGuids() + return self._GuidComments ## Retrieve GUIDs consumed/produced by this module def _GetGuids(self): if self._Guids == None: self._Guids = sdict() + self._GuidComments = sdict() RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform] for Record in RecordList: CName = Record[0] @@ -1864,6 +2230,11 @@ class InfBuildData(ModuleBuildClassObject): "Value of Guid [%s] is not found under [Guids] section in" % CName, ExtraData=PackageList, File=self.MetaFile, Line=Record[-1]) self._Guids[CName] = Value + CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]] + Comments = [] + for CmtRec in CommentRecords: + Comments.append(CmtRec[0]) + self._GuidComments[CName] = Comments return self._Guids ## Retrieve include paths necessary for this module (for Edk.x style of modules) @@ -1931,10 +2302,15 @@ class InfBuildData(ModuleBuildClassObject): self._Packages.append(Package) return self._Packages + ## Retrieve PCD comments + def _GetPcdComments(self): + self._GetPcds() + return self._PcdComments ## Retrieve PCDs used in this module def _GetPcds(self): if self._Pcds == None: self._Pcds = sdict() + self._PcdComments = sdict() self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD)) self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE)) self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG)) @@ -1977,6 +2353,13 @@ class InfBuildData(ModuleBuildClassObject): EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "No [Depex] section or no valid expression in [Depex] section for [%s] module" \ % self.ModuleType, File=self.MetaFile) + if len(RecordList) != 0 and self.ModuleType == 'USER_DEFINED': + for Record in RecordList: + if Record[4] not in ['PEIM', 'DXE_DRIVER', 'DXE_SMM_DRIVER']: + EdkLogger.error('build', FORMAT_INVALID, + "'%s' module must specify the type of [Depex] section" % self.ModuleType, + File=self.MetaFile) + Depex = sdict() for Record in RecordList: DepexStr = ReplaceMacro(Record[0], self._Macros, False) @@ -2032,13 +2415,15 @@ class InfBuildData(ModuleBuildClassObject): self._DepexExpression[Arch, ModuleType] = DepexExpression[Arch, ModuleType] return self._DepexExpression + def GetGuidsUsedByPcd(self): + return self._GuidsUsedByPcd ## Retrieve PCD for given type def _GetPcd(self, Type): Pcds = sdict() PcdDict = tdict(True, 4) PcdList = [] RecordList = self._RawData[Type, self._Arch, self._Platform] - for TokenSpaceGuid, PcdCName, Setting, Arch, Platform, Dummy1, LineNo in RecordList: + for TokenSpaceGuid, PcdCName, Setting, Arch, Platform, Id, LineNo in RecordList: PcdDict[Arch, Platform, PcdCName, TokenSpaceGuid] = (Setting, LineNo) PcdList.append((PcdCName, TokenSpaceGuid)) # get the guid value @@ -2050,6 +2435,12 @@ class InfBuildData(ModuleBuildClassObject): "Value of Guid [%s] is not found under [Guids] section in" % TokenSpaceGuid, ExtraData=PackageList, File=self.MetaFile, Line=LineNo) self.Guids[TokenSpaceGuid] = Value + self._GuidsUsedByPcd[TokenSpaceGuid] = Value + CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Id] + Comments = [] + for CmtRec in CommentRecords: + Comments.append(CmtRec[0]) + self._PcdComments[TokenSpaceGuid, PcdCName] = Comments # resolve PCD type, value, datum info, etc. by getting its definition from package for PcdCName, TokenSpaceGuid in PcdList: @@ -2070,6 +2461,9 @@ class InfBuildData(ModuleBuildClassObject): False, self.Guids[TokenSpaceGuid] ) + if Type == MODEL_PCD_PATCHABLE_IN_MODULE and ValueList[1]: + # Patch PCD: TokenSpace.PcdCName|Value|Offset + Pcd.Offset = ValueList[1] # get necessary info from package declaring this PCD for Package in self.Packages: @@ -2161,10 +2555,21 @@ class InfBuildData(ModuleBuildClassObject): return Pcds - _Macros = property(_GetMacros) - Arch = property(_GetArch, _SetArch) - Platform = property(_GetPlatform, _SetPlatform) + ## check whether current module is binary module + def _IsBinaryModule(self): + if self.Binaries and not self.Sources: + return True + elif GlobalData.gIgnoreSource: + return True + else: + return False + + _Macros = property(_GetMacros) + Arch = property(_GetArch, _SetArch) + Platform = property(_GetPlatform, _SetPlatform) + HeaderComments = property(_GetHeaderComments) + TailComments = property(_GetTailComments) AutoGenVersion = property(_GetInfVersion) BaseName = property(_GetBaseName) ModuleType = property(_GetModuleType) @@ -2189,14 +2594,20 @@ class InfBuildData(ModuleBuildClassObject): LibraryClasses = property(_GetLibraryClassUses) Libraries = property(_GetLibraryNames) Protocols = property(_GetProtocols) + ProtocolComments = property(_GetProtocolComments) Ppis = property(_GetPpis) + PpiComments = property(_GetPpiComments) Guids = property(_GetGuids) + GuidComments = property(_GetGuidComments) Includes = property(_GetIncludes) Packages = property(_GetPackages) Pcds = property(_GetPcds) + PcdComments = property(_GetPcdComments) BuildOptions = property(_GetBuildOptions) Depex = property(_GetDepex) DepexExpression = property(_GetDepexExpression) + IsBinaryModule = property(_IsBinaryModule) + IsSupportedArch = property(_IsSupportedArch) ## Database # @@ -2210,8 +2621,6 @@ class InfBuildData(ModuleBuildClassObject): # class WorkspaceDatabase(object): - # default database file path - _DB_PATH_ = "Conf/.cache/build.db" # # internal class used for call corresponding file parser and caching the result @@ -2322,7 +2731,7 @@ class WorkspaceDatabase(object): def __init__(self, DbPath, RenewDb=False): self._DbClosedFlag = False if not DbPath: - DbPath = os.path.normpath(os.path.join(GlobalData.gWorkspace, self._DB_PATH_)) + DbPath = os.path.normpath(os.path.join(GlobalData.gWorkspace, 'Conf', GlobalData.gDatabasePath)) # don't create necessary path for db in memory if DbPath != ':memory:':