* [Patch 1/1] BaseTools: Singleton the object to handle build conf file @ 2019-06-28 7:07 Bob Feng 2019-07-11 9:11 ` Liming Gao 0 siblings, 1 reply; 6+ messages in thread From: Bob Feng @ 2019-06-28 7:07 UTC (permalink / raw) To: devel; +Cc: Liming Gao, Bob Feng 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 <liming.gao@intel.com> Signed-off-by: Bob Feng <bob.c.feng@intel.com> --- BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ .../Python/Common/TargetTxtClassObject.py | 2 + .../Python/Common/ToolDefClassObject.py | 6 ++- BaseTools/Source/Python/GenFds/GenFds.py | 4 +- .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- .../Source/Python/Workspace/DscBuildData.py | 8 +-- BaseTools/Source/Python/build/build.py | 29 +++------- 8 files changed, 62 insertions(+), 96 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index e8e09dc8a366..a1f7f5641e09 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -22,11 +22,12 @@ from . import GenC from . import GenMake 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 * from Common.DataType import * from Common.Misc import * @@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") ## Mapping Makefile type 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" gAutoGenStringFileName = "%(module_name)sStrDefs.h" gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" @@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): ## Return the build options specific for EDKII modules in this platform @cached_property 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): RetVal = set() for La in self.LibraryAutoGenList: @@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): return RetVal @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] if not RuleObject: # build type is always module type, but ... diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py index 14e61140e7ba..bb9153447793 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -18,10 +18,13 @@ from Common.LongFilePathSupport import OpenLongFilePath as open from Common.GlobalData import * 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 ## Convert file type to file list macro name # @@ -581,10 +584,29 @@ class BuildRule: _ExtraDependency : ParseCommonSubSection, _Command : ParseCommonSubSection, _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__': import sys EdkLogger.Initialize() diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/BaseTools/Source/Python/Common/TargetTxtClassObject.py index 9d7673b41bb5..79a5acc01074 100644 --- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py +++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py @@ -144,10 +144,12 @@ class TargetTxtClassObject(object): def TargetTxtDict(ConfDir): Target = TargetTxtClassObject() 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 # script. # diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py b/BaseTools/Source/Python/Common/ToolDefClassObject.py index 5d692ea13cfc..0bfa263270c3 100644 --- a/BaseTools/Source/Python/Common/ToolDefClassObject.py +++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py @@ -12,11 +12,11 @@ from __future__ import absolute_import import Common.LongFilePathOs as os 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 import Common.GlobalData as GlobalData from Common import GlobalData @@ -261,11 +261,11 @@ class ToolDefClassObject(object): # @param ConfDir: Conf dir # # @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] if ToolsDefFile: ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) @@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile))) else: 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 # script. # diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index 5888997761bb..51943411ad1f 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -18,11 +18,11 @@ from glob import glob from struct import unpack 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 from Common.StringUtils import NormPath from Common.Misc import DirCache, PathClass, GuidStructureStringToGuidString @@ -205,12 +205,10 @@ def GenFdsApi(FdsCommandDict, WorkSpaceDataBase=None): GenFdsGlobalVariable.ConfDir = ConfDirectoryPath if not GlobalData.gConfDirectory: 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] if len(BuildTargetList) != 1: EdkLogger.error("GenFds", OPTION_VALUE_INVALID, ExtraData="Only allows one instance for Target.") diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py index c9c476cf6154..f49af9371b8d 100644 --- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py @@ -20,13 +20,13 @@ from array import array 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 from Common.MultipleWorkspace import MultipleWorkspace as mws import Common.GlobalData as GlobalData @@ -93,35 +93,25 @@ class GenFdsGlobalVariable: # @staticmethod 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] + 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] + 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 # @param Inf: object of InfBuildData # @param Arch: current arch @@ -834,11 +824,11 @@ class GenFdsGlobalVariable: # @param KeyStringList Filter for inputs of section generation # @param CurrentArchList Arch list # @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 ToolChain = GenFdsGlobalVariable.ToolChainTag if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: @@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, CurrentArchList, NameGuid): if GenFdsGlobalVariable.GuidToolDefinition: 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] + \ '_' + \ KeyList[2] diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 9f65ad54257d..bfd203aee805 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -17,12 +17,12 @@ from Common.StringUtils import * from Common.DataType import * 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 * from .WorkspaceCommon import GetDeclaredPcd @@ -3259,19 +3259,15 @@ class DscBuildData(PlatformBuildClassObject): @property def ToolChainFamily(self): 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] \ or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: self._ToolChainFamily = TAB_COMPILER_MSFT diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 8c3315619afa..5e13453a1254 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -28,12 +28,12 @@ import threading from optparse import OptionParser 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 * from Common.BuildToolError import * from Workspace.WorkspaceDatabase import WorkspaceDatabase @@ -714,12 +714,12 @@ class Build(): if self.SkuId: GlobalData.gSKUID_CMD = self.SkuId 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 GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if BuildOptions.OptionPcd else [] #Set global flag for build mode @@ -813,12 +813,12 @@ class Build(): EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) if self.Postbuild: 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() EdkLogger.info("") os.chdir(self.WorkspaceDir) @@ -826,27 +826,10 @@ class Build(): ## Load configuration # # 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: self.ArchList = self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] self.ArchList = tuple(self.ArchList) -- 2.20.1.windows.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Patch 1/1] BaseTools: Singleton the object to handle build conf file 2019-06-28 7:07 [Patch 1/1] BaseTools: Singleton the object to handle build conf file Bob Feng @ 2019-07-11 9:11 ` Liming Gao 2019-07-11 9:26 ` Bob Feng [not found] ` <15B0502B4303BDC5.2265@groups.io> 0 siblings, 2 replies; 6+ messages in thread From: Liming Gao @ 2019-07-11 9:11 UTC (permalink / raw) To: Feng, Bob C, devel@edk2.groups.io Bob: target.txt is from Conf directory. build_rule.txt and tools_def.txt are specified in target.txt. Please take care this case that they may have the different file name. And, Conf directory is relative to WORKSPACE and PACKAGES_PATH. Does this patch support it? Thanks Liming >-----Original Message----- >From: Feng, Bob C >Sent: Friday, June 28, 2019 3:07 PM >To: devel@edk2.groups.io >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C <bob.c.feng@intel.com> >Subject: [Patch 1/1] 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 <liming.gao@intel.com> >Signed-off-by: Bob Feng <bob.c.feng@intel.com> >--- > BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- > .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ > .../Python/Common/TargetTxtClassObject.py | 2 + > .../Python/Common/ToolDefClassObject.py | 6 ++- > BaseTools/Source/Python/GenFds/GenFds.py | 4 +- > .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- > .../Source/Python/Workspace/DscBuildData.py | 8 +-- > BaseTools/Source/Python/build/build.py | 29 +++------- > 8 files changed, 62 insertions(+), 96 deletions(-) > >diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py >b/BaseTools/Source/Python/AutoGen/AutoGen.py >index e8e09dc8a366..a1f7f5641e09 100644 >--- a/BaseTools/Source/Python/AutoGen/AutoGen.py >+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py >@@ -22,11 +22,12 @@ from . import GenC > from . import GenMake > 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 * > from Common.DataType import * > from Common.Misc import * >@@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = >re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") > > ## Mapping Makefile type > 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" > gAutoGenStringFileName = "%(module_name)sStrDefs.h" > gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" >@@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): > ## Return the build options specific for EDKII modules in this platform > @cached_property > 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_RUL >E_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): > RetVal = set() > for La in self.LibraryAutoGenList: >@@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): > return RetVal > > @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] > if not RuleObject: > # build type is always module type, but ... >diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py >b/BaseTools/Source/Python/AutoGen/BuildEngine.py >index 14e61140e7ba..bb9153447793 100644 >--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py >+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py >@@ -18,10 +18,13 @@ from Common.LongFilePathSupport import >OpenLongFilePath as open > from Common.GlobalData import * > 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 > > ## Convert file type to file list macro name > # >@@ -581,10 +584,29 @@ class BuildRule: > _ExtraDependency : ParseCommonSubSection, > _Command : ParseCommonSubSection, > _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__': > import sys > EdkLogger.Initialize() >diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >index 9d7673b41bb5..79a5acc01074 100644 >--- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >+++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >@@ -144,10 +144,12 @@ class TargetTxtClassObject(object): > def TargetTxtDict(ConfDir): > Target = TargetTxtClassObject() > 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 > # script. > # >diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py >b/BaseTools/Source/Python/Common/ToolDefClassObject.py >index 5d692ea13cfc..0bfa263270c3 100644 >--- a/BaseTools/Source/Python/Common/ToolDefClassObject.py >+++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py >@@ -12,11 +12,11 @@ from __future__ import absolute_import > import Common.LongFilePathOs as os > 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 > import Common.GlobalData as GlobalData > from Common import GlobalData >@@ -261,11 +261,11 @@ class ToolDefClassObject(object): > # @param ConfDir: Conf dir > # > # @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] > if ToolsDefFile: > ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) >@@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): > ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, >gDefaultToolsDefFile))) > else: > 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 > # script. > # >diff --git a/BaseTools/Source/Python/GenFds/GenFds.py >b/BaseTools/Source/Python/GenFds/GenFds.py >index 5888997761bb..51943411ad1f 100644 >--- a/BaseTools/Source/Python/GenFds/GenFds.py >+++ b/BaseTools/Source/Python/GenFds/GenFds.py >@@ -18,11 +18,11 @@ from glob import glob > from struct import unpack > 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 > from Common.StringUtils import NormPath > from Common.Misc import DirCache, PathClass, >GuidStructureStringToGuidString >@@ -205,12 +205,10 @@ def GenFdsApi(FdsCommandDict, >WorkSpaceDataBase=None): > GenFdsGlobalVariable.ConfDir = ConfDirectoryPath > if not GlobalData.gConfDirectory: > 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] > if len(BuildTargetList) != 1: > EdkLogger.error("GenFds", OPTION_VALUE_INVALID, >ExtraData="Only allows one instance for Target.") >diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >index c9c476cf6154..f49af9371b8d 100644 >--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >+++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >@@ -20,13 +20,13 @@ from array import array > > 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 > from Common.MultipleWorkspace import MultipleWorkspace as mws > import Common.GlobalData as GlobalData >@@ -93,35 +93,25 @@ class GenFdsGlobalVariable: > # > @staticmethod > 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_CO >NF] >- if not BuildRuleFile: >- BuildRuleFile = 'Conf/build_rule.txt' >- GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) >- ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >- 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][GenFdsGlo >balVariable.ToolChainTag]: >- GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.ToolChainTag] >+ GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj >+ ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >+ 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][GenFdsGlo >balVariable.ToolChainTag]: >+ GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.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] >+ 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 > # @param Inf: object of InfBuildData > # @param Arch: current arch >@@ -834,11 +824,11 @@ class GenFdsGlobalVariable: > # @param KeyStringList Filter for inputs of section generation > # @param CurrentArchList Arch list > # @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 > ToolChain = GenFdsGlobalVariable.ToolChainTag > if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: >@@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, CurrentArchList, >NameGuid): > > if GenFdsGlobalVariable.GuidToolDefinition: > 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] + \ > '_' + \ > KeyList[2] >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py >b/BaseTools/Source/Python/Workspace/DscBuildData.py >index 9f65ad54257d..bfd203aee805 100644 >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py >@@ -17,12 +17,12 @@ from Common.StringUtils import * > from Common.DataType import * > 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 * > > from .WorkspaceCommon import GetDeclaredPcd >@@ -3259,19 +3259,15 @@ class DscBuildData(PlatformBuildClassObject): > @property > def ToolChainFamily(self): > 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_C >ONF] > 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] >\ > or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: > self._ToolChainFamily = TAB_COMPILER_MSFT >diff --git a/BaseTools/Source/Python/build/build.py >b/BaseTools/Source/Python/build/build.py >index 8c3315619afa..5e13453a1254 100644 >--- a/BaseTools/Source/Python/build/build.py >+++ b/BaseTools/Source/Python/build/build.py >@@ -28,12 +28,12 @@ import threading > from optparse import OptionParser > 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 * > from Common.BuildToolError import * > from Workspace.WorkspaceDatabase import WorkspaceDatabase >@@ -714,12 +714,12 @@ class Build(): > if self.SkuId: > GlobalData.gSKUID_CMD = self.SkuId > 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 > GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if >BuildOptions.OptionPcd else [] > #Set global flag for build mode >@@ -813,12 +813,12 @@ class Build(): > EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) > if self.Postbuild: > 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() > > EdkLogger.info("") > os.chdir(self.WorkspaceDir) >@@ -826,27 +826,10 @@ class Build(): > ## Load configuration > # > # 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: > self.ArchList = >self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] > self.ArchList = tuple(self.ArchList) >-- >2.20.1.windows.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Patch 1/1] BaseTools: Singleton the object to handle build conf file 2019-07-11 9:11 ` Liming Gao @ 2019-07-11 9:26 ` Bob Feng [not found] ` <15B0502B4303BDC5.2265@groups.io> 1 sibling, 0 replies; 6+ messages in thread From: Bob Feng @ 2019-07-11 9:26 UTC (permalink / raw) To: Gao, Liming, devel@edk2.groups.io Liming, Thanks for your comments. I'll test the cases you mentioned. Thanks, Bob -----Original Message----- From: Gao, Liming Sent: Thursday, July 11, 2019 5:11 PM To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io Subject: RE: [Patch 1/1] BaseTools: Singleton the object to handle build conf file Bob: target.txt is from Conf directory. build_rule.txt and tools_def.txt are specified in target.txt. Please take care this case that they may have the different file name. And, Conf directory is relative to WORKSPACE and PACKAGES_PATH. Does this patch support it? Thanks Liming >-----Original Message----- >From: Feng, Bob C >Sent: Friday, June 28, 2019 3:07 PM >To: devel@edk2.groups.io >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C ><bob.c.feng@intel.com> >Subject: [Patch 1/1] 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 <liming.gao@intel.com> >Signed-off-by: Bob Feng <bob.c.feng@intel.com> >--- > BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- > .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ > .../Python/Common/TargetTxtClassObject.py | 2 + > .../Python/Common/ToolDefClassObject.py | 6 ++- > BaseTools/Source/Python/GenFds/GenFds.py | 4 +- > .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- > .../Source/Python/Workspace/DscBuildData.py | 8 +-- > BaseTools/Source/Python/build/build.py | 29 +++------- > 8 files changed, 62 insertions(+), 96 deletions(-) > >diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py >b/BaseTools/Source/Python/AutoGen/AutoGen.py >index e8e09dc8a366..a1f7f5641e09 100644 >--- a/BaseTools/Source/Python/AutoGen/AutoGen.py >+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py >@@ -22,11 +22,12 @@ from . import GenC > from . import GenMake > 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 * from Common.DataType import * from >Common.Misc import * @@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = >re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") > > ## Mapping Makefile type > 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" > gAutoGenStringFileName = "%(module_name)sStrDefs.h" > gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" >@@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): > ## Return the build options specific for EDKII modules in this platform > @cached_property > 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_RUL >E_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): > RetVal = set() > for La in self.LibraryAutoGenList: >@@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): > return RetVal > > @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] > if not RuleObject: > # build type is always module type, but ... >diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py >b/BaseTools/Source/Python/AutoGen/BuildEngine.py >index 14e61140e7ba..bb9153447793 100644 >--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py >+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py >@@ -18,10 +18,13 @@ from Common.LongFilePathSupport import >OpenLongFilePath as open from Common.GlobalData import * 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 > > ## Convert file type to file list macro name # @@ -581,10 +584,29 @@ >class BuildRule: > _ExtraDependency : ParseCommonSubSection, > _Command : ParseCommonSubSection, > _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__': > import sys > EdkLogger.Initialize() >diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >index 9d7673b41bb5..79a5acc01074 100644 >--- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >+++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >@@ -144,10 +144,12 @@ class TargetTxtClassObject(object): > def TargetTxtDict(ConfDir): > Target = TargetTxtClassObject() > 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 # script. > # >diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py >b/BaseTools/Source/Python/Common/ToolDefClassObject.py >index 5d692ea13cfc..0bfa263270c3 100644 >--- a/BaseTools/Source/Python/Common/ToolDefClassObject.py >+++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py >@@ -12,11 +12,11 @@ from __future__ import absolute_import import >Common.LongFilePathOs as os 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 >import Common.GlobalData as GlobalData from Common import GlobalData >@@ -261,11 +261,11 @@ class ToolDefClassObject(object): > # @param ConfDir: Conf dir > # > # @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] > if ToolsDefFile: > ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) >@@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): > >ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, >gDefaultToolsDefFile))) > else: > 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 # script. > # >diff --git a/BaseTools/Source/Python/GenFds/GenFds.py >b/BaseTools/Source/Python/GenFds/GenFds.py >index 5888997761bb..51943411ad1f 100644 >--- a/BaseTools/Source/Python/GenFds/GenFds.py >+++ b/BaseTools/Source/Python/GenFds/GenFds.py >@@ -18,11 +18,11 @@ from glob import glob from struct import unpack >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 >from Common.StringUtils import NormPath from Common.Misc import >DirCache, PathClass, GuidStructureStringToGuidString @@ -205,12 +205,10 >@@ def GenFdsApi(FdsCommandDict, >WorkSpaceDataBase=None): > GenFdsGlobalVariable.ConfDir = ConfDirectoryPath > if not GlobalData.gConfDirectory: > 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] > if len(BuildTargetList) != 1: > EdkLogger.error("GenFds", OPTION_VALUE_INVALID, >ExtraData="Only allows one instance for Target.") diff --git >a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >index c9c476cf6154..f49af9371b8d 100644 >--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >+++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >@@ -20,13 +20,13 @@ from array import array > > 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 from >Common.MultipleWorkspace import MultipleWorkspace as mws import >Common.GlobalData as GlobalData @@ -93,35 +93,25 @@ class >GenFdsGlobalVariable: > # > @staticmethod > 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_CO >NF] >- if not BuildRuleFile: >- BuildRuleFile = 'Conf/build_rule.txt' >- GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) >- ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >- 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][GenFdsGlo >balVariable.ToolChainTag]: >- GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.ToolChainTag] >+ GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj >+ ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >+ 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][GenFdsGlo >balVariable.ToolChainTag]: >+ GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.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] >+ 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 > # @param Inf: object of InfBuildData > # @param Arch: current arch >@@ -834,11 +824,11 @@ class GenFdsGlobalVariable: > # @param KeyStringList Filter for inputs of section generation > # @param CurrentArchList Arch list > # @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 > ToolChain = GenFdsGlobalVariable.ToolChainTag > if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: >@@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, >CurrentArchList, >NameGuid): > > if GenFdsGlobalVariable.GuidToolDefinition: > 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] + \ > '_' + \ > KeyList[2] >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py >b/BaseTools/Source/Python/Workspace/DscBuildData.py >index 9f65ad54257d..bfd203aee805 100644 >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py >@@ -17,12 +17,12 @@ from Common.StringUtils import * from >Common.DataType import * 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 * > > from .WorkspaceCommon import GetDeclaredPcd @@ -3259,19 +3259,15 @@ >class DscBuildData(PlatformBuildClassObject): > @property > def ToolChainFamily(self): > 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_C >ONF] > 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] >\ > or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: > self._ToolChainFamily = TAB_COMPILER_MSFT diff >--git a/BaseTools/Source/Python/build/build.py >b/BaseTools/Source/Python/build/build.py >index 8c3315619afa..5e13453a1254 100644 >--- a/BaseTools/Source/Python/build/build.py >+++ b/BaseTools/Source/Python/build/build.py >@@ -28,12 +28,12 @@ import threading > from optparse import OptionParser > 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 * from Common.BuildToolError import * from >Workspace.WorkspaceDatabase import WorkspaceDatabase @@ -714,12 +714,12 >@@ class Build(): > if self.SkuId: > GlobalData.gSKUID_CMD = self.SkuId > 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 > GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if >BuildOptions.OptionPcd else [] > #Set global flag for build mode @@ -813,12 +813,12 @@ class >Build(): > EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) > if self.Postbuild: > 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() > > EdkLogger.info("") > os.chdir(self.WorkspaceDir) >@@ -826,27 +826,10 @@ class Build(): > ## Load configuration > # > # 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: > self.ArchList = >self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] > self.ArchList = tuple(self.ArchList) >-- >2.20.1.windows.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <15B0502B4303BDC5.2265@groups.io>]
* Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file [not found] ` <15B0502B4303BDC5.2265@groups.io> @ 2019-07-11 12:12 ` Bob Feng 2019-07-11 14:30 ` Liming Gao 0 siblings, 1 reply; 6+ messages in thread From: Bob Feng @ 2019-07-11 12:12 UTC (permalink / raw) To: devel@edk2.groups.io, Feng, Bob C, Gao, Liming Liming, I tested the cases: 1. move tool_def.txt and build_rule.txt from Conf to another folder and update target.txt to set BUILD_RULE_CONF and TOOL_CHAIN_CONF to point to the new folder. 2. Move Conf folder to a new place and Set WORKSPACE to point the parent folder of Conf. Append original WORKSPACE folder to PACKAGES_PATH My patch works fine. But there is a bug in original code for case 1#, I'll send out another patch to fix that. Thanks, Bob -----Original Message----- From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Bob Feng Sent: Thursday, July 11, 2019 5:27 PM To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file Liming, Thanks for your comments. I'll test the cases you mentioned. Thanks, Bob -----Original Message----- From: Gao, Liming Sent: Thursday, July 11, 2019 5:11 PM To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io Subject: RE: [Patch 1/1] BaseTools: Singleton the object to handle build conf file Bob: target.txt is from Conf directory. build_rule.txt and tools_def.txt are specified in target.txt. Please take care this case that they may have the different file name. And, Conf directory is relative to WORKSPACE and PACKAGES_PATH. Does this patch support it? Thanks Liming >-----Original Message----- >From: Feng, Bob C >Sent: Friday, June 28, 2019 3:07 PM >To: devel@edk2.groups.io >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C ><bob.c.feng@intel.com> >Subject: [Patch 1/1] 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 <liming.gao@intel.com> >Signed-off-by: Bob Feng <bob.c.feng@intel.com> >--- > BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- > .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ > .../Python/Common/TargetTxtClassObject.py | 2 + > .../Python/Common/ToolDefClassObject.py | 6 ++- > BaseTools/Source/Python/GenFds/GenFds.py | 4 +- > .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- > .../Source/Python/Workspace/DscBuildData.py | 8 +-- > BaseTools/Source/Python/build/build.py | 29 +++------- > 8 files changed, 62 insertions(+), 96 deletions(-) > >diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py >b/BaseTools/Source/Python/AutoGen/AutoGen.py >index e8e09dc8a366..a1f7f5641e09 100644 >--- a/BaseTools/Source/Python/AutoGen/AutoGen.py >+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py >@@ -22,11 +22,12 @@ from . import GenC > from . import GenMake > 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 * from Common.DataType import * from >Common.Misc import * @@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = >re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") > > ## Mapping Makefile type > 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" > gAutoGenStringFileName = "%(module_name)sStrDefs.h" > gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" >@@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): > ## Return the build options specific for EDKII modules in this platform > @cached_property > 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_RUL >E_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): > RetVal = set() > for La in self.LibraryAutoGenList: >@@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): > return RetVal > > @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] > if not RuleObject: > # build type is always module type, but ... >diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py >b/BaseTools/Source/Python/AutoGen/BuildEngine.py >index 14e61140e7ba..bb9153447793 100644 >--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py >+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py >@@ -18,10 +18,13 @@ from Common.LongFilePathSupport import >OpenLongFilePath as open from Common.GlobalData import * 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 > > ## Convert file type to file list macro name # @@ -581,10 +584,29 @@ >class BuildRule: > _ExtraDependency : ParseCommonSubSection, > _Command : ParseCommonSubSection, > _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__': > import sys > EdkLogger.Initialize() >diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >index 9d7673b41bb5..79a5acc01074 100644 >--- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py >+++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py >@@ -144,10 +144,12 @@ class TargetTxtClassObject(object): > def TargetTxtDict(ConfDir): > Target = TargetTxtClassObject() > 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 # script. > # >diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py >b/BaseTools/Source/Python/Common/ToolDefClassObject.py >index 5d692ea13cfc..0bfa263270c3 100644 >--- a/BaseTools/Source/Python/Common/ToolDefClassObject.py >+++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py >@@ -12,11 +12,11 @@ from __future__ import absolute_import import >Common.LongFilePathOs as os 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 >import Common.GlobalData as GlobalData from Common import GlobalData >@@ -261,11 +261,11 @@ class ToolDefClassObject(object): > # @param ConfDir: Conf dir > # > # @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] > if ToolsDefFile: > ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) >@@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): > >ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, >gDefaultToolsDefFile))) > else: > 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 # script. > # >diff --git a/BaseTools/Source/Python/GenFds/GenFds.py >b/BaseTools/Source/Python/GenFds/GenFds.py >index 5888997761bb..51943411ad1f 100644 >--- a/BaseTools/Source/Python/GenFds/GenFds.py >+++ b/BaseTools/Source/Python/GenFds/GenFds.py >@@ -18,11 +18,11 @@ from glob import glob from struct import unpack >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 >from Common.StringUtils import NormPath from Common.Misc import >DirCache, PathClass, GuidStructureStringToGuidString @@ -205,12 +205,10 >@@ def GenFdsApi(FdsCommandDict, >WorkSpaceDataBase=None): > GenFdsGlobalVariable.ConfDir = ConfDirectoryPath > if not GlobalData.gConfDirectory: > 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] > if len(BuildTargetList) != 1: > EdkLogger.error("GenFds", OPTION_VALUE_INVALID, >ExtraData="Only allows one instance for Target.") diff --git >a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >index c9c476cf6154..f49af9371b8d 100644 >--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >+++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py >@@ -20,13 +20,13 @@ from array import array > > 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 from >Common.MultipleWorkspace import MultipleWorkspace as mws import >Common.GlobalData as GlobalData @@ -93,35 +93,25 @@ class >GenFdsGlobalVariable: > # > @staticmethod > 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_CO >NF] >- if not BuildRuleFile: >- BuildRuleFile = 'Conf/build_rule.txt' >- GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) >- ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >- 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][GenFdsGlo >balVariable.ToolChainTag]: >- GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.ToolChainTag] >+ GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj >+ ToolDefinitionFile = >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C >ONF] >+ 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][GenFdsGlo >balVariable.ToolChainTag]: >+ GenFdsGlobalVariable.BuildRuleFamily = >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo >balVariable.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] >+ 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 > # @param Inf: object of InfBuildData > # @param Arch: current arch >@@ -834,11 +824,11 @@ class GenFdsGlobalVariable: > # @param KeyStringList Filter for inputs of section generation > # @param CurrentArchList Arch list > # @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 > ToolChain = GenFdsGlobalVariable.ToolChainTag > if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: >@@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, >CurrentArchList, >NameGuid): > > if GenFdsGlobalVariable.GuidToolDefinition: > 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] + \ > '_' + \ > KeyList[2] >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py >b/BaseTools/Source/Python/Workspace/DscBuildData.py >index 9f65ad54257d..bfd203aee805 100644 >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py >@@ -17,12 +17,12 @@ from Common.StringUtils import * from >Common.DataType import * 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 * > > from .WorkspaceCommon import GetDeclaredPcd @@ -3259,19 +3259,15 @@ >class DscBuildData(PlatformBuildClassObject): > @property > def ToolChainFamily(self): > 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_C >ONF] > 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] >\ > or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: > self._ToolChainFamily = TAB_COMPILER_MSFT diff >--git a/BaseTools/Source/Python/build/build.py >b/BaseTools/Source/Python/build/build.py >index 8c3315619afa..5e13453a1254 100644 >--- a/BaseTools/Source/Python/build/build.py >+++ b/BaseTools/Source/Python/build/build.py >@@ -28,12 +28,12 @@ import threading > from optparse import OptionParser > 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 * from Common.BuildToolError import * from >Workspace.WorkspaceDatabase import WorkspaceDatabase @@ -714,12 +714,12 >@@ class Build(): > if self.SkuId: > GlobalData.gSKUID_CMD = self.SkuId > 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 > GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if >BuildOptions.OptionPcd else [] > #Set global flag for build mode @@ -813,12 +813,12 @@ class >Build(): > EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) > if self.Postbuild: > 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() > > EdkLogger.info("") > os.chdir(self.WorkspaceDir) >@@ -826,27 +826,10 @@ class Build(): > ## Load configuration > # > # 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: > self.ArchList = >self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] > self.ArchList = tuple(self.ArchList) >-- >2.20.1.windows.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file 2019-07-11 12:12 ` [edk2-devel] " Bob Feng @ 2019-07-11 14:30 ` Liming Gao 2019-07-11 14:57 ` Bob Feng 0 siblings, 1 reply; 6+ messages in thread From: Liming Gao @ 2019-07-11 14:30 UTC (permalink / raw) To: Feng, Bob C, devel@edk2.groups.io Bob: > -----Original Message----- > From: Feng, Bob C > Sent: Thursday, July 11, 2019 8:13 PM > To: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com> > Subject: RE: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file > > Liming, > > I tested the cases: > 1. move tool_def.txt and build_rule.txt from Conf to another folder and update target.txt to set BUILD_RULE_CONF and > TOOL_CHAIN_CONF to point to the new folder. If their file name is also changed in target.txt, does it work in current BaseTools? I just want to make sure keep the same support scope with this change. Thanks Liming > 2. Move Conf folder to a new place and Set WORKSPACE to point the parent folder of Conf. Append original WORKSPACE folder to > PACKAGES_PATH > > My patch works fine. > > But there is a bug in original code for case 1#, I'll send out another patch to fix that. > > Thanks, > Bob > > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Bob Feng > Sent: Thursday, July 11, 2019 5:27 PM > To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io > Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file > > Liming, > > Thanks for your comments. I'll test the cases you mentioned. > > Thanks, > Bob > > -----Original Message----- > From: Gao, Liming > Sent: Thursday, July 11, 2019 5:11 PM > To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io > Subject: RE: [Patch 1/1] BaseTools: Singleton the object to handle build conf file > > Bob: > target.txt is from Conf directory. build_rule.txt and tools_def.txt are specified in target.txt. Please take care this case that they may have > the different file name. > > And, Conf directory is relative to WORKSPACE and PACKAGES_PATH. Does this patch support it? > > Thanks > Liming > >-----Original Message----- > >From: Feng, Bob C > >Sent: Friday, June 28, 2019 3:07 PM > >To: devel@edk2.groups.io > >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C > ><bob.c.feng@intel.com> > >Subject: [Patch 1/1] 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 <liming.gao@intel.com> > >Signed-off-by: Bob Feng <bob.c.feng@intel.com> > >--- > > BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- > > .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ > > .../Python/Common/TargetTxtClassObject.py | 2 + > > .../Python/Common/ToolDefClassObject.py | 6 ++- > > BaseTools/Source/Python/GenFds/GenFds.py | 4 +- > > .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- > > .../Source/Python/Workspace/DscBuildData.py | 8 +-- > > BaseTools/Source/Python/build/build.py | 29 +++------- > > 8 files changed, 62 insertions(+), 96 deletions(-) > > > >diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py > >b/BaseTools/Source/Python/AutoGen/AutoGen.py > >index e8e09dc8a366..a1f7f5641e09 100644 > >--- a/BaseTools/Source/Python/AutoGen/AutoGen.py > >+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py > >@@ -22,11 +22,12 @@ from . import GenC > > from . import GenMake > > 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 * from Common.DataType import * from > >Common.Misc import * @@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = > >re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") > > > > ## Mapping Makefile type > > 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" > > gAutoGenStringFileName = "%(module_name)sStrDefs.h" > > gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" > >@@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): > > ## Return the build options specific for EDKII modules in this platform > > @cached_property > > 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_RUL > >E_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): > > RetVal = set() > > for La in self.LibraryAutoGenList: > >@@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): > > return RetVal > > > > @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] > > if not RuleObject: > > # build type is always module type, but ... > >diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py > >b/BaseTools/Source/Python/AutoGen/BuildEngine.py > >index 14e61140e7ba..bb9153447793 100644 > >--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py > >+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py > >@@ -18,10 +18,13 @@ from Common.LongFilePathSupport import > >OpenLongFilePath as open from Common.GlobalData import * 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 > > > > ## Convert file type to file list macro name # @@ -581,10 +584,29 @@ > >class BuildRule: > > _ExtraDependency : ParseCommonSubSection, > > _Command : ParseCommonSubSection, > > _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__': > > import sys > > EdkLogger.Initialize() > >diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >b/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >index 9d7673b41bb5..79a5acc01074 100644 > >--- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >+++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >@@ -144,10 +144,12 @@ class TargetTxtClassObject(object): > > def TargetTxtDict(ConfDir): > > Target = TargetTxtClassObject() > > 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 # script. > > # > >diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py > >b/BaseTools/Source/Python/Common/ToolDefClassObject.py > >index 5d692ea13cfc..0bfa263270c3 100644 > >--- a/BaseTools/Source/Python/Common/ToolDefClassObject.py > >+++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py > >@@ -12,11 +12,11 @@ from __future__ import absolute_import import > >Common.LongFilePathOs as os 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 > >import Common.GlobalData as GlobalData from Common import GlobalData > >@@ -261,11 +261,11 @@ class ToolDefClassObject(object): > > # @param ConfDir: Conf dir > > # > > # @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] > > if ToolsDefFile: > > ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) > >@@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): > > > >ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, > >gDefaultToolsDefFile))) > > else: > > 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 # script. > > # > >diff --git a/BaseTools/Source/Python/GenFds/GenFds.py > >b/BaseTools/Source/Python/GenFds/GenFds.py > >index 5888997761bb..51943411ad1f 100644 > >--- a/BaseTools/Source/Python/GenFds/GenFds.py > >+++ b/BaseTools/Source/Python/GenFds/GenFds.py > >@@ -18,11 +18,11 @@ from glob import glob from struct import unpack > >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 > >from Common.StringUtils import NormPath from Common.Misc import > >DirCache, PathClass, GuidStructureStringToGuidString @@ -205,12 +205,10 > >@@ def GenFdsApi(FdsCommandDict, > >WorkSpaceDataBase=None): > > GenFdsGlobalVariable.ConfDir = ConfDirectoryPath > > if not GlobalData.gConfDirectory: > > 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] > > if len(BuildTargetList) != 1: > > EdkLogger.error("GenFds", OPTION_VALUE_INVALID, > >ExtraData="Only allows one instance for Target.") diff --git > >a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >index c9c476cf6154..f49af9371b8d 100644 > >--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >+++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >@@ -20,13 +20,13 @@ from array import array > > > > 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 from > >Common.MultipleWorkspace import MultipleWorkspace as mws import > >Common.GlobalData as GlobalData @@ -93,35 +93,25 @@ class > >GenFdsGlobalVariable: > > # > > @staticmethod > > 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_CO > >NF] > >- if not BuildRuleFile: > >- BuildRuleFile = 'Conf/build_rule.txt' > >- GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) > >- ToolDefinitionFile = > >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C > >ONF] > >- 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][GenFdsGlo > >balVariable.ToolChainTag]: > >- GenFdsGlobalVariable.BuildRuleFamily = > >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo > >balVariable.ToolChainTag] > >+ GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj > >+ ToolDefinitionFile = > >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C > >ONF] > >+ 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][GenFdsGlo > >balVariable.ToolChainTag]: > >+ GenFdsGlobalVariable.BuildRuleFamily = > >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo > >balVariable.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] > >+ 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 > > # @param Inf: object of InfBuildData > > # @param Arch: current arch > >@@ -834,11 +824,11 @@ class GenFdsGlobalVariable: > > # @param KeyStringList Filter for inputs of section generation > > # @param CurrentArchList Arch list > > # @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 > > ToolChain = GenFdsGlobalVariable.ToolChainTag > > if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: > >@@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, > >CurrentArchList, > >NameGuid): > > > > if GenFdsGlobalVariable.GuidToolDefinition: > > 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] + \ > > '_' + \ > > KeyList[2] > >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > >b/BaseTools/Source/Python/Workspace/DscBuildData.py > >index 9f65ad54257d..bfd203aee805 100644 > >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py > >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > >@@ -17,12 +17,12 @@ from Common.StringUtils import * from > >Common.DataType import * 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 * > > > > from .WorkspaceCommon import GetDeclaredPcd @@ -3259,19 +3259,15 @@ > >class DscBuildData(PlatformBuildClassObject): > > @property > > def ToolChainFamily(self): > > 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_C > >ONF] > > 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] > >\ > > or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: > > self._ToolChainFamily = TAB_COMPILER_MSFT diff > >--git a/BaseTools/Source/Python/build/build.py > >b/BaseTools/Source/Python/build/build.py > >index 8c3315619afa..5e13453a1254 100644 > >--- a/BaseTools/Source/Python/build/build.py > >+++ b/BaseTools/Source/Python/build/build.py > >@@ -28,12 +28,12 @@ import threading > > from optparse import OptionParser > > 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 * from Common.BuildToolError import * from > >Workspace.WorkspaceDatabase import WorkspaceDatabase @@ -714,12 +714,12 > >@@ class Build(): > > if self.SkuId: > > GlobalData.gSKUID_CMD = self.SkuId > > 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 > > GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if > >BuildOptions.OptionPcd else [] > > #Set global flag for build mode @@ -813,12 +813,12 @@ class > >Build(): > > EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) > > if self.Postbuild: > > 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() > > > > EdkLogger.info("") > > os.chdir(self.WorkspaceDir) > >@@ -826,27 +826,10 @@ class Build(): > > ## Load configuration > > # > > # 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: > > self.ArchList = > >self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] > > self.ArchList = tuple(self.ArchList) > >-- > >2.20.1.windows.1 > > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file 2019-07-11 14:30 ` Liming Gao @ 2019-07-11 14:57 ` Bob Feng 0 siblings, 0 replies; 6+ messages in thread From: Bob Feng @ 2019-07-11 14:57 UTC (permalink / raw) To: Gao, Liming, devel@edk2.groups.io Yes. it will work after I fix this bug in WorkspaceAutoGen._GetMetaFiles() Here, the code assumes the tools_def.txt and build_rule.txt are always in Conf directory. # # add build_rule.txt & tools_def.txt # AllWorkSpaceMetaFiles.add(os.path.join(GlobalData.gConfDirectory, gDefaultBuildRuleFile)) AllWorkSpaceMetaFiles.add(os.path.join(GlobalData.gConfDirectory, gDefaultToolsDefFile)) Thanks, Bob -----Original Message----- From: Gao, Liming Sent: Thursday, July 11, 2019 10:31 PM To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io Subject: RE: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object to handle build conf file Bob: > -----Original Message----- > From: Feng, Bob C > Sent: Thursday, July 11, 2019 8:13 PM > To: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Gao, > Liming <liming.gao@intel.com> > Subject: RE: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object > to handle build conf file > > Liming, > > I tested the cases: > 1. move tool_def.txt and build_rule.txt from Conf to another folder > and update target.txt to set BUILD_RULE_CONF and TOOL_CHAIN_CONF to point to the new folder. If their file name is also changed in target.txt, does it work in current BaseTools? I just want to make sure keep the same support scope with this change. Thanks Liming > 2. Move Conf folder to a new place and Set WORKSPACE to point the > parent folder of Conf. Append original WORKSPACE folder to > PACKAGES_PATH > > My patch works fine. > > But there is a bug in original code for case 1#, I'll send out another patch to fix that. > > Thanks, > Bob > > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Bob Feng > Sent: Thursday, July 11, 2019 5:27 PM > To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io > Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Singleton the object > to handle build conf file > > Liming, > > Thanks for your comments. I'll test the cases you mentioned. > > Thanks, > Bob > > -----Original Message----- > From: Gao, Liming > Sent: Thursday, July 11, 2019 5:11 PM > To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io > Subject: RE: [Patch 1/1] BaseTools: Singleton the object to handle > build conf file > > Bob: > target.txt is from Conf directory. build_rule.txt and tools_def.txt > are specified in target.txt. Please take care this case that they may have the different file name. > > And, Conf directory is relative to WORKSPACE and PACKAGES_PATH. Does this patch support it? > > Thanks > Liming > >-----Original Message----- > >From: Feng, Bob C > >Sent: Friday, June 28, 2019 3:07 PM > >To: devel@edk2.groups.io > >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C > ><bob.c.feng@intel.com> > >Subject: [Patch 1/1] 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 <liming.gao@intel.com> > >Signed-off-by: Bob Feng <bob.c.feng@intel.com> > >--- > > BaseTools/Source/Python/AutoGen/AutoGen.py | 33 ++---------- > > .../Source/Python/AutoGen/BuildEngine.py | 22 ++++++++ > > .../Python/Common/TargetTxtClassObject.py | 2 + > > .../Python/Common/ToolDefClassObject.py | 6 ++- > > BaseTools/Source/Python/GenFds/GenFds.py | 4 +- > > .../Python/GenFds/GenFdsGlobalVariable.py | 54 ++++++++----------- > > .../Source/Python/Workspace/DscBuildData.py | 8 +-- > > BaseTools/Source/Python/build/build.py | 29 +++------- > > 8 files changed, 62 insertions(+), 96 deletions(-) > > > >diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py > >b/BaseTools/Source/Python/AutoGen/AutoGen.py > >index e8e09dc8a366..a1f7f5641e09 100644 > >--- a/BaseTools/Source/Python/AutoGen/AutoGen.py > >+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py > >@@ -22,11 +22,12 @@ from . import GenC from . import GenMake 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 * from Common.DataType import * from > >Common.Misc import * @@ -76,16 +77,10 @@ gEfiVarStoreGuidPattern = > >re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})") > > > > ## Mapping Makefile type > > 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" > > gAutoGenStringFileName = "%(module_name)sStrDefs.h" > > gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk" > >@@ -1964,32 +1959,10 @@ class PlatformAutoGen(AutoGen): > > ## Return the build options specific for EDKII modules in this platform > > @cached_property > > 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_RU > >L > >E_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): > > RetVal = set() > > for La in self.LibraryAutoGenList: > >@@ -3143,11 +3116,11 @@ class ModuleAutoGen(AutoGen): > > return RetVal > > > > @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] > > if not RuleObject: > > # build type is always module type, but ... > >diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py > >b/BaseTools/Source/Python/AutoGen/BuildEngine.py > >index 14e61140e7ba..bb9153447793 100644 > >--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py > >+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py > >@@ -18,10 +18,13 @@ from Common.LongFilePathSupport import > >OpenLongFilePath as open from Common.GlobalData import * 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 > > > > ## Convert file type to file list macro name # @@ -581,10 +584,29 > >@@ class BuildRule: > > _ExtraDependency : ParseCommonSubSection, > > _Command : ParseCommonSubSection, > > _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__': > > import sys > > EdkLogger.Initialize() > >diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >b/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >index 9d7673b41bb5..79a5acc01074 100644 > >--- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >+++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py > >@@ -144,10 +144,12 @@ class TargetTxtClassObject(object): > > def TargetTxtDict(ConfDir): > > Target = TargetTxtClassObject() > > 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 # script. > > # > >diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py > >b/BaseTools/Source/Python/Common/ToolDefClassObject.py > >index 5d692ea13cfc..0bfa263270c3 100644 > >--- a/BaseTools/Source/Python/Common/ToolDefClassObject.py > >+++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py > >@@ -12,11 +12,11 @@ from __future__ import absolute_import import > >Common.LongFilePathOs as os 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 import Common.GlobalData as GlobalData from Common import > >GlobalData @@ -261,11 +261,11 @@ class ToolDefClassObject(object): > > # @param ConfDir: Conf dir > > # > > # @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] > > if ToolsDefFile: > > ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) > >@@ -273,10 +273,12 @@ def ToolDefDict(ConfDir): > > > >ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, > >gDefaultToolsDefFile))) > > else: > > > >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 # script. > > # > >diff --git a/BaseTools/Source/Python/GenFds/GenFds.py > >b/BaseTools/Source/Python/GenFds/GenFds.py > >index 5888997761bb..51943411ad1f 100644 > >--- a/BaseTools/Source/Python/GenFds/GenFds.py > >+++ b/BaseTools/Source/Python/GenFds/GenFds.py > >@@ -18,11 +18,11 @@ from glob import glob from struct import unpack > >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 > >from Common.StringUtils import NormPath from Common.Misc import > >DirCache, PathClass, GuidStructureStringToGuidString @@ -205,12 > >+205,10 @@ def GenFdsApi(FdsCommandDict, > >WorkSpaceDataBase=None): > > GenFdsGlobalVariable.ConfDir = ConfDirectoryPath > > if not GlobalData.gConfDirectory: > > 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] > > if len(BuildTargetList) != 1: > > EdkLogger.error("GenFds", OPTION_VALUE_INVALID, > >ExtraData="Only allows one instance for Target.") diff --git > >a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >index c9c476cf6154..f49af9371b8d 100644 > >--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >+++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py > >@@ -20,13 +20,13 @@ from array import array > > > > 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 > >from Common.MultipleWorkspace import MultipleWorkspace as mws import > >Common.GlobalData as GlobalData @@ -93,35 +93,25 @@ class > >GenFdsGlobalVariable: > > # > > @staticmethod > > 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_CO > >NF] > >- if not BuildRuleFile: > >- BuildRuleFile = 'Conf/build_rule.txt' > >- GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) > >- ToolDefinitionFile = > >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C > >ONF] > >- 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][GenFdsGlo > >balVariable.ToolChainTag]: > >- GenFdsGlobalVariable.BuildRuleFamily = > >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo > >balVariable.ToolChainTag] > >+ GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj > >+ ToolDefinitionFile = > >TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_C > >ONF] > >+ 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][GenFdsGlo > >balVariable.ToolChainTag]: > >+ GenFdsGlobalVariable.BuildRuleFamily = > >ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlo > >balVariable.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] > >+ 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 > > # @param Inf: object of InfBuildData > > # @param Arch: current arch > >@@ -834,11 +824,11 @@ class GenFdsGlobalVariable: > > # @param KeyStringList Filter for inputs of section generation > > # @param CurrentArchList Arch list > > # @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 > > ToolChain = GenFdsGlobalVariable.ToolChainTag > > if ToolChain not in ToolDb['TOOL_CHAIN_TAG']: > >@@ -850,19 +840,19 @@ def FindExtendTool(KeyStringList, > >CurrentArchList, > >NameGuid): > > > > if GenFdsGlobalVariable.GuidToolDefinition: > > 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] + \ > > '_' + \ > > KeyList[2] > >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > >b/BaseTools/Source/Python/Workspace/DscBuildData.py > >index 9f65ad54257d..bfd203aee805 100644 > >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py > >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > >@@ -17,12 +17,12 @@ from Common.StringUtils import * from > >Common.DataType import * 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 * > > > > from .WorkspaceCommon import GetDeclaredPcd @@ -3259,19 +3259,15 @@ > >class DscBuildData(PlatformBuildClassObject): > > @property > > def ToolChainFamily(self): > > 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_C > >ONF] > > 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] > >\ > > or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]: > > self._ToolChainFamily = TAB_COMPILER_MSFT diff > >--git a/BaseTools/Source/Python/build/build.py > >b/BaseTools/Source/Python/build/build.py > >index 8c3315619afa..5e13453a1254 100644 > >--- a/BaseTools/Source/Python/build/build.py > >+++ b/BaseTools/Source/Python/build/build.py > >@@ -28,12 +28,12 @@ import threading > > from optparse import OptionParser > > 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 * from Common.BuildToolError import * from > >Workspace.WorkspaceDatabase import WorkspaceDatabase @@ -714,12 > >+714,12 @@ class Build(): > > if self.SkuId: > > GlobalData.gSKUID_CMD = self.SkuId > > 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 > > GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if > >BuildOptions.OptionPcd else [] > > #Set global flag for build mode @@ -813,12 +813,12 @@ class > >Build(): > > EdkLogger.quiet("%-16s = %s" % ("PREBUILD", self.Prebuild)) > > if self.Postbuild: > > 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() > > > > EdkLogger.info("") > > os.chdir(self.WorkspaceDir) > >@@ -826,27 +826,10 @@ class Build(): > > ## Load configuration > > # > > # 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: > > self.ArchList = > >self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET_ARCH] > > self.ArchList = tuple(self.ArchList) > >-- > >2.20.1.windows.1 > > > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-07-11 14:57 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-06-28 7:07 [Patch 1/1] BaseTools: Singleton the object to handle build conf file Bob Feng 2019-07-11 9:11 ` Liming Gao 2019-07-11 9:26 ` Bob Feng [not found] ` <15B0502B4303BDC5.2265@groups.io> 2019-07-11 12:12 ` [edk2-devel] " Bob Feng 2019-07-11 14:30 ` Liming Gao 2019-07-11 14:57 ` Bob Feng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox