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)
##