Sync BaseTools Trunk (version r2518) to EDKII main trunk.
Signed-off-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13178 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -340,6 +340,7 @@ class MetaFileParser(object):
|
||||
## [BuildOptions] section parser
|
||||
@ParseMacro
|
||||
def _BuildOptionParser(self):
|
||||
self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True)
|
||||
TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)
|
||||
TokenList2 = GetSplitValueList(TokenList[0], ':', 1)
|
||||
if len(TokenList2) == 2:
|
||||
@ -913,6 +914,9 @@ class DscParser(MetaFileParser):
|
||||
ExtraData=self._CurrentLine)
|
||||
|
||||
ItemType = self.DataType[DirectiveName]
|
||||
Scope = [['COMMON', 'COMMON']]
|
||||
if ItemType == MODEL_META_DATA_INCLUDE:
|
||||
Scope = self._Scope
|
||||
if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF:
|
||||
# Remove all directives between !if and !endif, including themselves
|
||||
while self._DirectiveStack:
|
||||
@ -945,21 +949,22 @@ class DscParser(MetaFileParser):
|
||||
# Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1,
|
||||
# LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1
|
||||
#
|
||||
self._LastItem = self._Store(
|
||||
ItemType,
|
||||
self._ValueList[0],
|
||||
self._ValueList[1],
|
||||
self._ValueList[2],
|
||||
'COMMON',
|
||||
'COMMON',
|
||||
self._Owner[-1],
|
||||
self._From,
|
||||
self._LineIndex+1,
|
||||
-1,
|
||||
self._LineIndex+1,
|
||||
-1,
|
||||
0
|
||||
)
|
||||
for Arch, ModuleType in Scope:
|
||||
self._LastItem = self._Store(
|
||||
ItemType,
|
||||
self._ValueList[0],
|
||||
self._ValueList[1],
|
||||
self._ValueList[2],
|
||||
Arch,
|
||||
ModuleType,
|
||||
self._Owner[-1],
|
||||
self._From,
|
||||
self._LineIndex+1,
|
||||
-1,
|
||||
self._LineIndex+1,
|
||||
-1,
|
||||
0
|
||||
)
|
||||
|
||||
## [defines] section parser
|
||||
@ParseMacro
|
||||
@ -1065,6 +1070,7 @@ class DscParser(MetaFileParser):
|
||||
## [BuildOptions] section parser
|
||||
@ParseMacro
|
||||
def _BuildOptionParser(self):
|
||||
self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True)
|
||||
TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)
|
||||
TokenList2 = GetSplitValueList(TokenList[0], ':', 1)
|
||||
if len(TokenList2) == 2:
|
||||
@ -1154,6 +1160,21 @@ class DscParser(MetaFileParser):
|
||||
self._ContentIndex += 1
|
||||
|
||||
self._Scope = [[S1, S2]]
|
||||
#
|
||||
# For !include directive, handle it specially,
|
||||
# merge arch and module type in case of duplicate items
|
||||
#
|
||||
while self._ItemType == MODEL_META_DATA_INCLUDE:
|
||||
if self._ContentIndex >= len(self._Content):
|
||||
break
|
||||
Record = self._Content[self._ContentIndex]
|
||||
if LineStart == Record[9] and LineEnd == Record[11]:
|
||||
if [Record[5], Record[6]] not in self._Scope:
|
||||
self._Scope.append([Record[5], Record[6]])
|
||||
self._ContentIndex += 1
|
||||
else:
|
||||
break
|
||||
|
||||
self._LineIndex = LineStart - 1
|
||||
self._ValueList = [V1, V2, V3]
|
||||
|
||||
@ -1164,9 +1185,23 @@ class DscParser(MetaFileParser):
|
||||
# Only catch expression evaluation error here. We need to report
|
||||
# the precise number of line on which the error occurred
|
||||
#
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),
|
||||
File=self._FileWithError, ExtraData=' '.join(self._ValueList),
|
||||
Line=self._LineIndex+1)
|
||||
if hasattr(Excpt, 'Pcd'):
|
||||
if Excpt.Pcd in GlobalData.gPlatformOtherPcds:
|
||||
Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd]
|
||||
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, and it is currently defined in this section:"
|
||||
" %s, line #: %d." % (Excpt.Pcd, Info[0], Info[1]),
|
||||
File=self._FileWithError, ExtraData=' '.join(self._ValueList),
|
||||
Line=self._LineIndex+1)
|
||||
else:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,
|
||||
File=self._FileWithError, ExtraData=' '.join(self._ValueList),
|
||||
Line=self._LineIndex+1)
|
||||
else:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),
|
||||
File=self._FileWithError, ExtraData=' '.join(self._ValueList),
|
||||
Line=self._LineIndex+1)
|
||||
except MacroException, Excpt:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, str(Excpt),
|
||||
File=self._FileWithError, ExtraData=' '.join(self._ValueList),
|
||||
@ -1225,6 +1260,20 @@ class DscParser(MetaFileParser):
|
||||
Name = TokenSpaceGuid + '.' + PcdName
|
||||
self._Symbols[Name] = Value
|
||||
|
||||
Content = open(str(self.MetaFile), 'r').readlines()
|
||||
GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile)
|
||||
for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII,
|
||||
MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII,
|
||||
MODEL_PCD_DYNAMIC_EX_VPD):
|
||||
Records = self._RawTable.Query(PcdType, BelongsToItem=-1.0)
|
||||
for TokenSpaceGuid,PcdName,Value,Dummy2,Dummy3,ID,Line in Records:
|
||||
Name = TokenSpaceGuid + '.' + PcdName
|
||||
if Name not in GlobalData.gPlatformOtherPcds:
|
||||
PcdLine = Line
|
||||
while not Content[Line - 1].lstrip().startswith(TAB_SECTION_START):
|
||||
Line -= 1
|
||||
GlobalData.gPlatformOtherPcds[Name] = (CleanString(Content[Line - 1]), PcdLine, PcdType)
|
||||
|
||||
def __ProcessDefine(self):
|
||||
if not self._Enabled:
|
||||
return
|
||||
@ -1386,7 +1435,8 @@ class DscParser(MetaFileParser):
|
||||
try:
|
||||
ValueList[0] = ValueExpression(PcdValue, self._Macros)(True)
|
||||
except WrnExpression, Value:
|
||||
ValueList[0] = Value.result
|
||||
ValueList[0] = Value.result
|
||||
PcdValue = ValueList[0]
|
||||
else:
|
||||
#
|
||||
# Int*/Boolean VPD PCD
|
||||
@ -1412,8 +1462,10 @@ class DscParser(MetaFileParser):
|
||||
if ValueList[-1] == 'True':
|
||||
ValueList[-1] = '1'
|
||||
if ValueList[-1] == 'False':
|
||||
ValueList[-1] = '0'
|
||||
|
||||
ValueList[-1] = '0'
|
||||
PcdValue = ValueList[-1]
|
||||
if PcdValue and self._ItemType in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:
|
||||
GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue
|
||||
self._ValueList[2] = '|'.join(ValueList)
|
||||
|
||||
def __ProcessComponent(self):
|
||||
|
@ -50,11 +50,13 @@ class MetaFileTable(Table):
|
||||
|
||||
def IsIntegrity(self):
|
||||
try:
|
||||
TimeStamp = self.MetaFile.TimeStamp
|
||||
Result = self.Cur.execute("select ID from %s where ID<0" % (self.Table)).fetchall()
|
||||
if not Result:
|
||||
# update the timestamp in database
|
||||
self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp)
|
||||
return False
|
||||
|
||||
TimeStamp = self.MetaFile.TimeStamp
|
||||
if TimeStamp != self._FileIndexTable.GetFileTimeStamp(self.IdBase):
|
||||
# update the timestamp in database
|
||||
self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp)
|
||||
|
@ -262,7 +262,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 +271,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 +280,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 +298,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,7 +307,7 @@ 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
|
||||
|
||||
## Retrieve SKUID_IDENTIFIER
|
||||
@ -463,7 +463,8 @@ class DscBuildData(PlatformBuildClassObject):
|
||||
EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,
|
||||
ExtraData=ErrorInfo)
|
||||
# Check duplication
|
||||
if ModuleFile in self._Modules:
|
||||
# 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:
|
||||
EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)
|
||||
|
||||
Module = ModuleBuildClassObject()
|
||||
@ -841,6 +842,17 @@ class DscBuildData(PlatformBuildClassObject):
|
||||
self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)
|
||||
self.Pcds[Name, Guid].DefaultValue = Value
|
||||
|
||||
def IsPlatformPcdDeclared(self, DecPcds):
|
||||
for PcdType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_FEATURE_FLAG,
|
||||
MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_VPD,
|
||||
MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_EX_VPD):
|
||||
RecordList = self._RawData[PcdType, self._Arch]
|
||||
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:
|
||||
if (PcdCName, TokenSpaceGuid) not in DecPcds:
|
||||
EdkLogger.error('build', PARSER_ERROR,
|
||||
"Pcd (%s.%s) defined in DSC is not declared in DEC files." % (TokenSpaceGuid, PcdCName),
|
||||
File=self.MetaFile, Line=Dummy4)
|
||||
|
||||
_Macros = property(_GetMacros)
|
||||
Arch = property(_GetArch, _SetArch)
|
||||
Platform = property(_GetPlatformName)
|
||||
|
Reference in New Issue
Block a user