From 64b2609fcff9d6412eea4c74c8e74bed33dc3235 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Tue, 10 Apr 2012 07:18:20 +0000 Subject: Sync BaseTools Trunk (version r2518) to EDKII main trunk. Signed-off-by: Liming Gao git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13178 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/Python/build/BuildReport.py | 65 +++++++++++++++++++++++----- BaseTools/Source/Python/build/build.py | 20 ++++++++- 2 files changed, 72 insertions(+), 13 deletions(-) (limited to 'BaseTools/Source/Python/build') diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index f3555d705d..e20131a312 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -33,7 +33,12 @@ from Common.Misc import GuidStructureStringToGuidString from Common.InfClassObject import gComponentType2ModuleType from Common.BuildToolError import FILE_WRITE_FAILURE from Common.BuildToolError import CODE_ERROR - +from Common.DataType import TAB_LINE_BREAK +from Common.DataType import TAB_DEPEX +from Common.DataType import TAB_SLASH +from Common.DataType import TAB_SPACE_SPLIT +from Common.DataType import TAB_BRG_PCD +from Common.DataType import TAB_BRG_LIBRARY ## Pattern to extract contents in EDK DXS files gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL) @@ -63,15 +68,19 @@ gIncludePattern2 = re.compile(r"#include\s+EFI_([A-Z_]+)\s*[(]\s*(\w+)\s*[)]") ## Pattern to find the entry point for EDK module using EDKII Glue library gGlueLibEntryPoint = re.compile(r"__EDKII_GLUE_MODULE_ENTRY_POINT__\s*=\s*(\w+)") +## Tags for MaxLength of line in report +gLineMaxLength = 120 + ## Tags for section start, end and separator -gSectionStart = ">" + "=" * 118 + "<" -gSectionEnd = "<" + "=" * 118 + ">" + "\n" -gSectionSep = "=" * 120 +gSectionStart = ">" + "=" * (gLineMaxLength-2) + "<" +gSectionEnd = "<" + "=" * (gLineMaxLength-2) + ">" + "\n" +gSectionSep = "=" * gLineMaxLength ## Tags for subsection start, end and separator -gSubSectionStart = ">" + "-" * 118 + "<" -gSubSectionEnd = "<" + "-" * 118 + ">" -gSubSectionSep = "-" * 120 +gSubSectionStart = ">" + "-" * (gLineMaxLength-2) + "<" +gSubSectionEnd = "<" + "-" * (gLineMaxLength-2) + ">" +gSubSectionSep = "-" * gLineMaxLength + ## The look up table to map PCD type to pair of report display type and DEC type gPcdTypeMap = { @@ -166,6 +175,37 @@ def FindIncludeFiles(Source, IncludePathList, IncludeFiles): IncludeFiles[FullFileName.lower().replace("\\", "/")] = FullFileName break +## Split each lines in file +# +# This method is used to split the lines in file to make the length of each line +# less than MaxLength. +# +# @param Content The content of file +# @param MaxLength The Max Length of the line +# +def FileLinesSplit(Content=None, MaxLength=None): + ContentList = Content.split(TAB_LINE_BREAK) + NewContent = '' + NewContentList = [] + for Line in ContentList: + while len(Line.rstrip()) > MaxLength: + LineSpaceIndex = Line.rfind(TAB_SPACE_SPLIT, 0, MaxLength) + LineSlashIndex = Line.rfind(TAB_SLASH, 0, MaxLength) + LineBreakIndex = MaxLength + if LineSpaceIndex > LineSlashIndex: + LineBreakIndex = LineSpaceIndex + elif LineSlashIndex > LineSpaceIndex: + LineBreakIndex = LineSlashIndex + NewContentList.append(Line[:LineBreakIndex]) + Line = Line[LineBreakIndex:] + if Line: + NewContentList.append(Line) + for NewLine in NewContentList: + NewContent += NewLine + TAB_LINE_BREAK + return NewContent + + + ## # Parse binary dependency expression section # @@ -263,7 +303,7 @@ class LibraryReport(object): # def GenerateReport(self, File): FileWrite(File, gSubSectionStart) - FileWrite(File, "Library") + FileWrite(File, TAB_BRG_LIBRARY) if len(self.LibraryList) > 0: FileWrite(File, gSubSectionSep) for LibraryItem in self.LibraryList: @@ -355,8 +395,10 @@ class DepexReport(object): # def GenerateReport(self, File, GlobalDepexParser): if not self.Depex: + FileWrite(File, gSubSectionStart) + FileWrite(File, TAB_DEPEX) + FileWrite(File, gSubSectionEnd) return - FileWrite(File, gSubSectionStart) if os.path.isfile(self._DepexFileName): try: @@ -685,7 +727,7 @@ class PcdReport(object): # For module PCD sub-section # FileWrite(File, gSubSectionStart) - FileWrite(File, "PCD") + FileWrite(File, TAB_BRG_PCD) FileWrite(File, gSubSectionSep) for Key in self.AllPcds: @@ -1511,7 +1553,8 @@ class BuildReport(object): File = StringIO('') for (Wa, MaList) in self.ReportList: PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType) - SaveFileOnChange(self.ReportFile, File.getvalue(), False) + Content = FileLinesSplit(File.getvalue(), gLineMaxLength) + SaveFileOnChange(self.ReportFile, Content, True) EdkLogger.quiet("Build report can be found at %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 ef52162ea1..a463c527be 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -59,6 +59,9 @@ gBuildConfiguration = "Conf/target.txt" gBuildCacheDir = "Conf/.cache" gToolsDefinition = "Conf/tools_def.txt" +TemporaryTablePattern = re.compile(r'^_\d+_\d+_[a-fA-F0-9]+$') +TmpTableDict = {} + ## Check environment PATH variable to make sure the specified tool is found # # If the tool is found in the PATH, then True is returned @@ -1448,6 +1451,14 @@ class Build(): if BuildTask.HasError(): EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule) + # + # Save temp tables to a TmpTableDict. + # + for Key in Wa.BuildDatabase._CACHE_: + if Wa.BuildDatabase._CACHE_[Key]._RawData and Wa.BuildDatabase._CACHE_[Key]._RawData._Table and Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table: + if TemporaryTablePattern.match(Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table): + TmpTableDict[Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table] = Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Cur + # # # All modules have been put in build tasks queue. Tell task scheduler # to exit if all tasks are completed @@ -1651,8 +1662,8 @@ def MyOptionParser(): help="Build the platform specified by the DSC file name argument, overriding target.txt's ACTIVE_PLATFORM definition.") Parser.add_option("-m", "--module", action="callback", type="string", dest="ModuleFile", callback=SingleCheckCallback, help="Build the module specified by the INF file name argument.") - Parser.add_option("-b", "--buildtarget", action="append", type="choice", choices=['DEBUG','RELEASE','NOOPT'], dest="BuildTarget", - help="BuildTarget is one of list: DEBUG, RELEASE, NOOPT, which overrides target.txt's TARGET definition. To specify more TARGET, please repeat this option.") + Parser.add_option("-b", "--buildtarget", type="string", dest="BuildTarget", help="Using the TARGET to build the platform, overriding target.txt's TARGET definition.", + action="append") Parser.add_option("-t", "--tagname", action="append", type="string", dest="ToolChain", help="Using the Tool Chain Tagname to build the platform, overriding target.txt's TOOL_CHAIN_TAG definition.") Parser.add_option("-x", "--sku-id", action="callback", type="string", dest="SkuId", callback=SingleCheckCallback, @@ -1809,7 +1820,12 @@ def Main(): EdkLogger.error("build", OPTION_VALUE_INVALID, "UNI flag must be one of -c or -s") MyBuild = Build(Target, Workspace, Option) + GlobalData.gCommandLineDefines['ARCH'] = ' '.join(MyBuild.ArchList) MyBuild.Launch() + # Drop temp tables to avoid database locked. + for TmpTableName in TmpTableDict: + SqlCommand = """drop table IF EXISTS %s""" % TmpTableName + TmpTableDict[TmpTableName].execute(SqlCommand) #MyBuild.DumpBuildData() except FatalError, X: if MyBuild != None: -- cgit v1.2.3