BaseTools: Move FindExtendTool to GenFdsGlobalVariable.py
authorGary Lin <glin@suse.com>
Fri, 13 Jul 2018 10:18:35 +0000 (18:18 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Mon, 16 Jul 2018 03:22:14 +0000 (11:22 +0800)
Importing "FindExtendTool" from GenFds.GenFds could create the following
circular imports:

* GenFds.FdfParser => GenFds.Capsule => GenFds.GenFds => GenFds.FdfParser
* GenFds.FdfParser => GenFds.Fd => GenFds.Fv => GenFds.AprioriSection =>
  GenFds.FfsFileStatement => GenFds.GuidSection => GenFds.GenFds =>
  GenFds.FdfParser

This commit moves "FindExtendTool" to GenFdsGlobalVariable.py to break
the circles. Besides, FindExtendTool is tweaked slightly with the
following changes:

ToolDefClassObject.ToolDefDict => ToolDefDict
TAB_GUID => DataType.TAB_GUID
TAB_TOD_DEFINES_TARGET => DataType.TAB_TOD_DEFINES_TARGET
TAB_TOD_DEFINES_TOOL_CHAIN_TAG => DataType.TAB_TOD_DEFINES_TOOL_CHAIN_TAG
TAB_TOD_DEFINES_TARGET_ARCH => DataType.TAB_TOD_DEFINES_TARGET_ARCH

Contributed-under: TianoCore Contribution Agreement 1.1
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
BaseTools/Source/Python/GenFds/Capsule.py
BaseTools/Source/Python/GenFds/GenFds.py
BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
BaseTools/Source/Python/GenFds/GuidSection.py

index 27932ef..8471cd5 100644 (file)
@@ -17,6 +17,7 @@
 #\r
 from __future__ import absolute_import\r
 from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from .GenFdsGlobalVariable import FindExtendTool\r
 from CommonDataClass.FdfClass import CapsuleClassObject\r
 import Common.LongFilePathOs as os\r
 import subprocess\r
@@ -65,7 +66,6 @@ class Capsule (CapsuleClassObject) :
         #     UINT32            CapsuleImageSize;\r
         # } EFI_CAPSULE_HEADER;\r
         #\r
-        from .GenFds import FindExtendTool\r
         Header = BytesIO()\r
         #\r
         # Use FMP capsule GUID: 6DCBD5ED-E82D-4C44-BDA1-7194199AD92A\r
index c0b60b9..865c509 100644 (file)
@@ -368,98 +368,6 @@ def SingleCheckCallback(option, opt_str, value, parser):
     else:\r
         parser.error("Option %s only allows one instance in command line!" % option)\r
 \r
-## FindExtendTool()\r
-#\r
-#  Find location of tools to process data\r
-#\r
-#  @param  KeyStringList    Filter for inputs of section generation\r
-#  @param  CurrentArchList  Arch list\r
-#  @param  NameGuid         The Guid name\r
-#\r
-def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):\r
-    ToolDb = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.ConfDir).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
-        ToolChain = GenFdsGlobalVariable.ToolChainTag\r
-        if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:\r
-            EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)\r
-        KeyStringList = [Target + '_' + ToolChain + '_' + CurrentArchList[0]]\r
-        for Arch in CurrentArchList:\r
-            if Target + '_' + ToolChain + '_' + Arch not in KeyStringList:\r
-                KeyStringList.append(Target + '_' + ToolChain + '_' + Arch)\r
-\r
-    if GenFdsGlobalVariable.GuidToolDefinition:\r
-        if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:\r
-            return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]\r
-\r
-    ToolDefinition = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.ConfDir).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
-            Key = KeyList[0] + \\r
-                  '_' + \\r
-                  KeyList[1] + \\r
-                  '_' + \\r
-                  KeyList[2]\r
-            if Key in KeyStringList and KeyList[4] == TAB_GUID:\r
-                ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
-                ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
-                ToolPath = ToolDefinition.get(ToolPathKey)\r
-                ToolOption = ToolDefinition.get(ToolOptionKey)\r
-                if ToolPathTmp is None:\r
-                    ToolPathTmp = ToolPath\r
-                else:\r
-                    if ToolPathTmp != ToolPath:\r
-                        EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))\r
-\r
-    BuildOption = {}\r
-    for Arch in CurrentArchList:\r
-        Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
-        # key is (ToolChainFamily, ToolChain, CodeBase)\r
-        for item in Platform.BuildOptions:\r
-            if '_PATH' in item[1] or '_FLAGS' in item[1] or '_GUID' in item[1]:\r
-                if not item[0] or (item[0] and GenFdsGlobalVariable.ToolChainFamily== item[0]):\r
-                    if item[1] not in BuildOption:\r
-                        BuildOption[item[1]] = Platform.BuildOptions[item]\r
-        if BuildOption:\r
-            ToolList = [TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG, TAB_TOD_DEFINES_TARGET_ARCH]\r
-            for Index in range(2, -1, -1):\r
-                for Key in list(BuildOption.keys()):\r
-                    List = Key.split('_')\r
-                    if List[Index] == '*':\r
-                        for String in ToolDb[ToolList[Index]]:\r
-                            if String in [Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]:\r
-                                List[Index] = String\r
-                                NewKey = '%s_%s_%s_%s_%s' % tuple(List)\r
-                                if NewKey not in BuildOption:\r
-                                    BuildOption[NewKey] = BuildOption[Key]\r
-                                    continue\r
-                                del BuildOption[Key]\r
-                    elif List[Index] not in ToolDb[ToolList[Index]]:\r
-                        del BuildOption[Key]\r
-    if BuildOption:\r
-        if not KeyList:\r
-            for Op in BuildOption:\r
-                if NameGuid == BuildOption[Op]:\r
-                    KeyList = Op.split('_')\r
-                    Key = KeyList[0] + '_' + KeyList[1] +'_' + KeyList[2]\r
-                    if Key in KeyStringList and KeyList[4] == TAB_GUID:\r
-                        ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
-                        ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
-        if ToolPathKey in BuildOption:\r
-            ToolPathTmp = BuildOption[ToolPathKey]\r
-        if ToolOptionKey in BuildOption:\r
-            ToolOption = BuildOption[ToolOptionKey]\r
-\r
-    GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)\r
-    return ToolPathTmp, ToolOption\r
-\r
 ## Parse command line options\r
 #\r
 # Using standard Python module optparse to parse command line option of this tool.\r
index eeb3ec2..52aa7a1 100644 (file)
@@ -27,7 +27,7 @@ from Common import EdkLogger
 from Common.Misc import SaveFileOnChange\r
 \r
 from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.ToolDefClassObject import ToolDefClassObject, ToolDefDict\r
 from AutoGen.BuildEngine import BuildRule\r
 import Common.DataType as DataType\r
 from Common.Misc import PathClass\r
@@ -843,3 +843,95 @@ class GenFdsGlobalVariable:
     DebugLogger = staticmethod(DebugLogger)\r
     MacroExtend = staticmethod (MacroExtend)\r
     GetPcdValue = staticmethod(GetPcdValue)\r
+\r
+## FindExtendTool()\r
+#\r
+#  Find location of tools to process data\r
+#\r
+#  @param  KeyStringList    Filter for inputs of section generation\r
+#  @param  CurrentArchList  Arch list\r
+#  @param  NameGuid         The Guid name\r
+#\r
+def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):\r
+    ToolDb = ToolDefDict(GenFdsGlobalVariable.ConfDir).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
+        ToolChain = GenFdsGlobalVariable.ToolChainTag\r
+        if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:\r
+            EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)\r
+        KeyStringList = [Target + '_' + ToolChain + '_' + CurrentArchList[0]]\r
+        for Arch in CurrentArchList:\r
+            if Target + '_' + ToolChain + '_' + Arch not in KeyStringList:\r
+                KeyStringList.append(Target + '_' + ToolChain + '_' + Arch)\r
+\r
+    if GenFdsGlobalVariable.GuidToolDefinition:\r
+        if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:\r
+            return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]\r
+\r
+    ToolDefinition = ToolDefDict(GenFdsGlobalVariable.ConfDir).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
+            Key = KeyList[0] + \\r
+                  '_' + \\r
+                  KeyList[1] + \\r
+                  '_' + \\r
+                  KeyList[2]\r
+            if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:\r
+                ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
+                ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
+                ToolPath = ToolDefinition.get(ToolPathKey)\r
+                ToolOption = ToolDefinition.get(ToolOptionKey)\r
+                if ToolPathTmp is None:\r
+                    ToolPathTmp = ToolPath\r
+                else:\r
+                    if ToolPathTmp != ToolPath:\r
+                        EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))\r
+\r
+    BuildOption = {}\r
+    for Arch in CurrentArchList:\r
+        Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
+        # key is (ToolChainFamily, ToolChain, CodeBase)\r
+        for item in Platform.BuildOptions:\r
+            if '_PATH' in item[1] or '_FLAGS' in item[1] or '_GUID' in item[1]:\r
+                if not item[0] or (item[0] and GenFdsGlobalVariable.ToolChainFamily== item[0]):\r
+                    if item[1] not in BuildOption:\r
+                        BuildOption[item[1]] = Platform.BuildOptions[item]\r
+        if BuildOption:\r
+            ToolList = [DataType.TAB_TOD_DEFINES_TARGET, DataType.TAB_TOD_DEFINES_TOOL_CHAIN_TAG, DataType.TAB_TOD_DEFINES_TARGET_ARCH]\r
+            for Index in range(2, -1, -1):\r
+                for Key in list(BuildOption.keys()):\r
+                    List = Key.split('_')\r
+                    if List[Index] == '*':\r
+                        for String in ToolDb[ToolList[Index]]:\r
+                            if String in [Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]:\r
+                                List[Index] = String\r
+                                NewKey = '%s_%s_%s_%s_%s' % tuple(List)\r
+                                if NewKey not in BuildOption:\r
+                                    BuildOption[NewKey] = BuildOption[Key]\r
+                                    continue\r
+                                del BuildOption[Key]\r
+                    elif List[Index] not in ToolDb[ToolList[Index]]:\r
+                        del BuildOption[Key]\r
+    if BuildOption:\r
+        if not KeyList:\r
+            for Op in BuildOption:\r
+                if NameGuid == BuildOption[Op]:\r
+                    KeyList = Op.split('_')\r
+                    Key = KeyList[0] + '_' + KeyList[1] +'_' + KeyList[2]\r
+                    if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:\r
+                        ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
+                        ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
+        if ToolPathKey in BuildOption:\r
+            ToolPathTmp = BuildOption[ToolPathKey]\r
+        if ToolOptionKey in BuildOption:\r
+            ToolOption = BuildOption[ToolOptionKey]\r
+\r
+    GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)\r
+    return ToolPathTmp, ToolOption\r
index e41c2fd..fd66073 100644 (file)
@@ -22,6 +22,7 @@ import subprocess
 from .Ffs import Ffs\r
 import Common.LongFilePathOs as os\r
 from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from .GenFdsGlobalVariable import FindExtendTool\r
 from CommonDataClass.FdfClass import GuidSectionClassObject\r
 from Common import ToolDefClassObject\r
 import sys\r
@@ -131,7 +132,6 @@ class GuidSection(GuidSectionClassObject) :
         ExternalTool = None\r
         ExternalOption = None\r
         if self.NameGuid is not None:\r
-            from .GenFds import FindExtendTool\r
             ExternalTool, ExternalOption = FindExtendTool(self.KeyStringList, self.CurrentArchList, self.NameGuid)\r
 \r
         #\r