diff options
author | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-03-04 05:29:52 +0000 |
---|---|---|
committer | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-03-04 05:29:52 +0000 |
commit | d5d56f1bc5e7bcebd08ad55e940fb907ea0af365 (patch) | |
tree | be511cd484b00b289ca068370c305521d422afc5 /BaseTools/Source/Python | |
parent | 545312ad92b51501777df57d595f1725170f8940 (diff) | |
download | edk2-platforms-d5d56f1bc5e7bcebd08ad55e940fb907ea0af365.tar.xz |
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
Diffstat (limited to 'BaseTools/Source/Python')
-rw-r--r-- | BaseTools/Source/Python/Common/FdfParserLite.py | 37 | ||||
-rw-r--r-- | BaseTools/Source/Python/GenFds/FdfParser.py | 38 | ||||
-rw-r--r-- | BaseTools/Source/Python/GenFds/GenFds.py | 6 | ||||
-rw-r--r-- | BaseTools/Source/Python/Workspace/MetaFileParser.py | 54 | ||||
-rw-r--r-- | BaseTools/Source/Python/build/BuildReport.py | 48 | ||||
-rw-r--r-- | BaseTools/Source/Python/build/build.py | 13 |
6 files changed, 125 insertions, 71 deletions
diff --git a/BaseTools/Source/Python/Common/FdfParserLite.py b/BaseTools/Source/Python/Common/FdfParserLite.py index e9b69ff1b9..eb7b0d7514 100644 --- a/BaseTools/Source/Python/Common/FdfParserLite.py +++ b/BaseTools/Source/Python/Common/FdfParserLite.py @@ -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)
diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 4ce2761243..92d6ab64ba 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -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)
diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index 1285103f5e..d586346168 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -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: diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index cf165ff507..4c7ea03516 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -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) diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 23e819e5ca..eac21d1495 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -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)
diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 9705097606..e3a3dd9f3f 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -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',
|