]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Singleton the object to handle build conf file
authorFeng, Bob C <bob.c.feng@intel.com>
Sat, 13 Apr 2019 08:02:02 +0000 (16:02 +0800)
committerFeng, Bob C <bob.c.feng@intel.com>
Fri, 9 Aug 2019 15:15:51 +0000 (23:15 +0800)
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>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools/Source/Python/AutoGen/BuildEngine.py
BaseTools/Source/Python/Common/TargetTxtClassObject.py
BaseTools/Source/Python/Common/ToolDefClassObject.py
BaseTools/Source/Python/GenFds/GenFds.py
BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools/Source/Python/build/build.py

index 2df055a109f791aa83148e1d1e99bc1ae03081f2..c5b3fbb0a87fd6f9057a8f6aba137b92232bd4d8 100644 (file)
@@ -24,7 +24,8 @@ from . import GenDepex
 from io import BytesIO\r
 \r
 from .StrGather import *\r
-from .BuildEngine import BuildRule\r
+from .BuildEngine import BuildRuleObj as BuildRule\r
+from .BuildEngine import gDefaultBuildRuleFile,AutoGenReqBuildRuleVerNum\r
 import shutil\r
 from Common.LongFilePathSupport import CopyLongFilePath\r
 from Common.BuildToolError import *\r
@@ -78,12 +79,6 @@ gEfiVarStoreGuidPattern = re.compile("\s*guid\s*=\s*({.*?{.*?}\s*})")
 gMakeTypeMap = {TAB_COMPILER_MSFT:"nmake", "GCC":"gmake"}\r
 \r
 \r
-## Build rule configuration file\r
-gDefaultBuildRuleFile = 'build_rule.txt'\r
-\r
-## Build rule default version\r
-AutoGenReqBuildRuleVerNum = "0.1"\r
-\r
 ## default file name for AutoGen\r
 gAutoGenCodeFileName = "AutoGen.c"\r
 gAutoGenHeaderFileName = "AutoGen.h"\r
@@ -1972,28 +1967,6 @@ class PlatformAutoGen(AutoGen):
     def EdkIIBuildOption(self):\r
         return self._ExpandBuildOption(self.Platform.BuildOptions, EDKII_NAME)\r
 \r
-    ## Parse build_rule.txt in Conf Directory.\r
-    #\r
-    #   @retval     BuildRule object\r
-    #\r
-    @cached_property\r
-    def BuildRule(self):\r
-        BuildRuleFile = None\r
-        if TAB_TAT_DEFINES_BUILD_RULE_CONF in self.Workspace.TargetTxt.TargetTxtDictionary:\r
-            BuildRuleFile = self.Workspace.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
-        if not BuildRuleFile:\r
-            BuildRuleFile = gDefaultBuildRuleFile\r
-        RetVal = BuildRule(BuildRuleFile)\r
-        if RetVal._FileVersion == "":\r
-            RetVal._FileVersion = AutoGenReqBuildRuleVerNum\r
-        else:\r
-            if RetVal._FileVersion < AutoGenReqBuildRuleVerNum :\r
-                # If Build Rule's version is less than the version number required by the tools, halting the build.\r
-                EdkLogger.error("build", AUTOGEN_ERROR,\r
-                                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])"\\r
-                                 % (RetVal._FileVersion, AutoGenReqBuildRuleVerNum))\r
-        return RetVal\r
-\r
     ## Summarize the packages used by modules in this platform\r
     @cached_property\r
     def PackageList(self):\r
@@ -3151,7 +3124,7 @@ class ModuleAutoGen(AutoGen):
     @cached_property\r
     def BuildRules(self):\r
         RetVal = {}\r
-        BuildRuleDatabase = self.PlatformInfo.BuildRule\r
+        BuildRuleDatabase = BuildRule\r
         for Type in BuildRuleDatabase.FileTypeList:\r
             #first try getting build rule by BuildRuleFamily\r
             RuleObject = BuildRuleDatabase[Type, self.BuildType, self.Arch, self.BuildRuleFamily]\r
index 14e61140e7bad23727d1209be998a918722e7080..bb915344779338541949dec4ae80c7233daf920a 100644 (file)
@@ -20,6 +20,9 @@ from Common.BuildToolError import *
 from Common.Misc import tdict, PathClass\r
 from Common.StringUtils import NormPath\r
 from Common.DataType import *\r
+from Common.TargetTxtClassObject import TargetTxt\r
+gDefaultBuildRuleFile = 'build_rule.txt'\r
+AutoGenReqBuildRuleVerNum = '0.1'\r
 \r
 import Common.EdkLogger as EdkLogger\r
 \r
@@ -583,6 +586,25 @@ class BuildRule:
         _UnknownSection    : SkipSection,\r
     }\r
 \r
+def GetBuildRule():\r
+    BuildRuleFile = None\r
+    if TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary:\r
+        BuildRuleFile = TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
+    if not BuildRuleFile:\r
+        BuildRuleFile = gDefaultBuildRuleFile\r
+    RetVal = BuildRule(BuildRuleFile)\r
+    if RetVal._FileVersion == "":\r
+        RetVal._FileVersion = AutoGenReqBuildRuleVerNum\r
+    else:\r
+        if RetVal._FileVersion < AutoGenReqBuildRuleVerNum :\r
+            # If Build Rule's version is less than the version number required by the tools, halting the build.\r
+            EdkLogger.error("build", AUTOGEN_ERROR,\r
+                            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])"\\r
+                             % (RetVal._FileVersion, AutoGenReqBuildRuleVerNum))\r
+    return RetVal\r
+\r
+BuildRuleObj = GetBuildRule()\r
+\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
 # script.\r
 if __name__ == '__main__':\r
index 9d7673b41bb5a5359c1b116ee739239ad8b2318e..79a5acc010745794893b416185dfeff8ab78674b 100644 (file)
@@ -146,6 +146,8 @@ def TargetTxtDict(ConfDir):
     Target.LoadTargetTxtFile(os.path.normpath(os.path.join(ConfDir, gDefaultTargetTxtFile)))\r
     return Target\r
 \r
+TargetTxt = TargetTxtDict(os.path.join(os.getenv("WORKSPACE"),"Conf"))\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
index 4fa364942cad0b2e75006a1cb949d214d36906a4..063fa005840a45ea711c889a1a2c9b81afb73e2a 100644 (file)
@@ -14,7 +14,7 @@ import re
 from . import EdkLogger\r
 \r
 from .BuildToolError import *\r
-from Common.TargetTxtClassObject import TargetTxtDict\r
+from Common.TargetTxtClassObject import TargetTxt\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.Misc import PathClass\r
 from Common.StringUtils import NormPath\r
@@ -263,7 +263,7 @@ class ToolDefClassObject(object):
 # @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt\r
 #\r
 def ToolDefDict(ConfDir):\r
-    Target = TargetTxtDict(ConfDir)\r
+    Target = TargetTxt\r
     ToolDef = ToolDefClassObject()\r
     if TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary:\r
         ToolsDefFile = Target.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
@@ -275,6 +275,8 @@ def ToolDefDict(ConfDir):
         ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile)))\r
     return ToolDef\r
 \r
+ToolDef = ToolDefDict((os.path.join(os.getenv("WORKSPACE"),"Conf")))\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
index 5888997761bb92831ea12fbcbb9011e6f41e3509..51943411ad1f72b09a8203fd4ea23b22e2935425 100644 (file)
@@ -20,7 +20,7 @@ from linecache import getlines
 from io import BytesIO\r
 \r
 import Common.LongFilePathOs as os\r
-from Common.TargetTxtClassObject import TargetTxtClassObject\r
+from Common.TargetTxtClassObject import TargetTxt\r
 from Common.DataType import *\r
 import Common.GlobalData as GlobalData\r
 from Common import EdkLogger\r
@@ -207,8 +207,6 @@ def GenFdsApi(FdsCommandDict, WorkSpaceDataBase=None):
             GlobalData.gConfDirectory = GenFdsGlobalVariable.ConfDir\r
         BuildConfigurationFile = os.path.normpath(os.path.join(ConfDirectoryPath, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
-            TargetTxt = TargetTxtClassObject()\r
-            TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
             # if no build target given in command line, get it from target.txt\r
             if not GenFdsGlobalVariable.TargetName:\r
                 BuildTargetList = TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TARGET]\r
index f43743dff4d1cbac7bebda1b91fd171833d993db..037828ea1cca241729da1b05e691b7d062343ac6 100644 (file)
@@ -22,9 +22,9 @@ from Common.BuildToolError import COMMAND_FAILURE,GENFDS_ERROR
 from Common import EdkLogger\r
 from Common.Misc import SaveFileOnChange\r
 \r
-from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject, ToolDefDict\r
-from AutoGen.BuildEngine import BuildRule\r
+from Common.TargetTxtClassObject import TargetTxt\r
+from Common.ToolDefClassObject import ToolDef\r
+from AutoGen.BuildEngine import BuildRuleObj\r
 import Common.DataType as DataType\r
 from Common.Misc import PathClass\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
@@ -95,31 +95,21 @@ class GenFdsGlobalVariable:
     def _LoadBuildRule():\r
         if GenFdsGlobalVariable.__BuildRuleDatabase:\r
             return GenFdsGlobalVariable.__BuildRuleDatabase\r
-        BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.ConfDir, "target.txt"))\r
-        TargetTxt = TargetTxtClassObject()\r
-        if os.path.isfile(BuildConfigurationFile) == True:\r
-            TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
-            if DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary:\r
-                BuildRuleFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
-            if not BuildRuleFile:\r
-                BuildRuleFile = 'Conf/build_rule.txt'\r
-            GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile)\r
-            ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
-            if ToolDefinitionFile == '':\r
-                ToolDefinitionFile = "Conf/tools_def.txt"\r
-            if os.path.isfile(ToolDefinitionFile):\r
-                ToolDef = ToolDefClassObject()\r
-                ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
-                ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
-                if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \\r
-                   and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \\r
-                   and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
-                    GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]\r
-\r
-                if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \\r
-                   and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \\r
-                   and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
-                    GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]\r
+        GenFdsGlobalVariable.__BuildRuleDatabase = BuildRuleObj\r
+        ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
+        if ToolDefinitionFile == '':\r
+            ToolDefinitionFile = "Conf/tools_def.txt"\r
+        if os.path.isfile(ToolDefinitionFile):\r
+            ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
+            if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \\r
+               and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \\r
+               and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
+                GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]\r
+\r
+            if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \\r
+               and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \\r
+               and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
+                GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]\r
         return GenFdsGlobalVariable.__BuildRuleDatabase\r
 \r
     ## GetBuildRules\r
@@ -839,7 +829,7 @@ class GenFdsGlobalVariable:
 #  @param  NameGuid         The Guid name\r
 #\r
 def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):\r
-    ToolDb = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDatabase\r
+    ToolDb = ToolDef.ToolsDefTxtDatabase\r
     # if user not specify filter, try to deduce it from global data.\r
     if KeyStringList is None or KeyStringList == []:\r
         Target = GenFdsGlobalVariable.TargetName\r
@@ -855,15 +845,15 @@ def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):
         if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:\r
             return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]\r
 \r
-    ToolDefinition = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDictionary\r
+    ToolDefinition = ToolDef.ToolsDefTxtDictionary\r
     ToolPathTmp = None\r
     ToolOption = None\r
     ToolPathKey = None\r
     ToolOptionKey = None\r
     KeyList = None\r
-    for ToolDef in ToolDefinition.items():\r
-        if NameGuid.lower() == ToolDef[1].lower():\r
-            KeyList = ToolDef[0].split('_')\r
+    for tool_def in ToolDefinition.items():\r
+        if NameGuid.lower() == tool_def[1].lower():\r
+            KeyList = tool_def[0].split('_')\r
             Key = KeyList[0] + \\r
                   '_' + \\r
                   KeyList[1] + \\r
index 620e48fa7f5945d1c829f701e3aac0469d0379e4..987d9cf13eeadac5d5d32d404c2a764d09fba94f 100644 (file)
@@ -19,8 +19,8 @@ from Common.Misc import *
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
-from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.TargetTxtClassObject import TargetTxt\r
+from Common.ToolDefClassObject import ToolDef\r
 from .MetaDataTable import *\r
 from .MetaFileTable import *\r
 from .MetaFileParser import *\r
@@ -3262,15 +3262,11 @@ class DscBuildData(PlatformBuildClassObject):
         self._ToolChainFamily = TAB_COMPILER_MSFT\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
-            TargetTxt      = TargetTxtClassObject()\r
-            TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
             ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
             if ToolDefinitionFile == '':\r
                 ToolDefinitionFile = "tools_def.txt"\r
                 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\r
-                ToolDef        = ToolDefClassObject()\r
-                ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
                 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
                 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
                    or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
index 6bc528974db1d35a6d118298b50630f4dd4ed63e..07693b97359eef4e40d48a305ba56c3ed01fb374 100644 (file)
@@ -30,8 +30,8 @@ from subprocess import *
 from Common import Misc as Utils\r
 \r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
-from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.TargetTxtClassObject import TargetTxt\r
+from Common.ToolDefClassObject import ToolDef\r
 from Common.DataType import *\r
 from Common.BuildVersion import gBUILD_VERSION\r
 from AutoGen.AutoGen import *\r
@@ -716,8 +716,8 @@ class Build():
         self.ConfDirectory = BuildOptions.ConfDirectory\r
         self.SpawnMode      = True\r
         self.BuildReport    = BuildReport(BuildOptions.ReportFile, BuildOptions.ReportType)\r
-        self.TargetTxt      = TargetTxtClassObject()\r
-        self.ToolDef        = ToolDefClassObject()\r
+        self.TargetTxt      = TargetTxt\r
+        self.ToolDef        = ToolDef\r
         self.AutoGenTime    = 0\r
         self.MakeTime       = 0\r
         self.GenFdsTime     = 0\r
@@ -816,8 +816,8 @@ class Build():
             EdkLogger.quiet("%-16s = %s" % ("POSTBUILD", self.Postbuild))\r
         if self.Prebuild:\r
             self.LaunchPrebuild()\r
-            self.TargetTxt = TargetTxtClassObject()\r
-            self.ToolDef   = ToolDefClassObject()\r
+            self.TargetTxt = TargetTxt\r
+            self.ToolDef   = ToolDef\r
         if not (self.LaunchPrebuildFlag and os.path.exists(self.PlatformBuildPath)):\r
             self.InitBuild()\r
 \r
@@ -829,23 +829,6 @@ class Build():
     #   This method will parse target.txt and get the build configurations.\r
     #\r
     def LoadConfiguration(self):\r
-        #\r
-        # Check target.txt and tools_def.txt and Init them\r
-        #\r
-        BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, gBuildConfiguration))\r
-        if os.path.isfile(BuildConfigurationFile) == True:\r
-            StatusCode = self.TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
-\r
-            ToolDefinitionFile = self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
-            if ToolDefinitionFile == '':\r
-                ToolDefinitionFile = gToolsDefinition\r
-                ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
-            if os.path.isfile(ToolDefinitionFile) == True:\r
-                StatusCode = self.ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
-            else:\r
-                EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=ToolDefinitionFile)\r
-        else:\r
-            EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=BuildConfigurationFile)\r
 \r
         # if no ARCH given in command line, get it from target.txt\r
         if not self.ArchList:\r