Sync EDKII BaseTools to BaseTools project r1911.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10177 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# parse FDF file
|
||||
#
|
||||
# Copyright (c) 2007, Intel Corporation
|
||||
# Copyright (c) 2007 - 2010, 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
|
||||
@@ -383,7 +383,22 @@ class FdfParser(object):
|
||||
while Offset <= EndPos[1]:
|
||||
self.Profile.FileLinesList[EndPos[0]][Offset] = Value
|
||||
Offset += 1
|
||||
|
||||
|
||||
|
||||
def __GetMacroName(self):
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:].strip()
|
||||
|
||||
if not MacroName.startswith('$(') or not MacroName.endswith(')'):
|
||||
raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},
|
||||
self.FileName, self.CurrentLineNumber)
|
||||
MacroName = MacroName[2:-1]
|
||||
return MacroName, NotFlag
|
||||
|
||||
## PreprocessFile() method
|
||||
#
|
||||
@@ -554,14 +569,7 @@ class FdfParser(object):
|
||||
IfList.append([IfStartPos, None, None])
|
||||
CondLabel = self.__Token
|
||||
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:]
|
||||
|
||||
MacroName, NotFlag = self.__GetMacroName()
|
||||
NotDefineFlag = False
|
||||
if CondLabel == '!ifndef':
|
||||
NotDefineFlag = True
|
||||
@@ -615,14 +623,7 @@ class FdfParser(object):
|
||||
self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))
|
||||
IfList[-1] = [ElseStartPos, True, IfList[-1][2]]
|
||||
if self.__Token == '!elseif':
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:]
|
||||
|
||||
MacroName, NotFlag = self.__GetMacroName()
|
||||
if not self.__GetNextOp():
|
||||
raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# parse FDF file
|
||||
#
|
||||
# Copyright (c) 2007, Intel Corporation
|
||||
# Copyright (c) 2007 - 2010, 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
|
||||
@@ -415,6 +415,21 @@ class FdfParser:
|
||||
Offset += 1
|
||||
|
||||
|
||||
def __GetMacroName(self):
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:].strip()
|
||||
|
||||
if not MacroName.startswith('$(') or not MacroName.endswith(')'):
|
||||
raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},
|
||||
self.FileName, self.CurrentLineNumber)
|
||||
MacroName = MacroName[2:-1]
|
||||
return MacroName, NotFlag
|
||||
|
||||
## PreprocessFile() method
|
||||
#
|
||||
# Preprocess file contents, replace comments with spaces.
|
||||
@@ -545,6 +560,7 @@ class FdfParser:
|
||||
|
||||
self.Rewind()
|
||||
|
||||
|
||||
## PreprocessIncludeFile() method
|
||||
#
|
||||
# Preprocess file contents, replace !include statements with file contents.
|
||||
@@ -583,15 +599,8 @@ class FdfParser:
|
||||
IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))
|
||||
IfList.append([IfStartPos, None, None])
|
||||
CondLabel = self.__Token
|
||||
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:]
|
||||
|
||||
|
||||
MacroName, NotFlag = self.__GetMacroName()
|
||||
NotDefineFlag = False
|
||||
if CondLabel == '!ifndef':
|
||||
NotDefineFlag = True
|
||||
@@ -645,14 +654,7 @@ class FdfParser:
|
||||
self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))
|
||||
IfList[-1] = [ElseStartPos, True, IfList[-1][2]]
|
||||
if self.__Token == '!elseif':
|
||||
if not self.__GetNextToken():
|
||||
raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
|
||||
MacroName = self.__Token
|
||||
NotFlag = False
|
||||
if MacroName.startswith('!'):
|
||||
NotFlag = True
|
||||
MacroName = MacroName[1:]
|
||||
|
||||
MacroName, NotFlag = self.__GetMacroName()
|
||||
if not self.__GetNextOp():
|
||||
raise Warning("expected !endif", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
|
@@ -196,10 +196,8 @@ def main():
|
||||
|
||||
if (Options.outputDir):
|
||||
OutputDirFromCommandLine = GenFdsGlobalVariable.ReplaceWorkspaceMacro(Options.outputDir)
|
||||
if not os.path.isabs (Options.outputDir):
|
||||
Options.outputDir = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, Options.outputDir)
|
||||
if os.path.normcase (Options.outputDir).find(Workspace) != 0:
|
||||
EdkLogger.error("GenFds", FILE_NOT_FOUND, "OutputDir doesn't exist in Workspace!")
|
||||
if not os.path.isabs (OutputDirFromCommandLine):
|
||||
OutputDirFromCommandLine = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, OutputDirFromCommandLine)
|
||||
for Arch in ArchList:
|
||||
GenFdsGlobalVariable.OutputDirDict[Arch] = OutputDirFromCommandLine
|
||||
else:
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# This file is used to parse meta files
|
||||
#
|
||||
# Copyright (c) 2008, Intel Corporation
|
||||
# Copyright (c) 2008 - 2010, 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
|
||||
@@ -40,6 +40,28 @@ class MetaFileParser(object):
|
||||
# data type (file content) for specific file type
|
||||
DataType = {}
|
||||
|
||||
# Parser objects used to implement singleton
|
||||
MetaFiles = {}
|
||||
|
||||
## Factory method
|
||||
#
|
||||
# One file, one parser object. This factory method makes sure that there's
|
||||
# only one object constructed for one meta file.
|
||||
#
|
||||
# @param Class class object of real AutoGen class
|
||||
# (InfParser, DecParser or DscParser)
|
||||
# @param FilePath The path of meta file
|
||||
# @param *args The specific class related parameters
|
||||
# @param **kwargs The specific class related dict parameters
|
||||
#
|
||||
def __new__(Class, FilePath, *args, **kwargs):
|
||||
if FilePath in Class.MetaFiles:
|
||||
return Class.MetaFiles[FilePath]
|
||||
else:
|
||||
ParserObject = super(MetaFileParser, Class).__new__(Class)
|
||||
Class.MetaFiles[FilePath] = ParserObject
|
||||
return ParserObject
|
||||
|
||||
## Constructor of MetaFileParser
|
||||
#
|
||||
# Initialize object of MetaFileParser
|
||||
@@ -52,6 +74,9 @@ class MetaFileParser(object):
|
||||
# @param From ID from which the data comes (for !INCLUDE directive)
|
||||
#
|
||||
def __init__(self, FilePath, FileType, Table, Macros=None, Owner=-1, From=-1):
|
||||
# prevent re-initialization
|
||||
if hasattr(self, "_Table"):
|
||||
return
|
||||
self._Table = Table
|
||||
self._FileType = FileType
|
||||
self.MetaFile = FilePath
|
||||
@@ -596,7 +621,9 @@ class DscParser(MetaFileParser):
|
||||
continue
|
||||
self._CurrentLine = Line
|
||||
self._LineIndex = Index
|
||||
|
||||
if self._InSubsection and self._Owner == -1:
|
||||
self._Owner = self._LastItem
|
||||
|
||||
# section header
|
||||
if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END:
|
||||
self._SectionHeaderParser()
|
||||
@@ -644,8 +671,6 @@ class DscParser(MetaFileParser):
|
||||
if self._InSubsection:
|
||||
SectionType = self._SubsectionType
|
||||
SectionName = self._SubsectionName
|
||||
if self._Owner == -1:
|
||||
self._Owner = self._LastItem
|
||||
else:
|
||||
SectionType = self._SectionType
|
||||
SectionName = self._SectionName
|
||||
@@ -774,13 +799,24 @@ class DscParser(MetaFileParser):
|
||||
else:
|
||||
self._Enabled = len(self._Eval)
|
||||
|
||||
## Evaludate the value of expression in "if/ifdef/ifndef" directives
|
||||
## Evaluate the Token for its value; for now only macros are supported.
|
||||
def _EvaluateToken(self, TokenName, Expression):
|
||||
if TokenName.startswith("$(") and TokenName.endswith(")"):
|
||||
Name = TokenName[2:-1]
|
||||
return self._Macros.get(Name)
|
||||
else:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, "Unknown operand '%(Token)s', "
|
||||
"please use '$(%(Token)s)' if '%(Token)s' is a macro" % {"Token" : TokenName},
|
||||
File=self.MetaFile, Line=self._LineIndex+1, ExtraData=Expression)
|
||||
|
||||
## Evaluate the value of expression in "if/ifdef/ifndef" directives
|
||||
def _Evaluate(self, Expression):
|
||||
TokenList = Expression.split()
|
||||
TokenNumber = len(TokenList)
|
||||
# one operand, guess it's just a macro name
|
||||
if TokenNumber == 1:
|
||||
return TokenList[0] in self._Macros
|
||||
TokenValue = self._EvaluateToken(TokenList[0], Expression)
|
||||
return TokenValue != None
|
||||
# two operands, suppose it's "!xxx" format
|
||||
elif TokenNumber == 2:
|
||||
Op = TokenList[0]
|
||||
@@ -794,8 +830,8 @@ class DscParser(MetaFileParser):
|
||||
return self._OP_[Op](Value)
|
||||
# three operands
|
||||
elif TokenNumber == 3:
|
||||
Name = TokenList[0]
|
||||
if Name not in self._Macros:
|
||||
TokenValue = self._EvaluateToken(TokenList[0], Expression)
|
||||
if TokenValue == None:
|
||||
return False
|
||||
Value = TokenList[2]
|
||||
if Value[0] in ["'", '"'] and Value[-1] in ["'", '"']:
|
||||
@@ -804,7 +840,7 @@ class DscParser(MetaFileParser):
|
||||
if Op not in self._OP_:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, "Unsupported operator [%s]" % Op, File=self.MetaFile,
|
||||
Line=self._LineIndex+1, ExtraData=Expression)
|
||||
return self._OP_[Op](self._Macros[Name], Value)
|
||||
return self._OP_[Op](TokenValue, Value)
|
||||
else:
|
||||
EdkLogger.error('Parser', FORMAT_INVALID, File=self.MetaFile, Line=self._LineIndex+1,
|
||||
ExtraData=Expression)
|
||||
|
@@ -667,31 +667,31 @@ class PcdReport(object):
|
||||
if DecDefaultValue == None:
|
||||
DecMatch = True
|
||||
else:
|
||||
DecMatch = (DecDefaultValue == PcdValue)
|
||||
DecMatch = (DecDefaultValue.strip() == PcdValue.strip())
|
||||
|
||||
if InfDefaultValue == None:
|
||||
InfMatch = True
|
||||
else:
|
||||
InfMatch = (InfDefaultValue == PcdValue)
|
||||
InfMatch = (InfDefaultValue.strip() == PcdValue.strip())
|
||||
|
||||
if DscDefaultValue == None:
|
||||
DscMatch = True
|
||||
else:
|
||||
DscMatch = (DscDefaultValue == PcdValue)
|
||||
DscMatch = (DscDefaultValue.strip() == PcdValue.strip())
|
||||
|
||||
#
|
||||
# Report PCD item according to their override relationship
|
||||
#
|
||||
if DecMatch and InfMatch:
|
||||
FileWrite(File, ' %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue))
|
||||
FileWrite(File, ' %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))
|
||||
else:
|
||||
if DscMatch:
|
||||
if (Pcd.TokenCName, Key) in self.FdfPcdSet:
|
||||
FileWrite(File, ' *F %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue))
|
||||
FileWrite(File, ' *F %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))
|
||||
else:
|
||||
FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue))
|
||||
FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))
|
||||
else:
|
||||
FileWrite(File, ' *M %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue))
|
||||
FileWrite(File, ' *M %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))
|
||||
|
||||
if TypeName in ('DYNHII', 'DEXHII', 'DYNVPD', 'DEXVPD'):
|
||||
for SkuInfo in Pcd.SkuInfoList.values():
|
||||
@@ -701,13 +701,13 @@ class PcdReport(object):
|
||||
FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))
|
||||
|
||||
if not DscMatch and DscDefaultValue != None:
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', DscDefaultValue))
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', DscDefaultValue.strip()))
|
||||
|
||||
if not InfMatch and InfDefaultValue != None:
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', InfDefaultValue))
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', InfDefaultValue.strip()))
|
||||
|
||||
if not DecMatch and DecDefaultValue != None:
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', DecDefaultValue))
|
||||
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', DecDefaultValue.strip()))
|
||||
|
||||
if ModulePcdSet == None:
|
||||
ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})
|
||||
@@ -717,10 +717,10 @@ class PcdReport(object):
|
||||
ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0)
|
||||
Match = (ModulePcdDefaultValueNumber == PcdValueNumber)
|
||||
else:
|
||||
Match = (ModuleDefault == PcdValue)
|
||||
Match = (ModuleDefault.strip() == PcdValue.strip())
|
||||
if Match:
|
||||
continue
|
||||
FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault))
|
||||
FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))
|
||||
|
||||
if ModulePcdSet == None:
|
||||
FileWrite(File, gSectionEnd)
|
||||
@@ -1283,8 +1283,9 @@ class PlatformReport(object):
|
||||
#
|
||||
# @param self The object pointer
|
||||
# @param Wa Workspace context information
|
||||
# @param MaList The list of modules in the platform build
|
||||
#
|
||||
def __init__(self, Wa, ReportType):
|
||||
def __init__(self, Wa, MaList, ReportType):
|
||||
self._WorkspaceDir = Wa.WorkspaceDir
|
||||
self.PlatformName = Wa.Name
|
||||
self.PlatformDscPath = Wa.Platform
|
||||
@@ -1299,7 +1300,7 @@ class PlatformReport(object):
|
||||
self.PcdReport = PcdReport(Wa)
|
||||
|
||||
self.FdReportList = []
|
||||
if "FLASH" in ReportType and Wa.FdfProfile:
|
||||
if "FLASH" in ReportType and Wa.FdfProfile and MaList == None:
|
||||
for Fd in Wa.FdfProfile.FdDict:
|
||||
self.FdReportList.append(FdReport(Wa.FdfProfile.FdDict[Fd], Wa))
|
||||
|
||||
@@ -1308,9 +1309,13 @@ class PlatformReport(object):
|
||||
self.PredictionReport = PredictionReport(Wa)
|
||||
|
||||
self.ModuleReportList = []
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for ModuleKey in Pa.Platform.Modules:
|
||||
self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))
|
||||
if MaList != None:
|
||||
for Ma in MaList:
|
||||
self.ModuleReportList.append(ModuleReport(Ma, ReportType))
|
||||
else:
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for ModuleKey in Pa.Platform.Modules:
|
||||
self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))
|
||||
|
||||
|
||||
|
||||
@@ -1386,10 +1391,11 @@ class BuildReport(object):
|
||||
#
|
||||
# @param self The object pointer
|
||||
# @param Wa Workspace context information
|
||||
# @param MaList The list of modules in the platform build
|
||||
#
|
||||
def AddPlatformReport(self, Wa):
|
||||
def AddPlatformReport(self, Wa, MaList=None):
|
||||
if self.ReportFile:
|
||||
self.ReportList.append(Wa)
|
||||
self.ReportList.append((Wa, MaList))
|
||||
|
||||
##
|
||||
# Generates the final report.
|
||||
@@ -1407,8 +1413,8 @@ class BuildReport(object):
|
||||
except IOError:
|
||||
EdkLogger.error(None, FILE_OPEN_FAILURE, ExtraData=self.ReportFile)
|
||||
try:
|
||||
for Wa in self.ReportList:
|
||||
PlatformReport(Wa, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType)
|
||||
for (Wa, MaList) in self.ReportList:
|
||||
PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType)
|
||||
EdkLogger.quiet("Report successfully saved to %s" % os.path.abspath(self.ReportFile))
|
||||
except IOError:
|
||||
EdkLogger.error(None, FILE_WRITE_FAILURE, ExtraData=self.ReportFile)
|
||||
|
@@ -738,6 +738,16 @@ class Build():
|
||||
# parse target.txt, tools_def.txt, and platform file
|
||||
#self.RestoreBuildData()
|
||||
self.LoadConfiguration()
|
||||
|
||||
#
|
||||
# @attention Treat $(TARGET) in meta data files as special macro when it has only one build target.
|
||||
# This is not a complete support for $(TARGET) macro as it can only support one build target in ONE
|
||||
# invocation of build command. However, it should cover the frequent usage model that $(TARGET) macro
|
||||
# is used in DSC files to specify different libraries & PCD setting for debug/release build.
|
||||
#
|
||||
if len(self.BuildTargetList) == 1:
|
||||
self.Db._GlobalMacros.setdefault("TARGET", self.BuildTargetList[0])
|
||||
|
||||
self.InitBuild()
|
||||
|
||||
# print current build environment and configuration
|
||||
@@ -1336,7 +1346,6 @@ class Build():
|
||||
self.FvList,
|
||||
self.SkuId
|
||||
)
|
||||
self.BuildReport.AddPlatformReport(Wa)
|
||||
Wa.CreateMakeFile(False)
|
||||
self.Progress.Stop("done!")
|
||||
MaList = []
|
||||
@@ -1345,6 +1354,8 @@ class Build():
|
||||
if Ma == None: continue
|
||||
MaList.append(Ma)
|
||||
self._Build(self.Target, Ma)
|
||||
|
||||
self.BuildReport.AddPlatformReport(Wa, MaList)
|
||||
if MaList == []:
|
||||
EdkLogger.error(
|
||||
'build',
|
||||
|
Reference in New Issue
Block a user