From db01c8e3d87305a406286e972f19b00c5c6960ab Mon Sep 17 00:00:00 2001 From: "Feng, Bob C" Date: Sat, 13 Apr 2019 16:02:02 +0800 Subject: BaseTools: Singleton the object to handle build conf file BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875 The build config files are target.txt, build rule, tooldef During a build, the config is not changed, so the object to handle them need to be singleton. Cc: Liming Gao Signed-off-by: Bob Feng Acked-by: Laszlo Ersek Tested-by: Laszlo Ersek Acked-by: Liming Gao --- BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++----------- BaseTools/Source/Python/AutoGen/BuildEngine.py | 22 +++++++++ .../Source/Python/Common/TargetTxtClassObject.py | 2 + .../Source/Python/Common/ToolDefClassObject.py | 6 ++- BaseTools/Source/Python/GenFds/GenFds.py | 4 +- .../Source/Python/GenFds/GenFdsGlobalVariable.py | 56 +++++++++------------- BaseTools/Source/Python/Workspace/DscBuildData.py | 8 +--- BaseTools/Source/Python/build/build.py | 29 +++-------- 8 files changed, 63 insertions(+), 97 deletions(-) (limited to 'BaseTools') diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index 2df055a109..c5b3fbb0a8 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -24,7 +24,8 @@ from . import GenDepex from io import BytesIO from .StrGather import * -from .BuildEngine import BuildRule +from .BuildEngine import BuildRuleObj as BuildRule +from .BuildEngine import gDefaultBuildRuleFile,AutoGenReqBuildRuleVerNum import shutil from Common.LongFilePathSupport import CopyLongFilePath from Common.BuildToolError import * @@ -78,12 +79,6 @@ gEfiVarStoreGuidPattern = re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") gMakeTypeMap = {TAB_COMPILER_MSFT:"nmake", "GCC":"gmake"} -## Build rule configuration file -gDefaultBuildRuleFile = 'build_rule.txt' - -## Build rule default version -AutoGenReqBuildRuleVerNum = "0.1" - ## default file name for AutoGen gAutoGenCodeFileName = "AutoGen.c" gAutoGenHeaderFileName = "AutoGen.h" @@ -1972,28 +1967,6 @@ class PlatformAutoGen(AutoGen): def EdkIIBuildOption(self): return self._ExpandBuildOption(self.Platform.BuildOptions, EDKII_NAME) - ## Parse build_rule.txt in Conf Directory. - # - # @retval BuildRule object - # - @cached_property - def BuildRule(self): - BuildRuleFile = None - if TAB_TAT_DEFINES_BUILD_RULE_CONF in self.Workspace.TargetTxt.TargetTxtDictionary: - BuildRuleFile = self.Workspace.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF] - if not BuildRuleFile: - BuildRuleFile = gDefaultBuildRuleFile - RetVal = BuildRule(BuildRuleFile) - if RetVal._FileVersion == "": - RetVal._FileVersion = AutoGenReqBuildRuleVerNum - else: - if RetVal._FileVersion < AutoGenReqBuildRuleVerNum : - # If Build Rule's version is less than the version number required by the tools, halting the build. - EdkLogger.error("build", AUTOGEN_ERROR, - ExtraData="The version number [%s] of build_rule.txt is less than the version number required by the AutoGen.(the minimum required version number is [%s])"\ - % (RetVal._FileVersion, AutoGenReqBuildRuleVerNum)) - return RetVal - ## Summarize the packages used by modules in this platform @cached_property def PackageList(self): @@ -3151,7 +3124,7 @@ class ModuleAutoGen(AutoGen): @cached_property def BuildRules(self): RetVal = {} - BuildRuleDatabase = self.PlatformInfo.BuildRule + BuildRuleDatabase = BuildRule for Type in BuildRuleDatabase.FileTypeList: #first try getting build rule by BuildRuleFamily RuleObject = BuildRuleDatabase[Type, self.BuildType, self.Arch, self.BuildRuleFamily] diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py index 14e61140e7..bb91534477 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -20,6 +20,9 @@ from Common.BuildToolError import * from Common.Misc import tdict, PathClass from Common.StringUtils import NormPath from Common.DataType import * +from Common.TargetTxtClassObject import TargetTxt +gDefaultBuildRuleFile = 'build_rule.txt' +AutoGenReqBuildRuleVerNum = '0.1' import Common.EdkLogger as EdkLogger @@ -583,6 +586,25 @@ class BuildRule: _UnknownSection : SkipSection, } +def GetBuildRule(): + BuildRuleFile = None + if TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary: + BuildRuleFile = TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF] + if not BuildRuleFile: + BuildRuleFile = gDefaultBuildRuleFile + RetVal = BuildRule(BuildRuleFile) + if RetVal._FileVersion == "": + RetVal._FileVersion = AutoGenReqBuildRuleVerNum + else: + if RetVal._FileVersion < AutoGenReqBuildRuleVerNum : + # If Build Rule's version is less than the version number required by the tools, halting the build. + EdkLogger.error("build", AUTOGEN_ERROR, + ExtraData="The version number [%s] of build_rule.txt is less than the version number required by the AutoGen.(the minimum required version number is [%s])"\ + % (RetVal._FileVersion, AutoGenReqBuildRuleVerNum)) + return RetVal + +BuildRuleObj = GetBuildRule() + # This acts like the main() function for the script, unless it is 'import'ed into another # script. if __name__ == '__main__': diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/BaseTools/Source/Python/Common/TargetTxtClassObject.py index 9d7673b41b..79a5acc010 100644 --- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py +++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py @@ -146,6 +146,8 @@ def TargetTxtDict(ConfDir): Target.LoadTargetTxtFile(os.path.normpath(os.path.join(ConfDir, gDefaultTargetTxtFile))) return Target +TargetTxt = TargetTxtDict(os.path.join(os.getenv("WORKSPACE"),"Conf")) + ## # # This acts like the main() function for the script, unless it is 'import'ed into another diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py b/BaseTools/Source/Python/Common/ToolDefClassObject.py index 4fa364942c..063fa00584 100644 --- a/BaseTools/Source/Python/Common/ToolDefClassObject.py +++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py @@ -14,7 +14,7 @@ import re from . import EdkLogger from .BuildToolError import * -from Common.TargetTxtClassObject import TargetTxtDict +from Common.TargetTxtClassObject import TargetTxt from Common.LongFilePathSupport import OpenLongFilePath as open from Common.Misc import PathClass from Common.StringUtils import NormPath @@ -263,7 +263,7 @@ class ToolDefClassObject(object): # @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt # def ToolDefDict(ConfDir): - Target = TargetTxtDict(ConfDir) + Target = TargetTxt ToolDef = ToolDefClassObject() if TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary: ToolsDefFile = Target.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_CHAIN_CONF] @@ -275,6 +275,8 @@ def ToolDefDict(ConfDir): ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile))) return ToolDef +ToolDef = ToolDefDict((os.path.join(os.getenv("WORKSPACE"),"Conf"))) + ## # # This acts like the main() function for the script, unless it is 'import'ed into another diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index 5888997761..51943411ad 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -20,7 +20,7 @@ from linecache import getlines from io import BytesIO import Common.LongFilePathOs as os -from Common.TargetTxtClassObject import TargetTxtClassObject +from Common.TargetTxtClassObject import TargetTxt from Common.DataType import * import Common.GlobalData as GlobalData from Common import EdkLogger @@ -207,8 +207,6 @@ def GenFdsApi(FdsCommandDict, WorkSpaceDataBase=None): GlobalData.gConfDirectory = GenFdsGlobalVariable.ConfDir BuildConfigurationFile = os.path.normpath(os.path.join(ConfDirectoryPath, "target.txt")) if os.path.isfile(BuildConfigurationFile) == True: - TargetTxt = TargetTxtClassObject() - TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) # if no build target given in command line, get it from target.txt if not GenFdsGlobalVariable.TargetName: BuildTargetList = TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET] diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py index f43743dff4..037828ea1c 100644 --- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py @@ -22,9 +22,9 @@ from Common.BuildToolError import COMMAND_FAILURE,GENFDS_ERROR from Common import EdkLogger from Common.Misc import SaveFileOnChange -from Common.TargetTxtClassObject import TargetTxtClassObject -from Common.ToolDefClassObject import ToolDefClassObject, ToolDefDict -from AutoGen.BuildEngine import BuildRule +from Common.TargetTxtClassObject import TargetTxt +from Common.ToolDefClassObject import ToolDef +from AutoGen.BuildEngine import BuildRuleObj import Common.DataType as DataType from Common.Misc import PathClass from Common.LongFilePathSupport import OpenLongFilePath as open @@ -95,31 +95,21 @@ class GenFdsGlobalVariable: def _LoadBuildRule(): if GenFdsGlobalVariable.__BuildRuleDatabase: return GenFdsGlobalVariable.__BuildRuleDatabase - BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.ConfDir, "target.txt")) - TargetTxt = TargetTxtClassObject() - if os.path.isfile(BuildConfigurationFile) == True: - TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) - if DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary: - BuildRuleFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF] - if not BuildRuleFile: - BuildRuleFile = 'Conf/build_rule.txt' - GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) - ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] - if ToolDefinitionFile == '': - ToolDefinitionFile = "Conf/tools_def.txt" - if os.path.isfile(ToolDefinitionFile): - ToolDef = ToolDefClassObject() - ToolDef.LoadToolDefFile(ToolDefinitionFile) - ToolDefinition = ToolDef.ToolsDefTxtDatabase - if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \ - and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \ - and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]: - GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag] - - if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \ - and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \ - and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]: - GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag] + GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj + ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] + if ToolDefinitionFile == '': + ToolDefinitionFile = "Conf/tools_def.txt" + if os.path.isfile(ToolDefinitionFile): + ToolDefinition = ToolDef.ToolsDefTxtDatabase + if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \ + and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \ + and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]: + GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag] + + if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \ + and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \ + and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]: + GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag] return GenFdsGlobalVariable.__BuildRuleDatabase ## GetBuildRules @@ -839,7 +829,7 @@ class GenFdsGlobalVariable: # @param NameGuid The Guid name # def FindExtendTool(KeyStringList, CurrentArchList, NameGuid): - ToolDb = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDatabase + ToolDb = ToolDef.ToolsDefTxtDatabase # if user not specify filter, try to deduce it from global data. if KeyStringList is None or KeyStringList == []: Target = GenFdsGlobalVariable.TargetName @@ -855,15 +845,15 @@ def FindExtendTool(KeyStringList, CurrentArchList, NameGuid): if NameGuid in GenFdsGlobalVariable.GuidToolDefinition: return GenFdsGlobalVariable.GuidToolDefinition[NameGuid] - ToolDefinition = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDictionary + ToolDefinition = ToolDef.ToolsDefTxtDictionary ToolPathTmp = None ToolOption = None ToolPathKey = None ToolOptionKey = None KeyList = None - for ToolDef in ToolDefinition.items(): - if NameGuid.lower() == ToolDef[1].lower(): - KeyList = ToolDef[0].split('_') + for tool_def in ToolDefinition.items(): + if NameGuid.lower() == tool_def[1].lower(): + KeyList = tool_def[0].split('_') Key = KeyList[0] + \ '_' + \ KeyList[1] + \ diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 620e48fa7f..987d9cf13e 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -19,8 +19,8 @@ from Common.Misc import * from types import * from Common.Expression import * from CommonDataClass.CommonClass import SkuInfoClass -from Common.TargetTxtClassObject import TargetTxtClassObject -from Common.ToolDefClassObject import ToolDefClassObject +from Common.TargetTxtClassObject import TargetTxt +from Common.ToolDefClassObject import ToolDef from .MetaDataTable import * from .MetaFileTable import * from .MetaFileParser import * @@ -3262,15 +3262,11 @@ class DscBuildData(PlatformBuildClassObject): self._ToolChainFamily = TAB_COMPILER_MSFT BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt")) if os.path.isfile(BuildConfigurationFile) == True: - TargetTxt = TargetTxtClassObject() - TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] if ToolDefinitionFile == '': ToolDefinitionFile = "tools_def.txt" ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile)) if os.path.isfile(ToolDefinitionFile) == True: - ToolDef = ToolDefClassObject() - ToolDef.LoadToolDefFile(ToolDefinitionFile) ToolDefinition = ToolDef.ToolsDefTxtDatabase if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \ or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \ diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 6bc528974d..07693b9735 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -30,8 +30,8 @@ from subprocess import * from Common import Misc as Utils from Common.LongFilePathSupport import OpenLongFilePath as open -from Common.TargetTxtClassObject import TargetTxtClassObject -from Common.ToolDefClassObject import ToolDefClassObject +from Common.TargetTxtClassObject import TargetTxt +from Common.ToolDefClassObject import ToolDef from Common.DataType import * from Common.BuildVersion import gBUILD_VERSION from AutoGen.AutoGen import * @@ -716,8 +716,8 @@ class Build(): self.ConfDirectory = BuildOptions.ConfDirectory self.SpawnMode = True self.BuildReport = BuildReport(BuildOptions.ReportFile, BuildOptions.ReportType) - self.TargetTxt = TargetTxtClassObject() - self.ToolDef = ToolDefClassObject() + self.TargetTxt = TargetTxt + self.ToolDef = ToolDef self.AutoGenTime = 0 self.MakeTime = 0 self.GenFdsTime = 0 @@ -816,8 +816,8 @@ class Build(): EdkLogger.quiet("%-16s = %s" % ("POSTBUILD", self.Postbuild)) if self.Prebuild: self.LaunchPrebuild() - self.TargetTxt = TargetTxtClassObject() - self.ToolDef = ToolDefClassObject() + self.TargetTxt = TargetTxt + self.ToolDef = ToolDef if not (self.LaunchPrebuildFlag and os.path.exists(self.PlatformBuildPath)): self.InitBuild() @@ -829,23 +829,6 @@ class Build(): # This method will parse target.txt and get the build configurations. # def LoadConfiguration(self): - # - # Check target.txt and tools_def.txt and Init them - # - BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, gBuildConfiguration)) - if os.path.isfile(BuildConfigurationFile) == True: - StatusCode = self.TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) - - ToolDefinitionFile = self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_CHAIN_CONF] - if ToolDefinitionFile == '': - ToolDefinitionFile = gToolsDefinition - ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile)) - if os.path.isfile(ToolDefinitionFile) == True: - StatusCode = self.ToolDef.LoadToolDefFile(ToolDefinitionFile) - else: - EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=ToolDefinitionFile) - else: - EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=BuildConfigurationFile) # if no ARCH given in command line, get it from target.txt if not self.ArchList: -- cgit v1.2.3