X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FWorkspace%2FWorkspaceDatabase.py;h=b2c4d6e4dafbf7657b2ef202eaebb0b9adbdc3f1;hb=0b42d7d8a34a99a02becf4dece78481d3cd2b2fc;hp=6c1d518f6580f38b2cd1c5cbf29859e23d48c0da;hpb=1ba5124ed0ff033cf6c95f62c84987ee3e9d29f4;p=mirror_edk2.git diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index 6c1d518f65..b2c4d6e4da 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 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2016, 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 @@ -21,6 +21,7 @@ import uuid import Common.EdkLogger as EdkLogger import Common.GlobalData as GlobalData +from Common.MultipleWorkspace import MultipleWorkspace as mws from Common.String import * from Common.DataType import * @@ -136,6 +137,8 @@ class DscBuildData(PlatformBuildClassObject): self._PcdInfoFlag = None self._VarCheckFlag = None self._FlashDefinition = None + self._Prebuild = None + self._Postbuild = None self._BuildNumber = None self._MakefileName = None self._BsBaseAddress = None @@ -166,7 +169,7 @@ class DscBuildData(PlatformBuildClassObject): 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])) + SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0])) # Check if the source override path exists if not os.path.isdir(SourceOverridePath): @@ -226,6 +229,10 @@ class DscBuildData(PlatformBuildClassObject): if ErrorCode != 0: EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1], ExtraData=ErrorInfo) + elif Name == TAB_DSC_PREBUILD: + self._Prebuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace) + elif Name == TAB_DSC_POSTBUILD: + self._Postbuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace) elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES: self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT) elif Name == TAB_DSC_DEFINES_BUILD_TARGETS: @@ -398,6 +405,22 @@ class DscBuildData(PlatformBuildClassObject): self._FlashDefinition = '' return self._FlashDefinition + def _GetPrebuild(self): + if self._Prebuild == None: + if self._Header == None: + self._GetHeaderInfo() + if self._Prebuild == None: + self._Prebuild = '' + return self._Prebuild + + def _GetPostbuild(self): + if self._Postbuild == None: + if self._Header == None: + self._GetHeaderInfo() + if self._Postbuild == None: + self._Postbuild = '' + return self._Postbuild + ## Retrieve FLASH_DEFINITION def _GetBuildNumber(self): if self._BuildNumber == None: @@ -753,7 +776,6 @@ class DscBuildData(PlatformBuildClassObject): ## Retrieve [BuildOptions] def _GetBuildOptions(self): if self._BuildOptions == None: - OverrideTool = set() self._BuildOptions = sdict() # # Retrieve build option for EDKII and EDK style module @@ -762,12 +784,10 @@ class DscBuildData(PlatformBuildClassObject): RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase] for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: CurKey = (ToolChainFamily, ToolChain, CodeBase) - if Option.startswith('='): - OverrideTool.add(CurKey) # # Only flags can be appended # - if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or CurKey in OverrideTool: + if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='): self._BuildOptions[CurKey] = Option else: self._BuildOptions[CurKey] += ' ' + Option @@ -778,16 +798,13 @@ class DscBuildData(PlatformBuildClassObject): self._ModuleTypeOptions = sdict() if (Edk, ModuleType) not in self._ModuleTypeOptions: options = sdict() - OverrideTool = set() self._ModuleTypeOptions[Edk, ModuleType] = options DriverType = '%s.%s' % (Edk, ModuleType) RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType] for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList: - if Arch == self._Arch and Type == DriverType: + if Type == DriverType: Key = (ToolChainFamily, ToolChain, Edk) - if Option.startswith('='): - OverrideTool.add(Key) - if Key not in options or not ToolChain.endswith('_FLAGS') or Key in OverrideTool: + if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='): options[Key] = Option else: options[Key] += ' ' + Option @@ -1142,7 +1159,7 @@ class DscBuildData(PlatformBuildClassObject): TokenSpaceGuid, self._PCD_TYPE_STRING_[Type], '', - '', + InitialValue, '', MaxDatumSize, {SkuName : SkuInfo}, @@ -1212,6 +1229,8 @@ class DscBuildData(PlatformBuildClassObject): PcdInfoFlag = property(_GetPcdInfoFlag) VarCheckFlag = property(_GetVarCheckFlag) FlashDefinition = property(_GetFdfFile) + Prebuild = property(_GetPrebuild) + Postbuild = property(_GetPostbuild) BuildNumber = property(_GetBuildNumber) MakefileName = property(_GetMakefileName) BsBaseAddress = property(_GetBsBaseAddress) @@ -1868,11 +1887,11 @@ class InfBuildData(ModuleBuildClassObject): LineNo = Record[6] break EdkLogger.error("build", FORMAT_NOT_SUPPORTED, - "MODULE_TYPE %s is not supported for EDK II, valid values are:\n %s" % (self._ModuleType,' '.join(l for l in SUP_MODULE_LIST)), + "MODULE_TYPE %s is not supported for EDK II, valid values are:\n %s" % (self._ModuleType, ' '.join(l for l in SUP_MODULE_LIST)), File=self.MetaFile, Line=LineNo) if (self._Specification == None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x0001000A): if self._ModuleType == SUP_MODULE_SMM_CORE: - EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.MetaFile) + EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.MetaFile) if self._Defs and 'PCI_DEVICE_ID' in self._Defs and 'PCI_VENDOR_ID' in self._Defs \ and 'PCI_CLASS_CODE' in self._Defs: self._BuildType = 'UEFI_OPTIONROM' @@ -1881,7 +1900,7 @@ class InfBuildData(ModuleBuildClassObject): self._BuildType = 'UEFI_HII' else: self._BuildType = self._ModuleType.upper() - + if self._DxsFile: File = PathClass(NormPath(self._DxsFile), self._ModuleDir, Arch=self._Arch) # check the file validation @@ -1896,7 +1915,7 @@ class InfBuildData(ModuleBuildClassObject): if not self._ComponentType: EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "COMPONENT_TYPE is not given", File=self.MetaFile) - self._BuildType = self._ComponentType.upper() + self._BuildType = self._ComponentType.upper() if self._ComponentType in self._MODULE_TYPE_: self._ModuleType = self._MODULE_TYPE_[self._ComponentType] if self._ComponentType == 'LIBRARY': @@ -1906,7 +1925,7 @@ class InfBuildData(ModuleBuildClassObject): Macros["EDK_SOURCE"] = GlobalData.gEcpSource Macros['PROCESSOR'] = self._Arch RecordList = self._RawData[MODEL_META_DATA_NMAKE, self._Arch, self._Platform] - for Name,Value,Dummy,Arch,Platform,ID,LineNo in RecordList: + for Name, Value, Dummy, Arch, Platform, ID, LineNo in RecordList: Value = ReplaceMacro(Value, Macros, True) if Name == "IMAGE_ENTRY_POINT": if self._ModuleEntryPointList == None: @@ -1960,7 +1979,13 @@ class InfBuildData(ModuleBuildClassObject): RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform] for Record in RecordList: if Record[1] == TAB_INF_DEFINES_INF_VERSION: - self._AutoGenVersion = int(Record[2], 0) + if '.' in Record[2]: + ValueList = Record[2].split('.') + Major = '%04o' % int(ValueList[0], 0) + Minor = '%04o' % int(ValueList[1], 0) + self._AutoGenVersion = int('0x' + Major + Minor, 0) + else: + self._AutoGenVersion = int(Record[2], 0) break if self._AutoGenVersion == None: self._AutoGenVersion = 0x00010000 @@ -2185,8 +2210,11 @@ class InfBuildData(ModuleBuildClassObject): if self.AutoGenVersion < 0x00010005: Macros["EDK_SOURCE"] = GlobalData.gEcpSource Macros['PROCESSOR'] = self._Arch + SourceFile = NormPath(Record[0], Macros) + if SourceFile[0] == os.path.sep: + SourceFile = mws.join(GlobalData.gWorkspace, SourceFile[1:]) # old module source files (Edk) - File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, self._SourceOverridePath, + File = PathClass(SourceFile, self._ModuleDir, self._SourceOverridePath, '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode) # check the file validation ErrorCode, ErrorInfo = File.Validate(CaseSensitive=False) @@ -2349,10 +2377,21 @@ class InfBuildData(ModuleBuildClassObject): if File[0] == '.': File = os.path.join(self._ModuleDir, File) else: - File = os.path.join(GlobalData.gWorkspace, File) + File = mws.join(GlobalData.gWorkspace, File) File = RealPath(os.path.normpath(File)) if File: self._Includes.append(File) + if not File and Record[0].find('EFI_SOURCE') > -1: + # tricky to regard WorkSpace as EFI_SOURCE + Macros['EFI_SOURCE'] = GlobalData.gWorkspace + File = NormPath(Record[0], Macros) + if File[0] == '.': + File = os.path.join(self._ModuleDir, File) + else: + File = os.path.join(GlobalData.gWorkspace, File) + File = RealPath(os.path.normpath(File)) + if File: + self._Includes.append(File) return self._Includes ## Retrieve packages this module depends on @@ -2399,7 +2438,7 @@ class InfBuildData(ModuleBuildClassObject): ToolChainFamily = Record[0] ToolChain = Record[1] Option = Record[2] - if (ToolChainFamily, ToolChain) not in self._BuildOptions: + if (ToolChainFamily, ToolChain) not in self._BuildOptions or Option.startswith('='): self._BuildOptions[ToolChainFamily, ToolChain] = Option else: # concatenate the option string if they're for the same tool @@ -2569,7 +2608,7 @@ class InfBuildData(ModuleBuildClassObject): 'build', FORMAT_INVALID, "No TokenValue for PCD [%s.%s] in [%s]!" % (TokenSpaceGuid, PcdCName, str(Package)), - File =self.MetaFile, Line=LineNo, + File=self.MetaFile, Line=LineNo, ExtraData=None ) # @@ -2582,7 +2621,7 @@ class InfBuildData(ModuleBuildClassObject): 'build', FORMAT_INVALID, "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid:" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)), - File =self.MetaFile, Line=LineNo, + File=self.MetaFile, Line=LineNo, ExtraData=None ) @@ -2596,19 +2635,19 @@ class InfBuildData(ModuleBuildClassObject): EdkLogger.error( 'build', FORMAT_INVALID, - "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!"% (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)), - File =self.MetaFile, Line=LineNo, + "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)), + File=self.MetaFile, Line=LineNo, ExtraData=None - ) + ) except: EdkLogger.error( 'build', FORMAT_INVALID, - "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!"% (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)), - File =self.MetaFile, Line=LineNo, + "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)), + File=self.MetaFile, Line=LineNo, ExtraData=None ) - + Pcd.DatumType = PcdInPackage.DatumType Pcd.MaxDatumSize = PcdInPackage.MaxDatumSize Pcd.InfDefaultValue = Pcd.DefaultValue @@ -2620,7 +2659,7 @@ class InfBuildData(ModuleBuildClassObject): 'build', FORMAT_INVALID, "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdCName, self.MetaFile), - File =self.MetaFile, Line=LineNo, + File=self.MetaFile, Line=LineNo, ExtraData="\t%s" % '\n\t'.join([str(P) for P in self.Packages]) ) Pcds[PcdCName, TokenSpaceGuid] = Pcd @@ -2803,7 +2842,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, 'Conf', GlobalData.gDatabasePath)) + DbPath = os.path.normpath(mws.join(GlobalData.gWorkspace, 'Conf', GlobalData.gDatabasePath)) # don't create necessary path for db in memory if DbPath != ':memory:': @@ -2931,7 +2970,7 @@ determine whether database file is out of date!\n") ## Summarize all packages in the database def GetPackageList(self, Platform, Arch, TargetName, ToolChainTag): self.Platform = Platform - PackageList =[] + PackageList = [] Pa = self.BuildObject[self.Platform, 'COMMON'] # # Get Package related to Modules @@ -2948,8 +2987,8 @@ determine whether database file is out of date!\n") LibObj = self.BuildObject[Lib, Arch, TargetName, ToolChainTag] for Package in LibObj.Packages: if Package not in PackageList: - PackageList.append(Package) - + PackageList.append(Package) + return PackageList ## Summarize all platforms in the database @@ -2964,6 +3003,13 @@ determine whether database file is out of date!\n") PlatformList.append(Platform) return PlatformList + def _MapPlatform(self, Dscfile): + try: + Platform = self.BuildObject[PathClass(Dscfile), 'COMMON'] + except: + Platform = None + return Platform + PlatformList = property(_GetPlatformList) ##