]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Fix DSC override of Guided tool
authorMichael D Kinney <michael.d.kinney@intel.com>
Fri, 7 May 2021 15:40:29 +0000 (08:40 -0700)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 10 May 2021 23:28:58 +0000 (23:28 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3359

If the DSC file provides an override of a Guided tool path
and/or Guided tool GUID value, then make sure the one from the
DSC file is used if it is higher priority than the Guided tool
in the tools_def.txt file.  This makes the Guided tool used by
GenFds match the tool listed GuidedSectionTools.txt.

Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Yuwei Chen <yuwei.chen@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
BaseTools/Source/Python/build/build.py

index 832c0da86bb722ea75fe198fd935dab7031ff29a..592d4824a4b3711b7165d663fb6d04817f43983b 100644 (file)
@@ -918,14 +918,13 @@ class PlatformAutoGen(AutoGen):
                 if Tool in self._BuildOptionWithToolDef(RetVal) and Attr in self._BuildOptionWithToolDef(RetVal)[Tool]:\r
                     # check if override is indicated\r
                     if self._BuildOptionWithToolDef(RetVal)[Tool][Attr].startswith('='):\r
-                        Value = self._BuildOptionWithToolDef(RetVal)[Tool][Attr][1:]\r
+                        Value = self._BuildOptionWithToolDef(RetVal)[Tool][Attr][1:].strip()\r
                     else:\r
-                        if Attr != 'PATH':\r
+                        # Do not append PATH or GUID\r
+                        if Attr != 'PATH' and Attr != 'GUID':\r
                             Value += " " + self._BuildOptionWithToolDef(RetVal)[Tool][Attr]\r
                         else:\r
                             Value = self._BuildOptionWithToolDef(RetVal)[Tool][Attr]\r
-                            Def = '_'.join([self.BuildTarget, self.ToolChain, self.Arch, Tool, Attr])\r
-                            self.Workspace.ToolDef.ToolsDefTxtDictionary[Def] = Value\r
                 if Attr == "PATH":\r
                     # Don't put MAKE definition in the file\r
                     if Tool != "MAKE":\r
index c31fc24870d56b495240f2daca7b9b87ad32291f..25f9d54874d38bf5b222d7f133beed027d471c18 100644 (file)
@@ -32,6 +32,7 @@ from Common.LongFilePathSupport import OpenLongFilePath as open
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.GlobalData as GlobalData\r
 from Common.BuildToolError import *\r
+from AutoGen.AutoGen import CalculatePriorityValue\r
 \r
 ## Global variables\r
 #\r
@@ -850,6 +851,10 @@ class GenFdsGlobalVariable:
 #  @param  NameGuid         The Guid name\r
 #\r
 def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):\r
+    if GenFdsGlobalVariable.GuidToolDefinition:\r
+        if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:\r
+            return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]\r
+\r
     ToolDefObj = ToolDefDict((os.path.join(os.getenv("WORKSPACE"), "Conf")))\r
     ToolDef = ToolDefObj.ToolDef\r
     ToolDb = ToolDef.ToolsDefTxtDatabase\r
@@ -864,86 +869,159 @@ def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):
             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 = ToolDef.ToolsDefTxtDictionary\r
     ToolPathTmp = None\r
     ToolOption = None\r
-    ToolPathKey = None\r
-    ToolOptionKey = None\r
-    KeyList = None\r
-    for tool_def in ToolDefinition.items():\r
-        KeyList = tool_def[0].split('_')\r
-        if len(KeyList) < 5:\r
-            continue\r
-        if KeyList[4] != DataType.TAB_GUID:\r
-            continue\r
-        if NameGuid.lower() != tool_def[1].lower():\r
-            continue\r
-        Key = KeyList[0] + \\r
-                '_' + \\r
-                KeyList[1] + \\r
-                '_' + \\r
-                KeyList[2]\r
+    for Arch in CurrentArchList:\r
+        MatchItem = None\r
+        MatchPathItem = None\r
+        MatchOptionsItem = None\r
         for KeyString in KeyStringList:\r
             KeyStringBuildTarget, KeyStringToolChain, KeyStringArch = KeyString.split('_')\r
-            if KeyList[0] == DataType.TAB_STAR:\r
-                KeyList[0] = KeyStringBuildTarget\r
-            if KeyList[1] == DataType.TAB_STAR:\r
-                KeyList[1] = KeyStringToolChain\r
-            if KeyList[2] == DataType.TAB_STAR:\r
-                KeyList[2] = KeyStringArch\r
-            if KeyList[0] == KeyStringBuildTarget and KeyList[1] == KeyStringToolChain and KeyList[2] == KeyStringArch:\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
+            if KeyStringArch != Arch:\r
+                continue\r
+            for Item in ToolDef.ToolsDefTxtDictionary:\r
+                if len(Item.split('_')) < 5:\r
+                    continue\r
+                ItemTarget, ItemToolChain, ItemArch, ItemTool, ItemAttr = Item.split('_')\r
+                if ItemTarget == DataType.TAB_STAR:\r
+                    ItemTarget = KeyStringBuildTarget\r
+                if ItemToolChain == DataType.TAB_STAR:\r
+                    ItemToolChain = KeyStringToolChain\r
+                if ItemArch == DataType.TAB_STAR:\r
+                    ItemArch = KeyStringArch\r
+                if ItemTarget != KeyStringBuildTarget:\r
+                    continue\r
+                if ItemToolChain != KeyStringToolChain:\r
+                    continue\r
+                if ItemArch != KeyStringArch:\r
+                    continue\r
+                if ItemAttr != DataType.TAB_GUID:\r
+                    # Not GUID attribute\r
+                    continue\r
+                if ToolDef.ToolsDefTxtDictionary[Item].lower() != NameGuid.lower():\r
+                    # No GUID value match\r
+                    continue\r
+                if MatchItem:\r
+                    if MatchItem.split('_')[3] == ItemTool:\r
+                        # Tool name is the same\r
+                        continue\r
+                    if CalculatePriorityValue(MatchItem) > CalculatePriorityValue(Item):\r
+                        # Current MatchItem is higher priority than new match item\r
+                        continue\r
+                MatchItem = Item\r
+            if not MatchItem:\r
+                continue\r
+            ToolName = MatchItem.split('_')[3]\r
+            for Item in ToolDef.ToolsDefTxtDictionary:\r
+                if len(Item.split('_')) < 5:\r
+                    continue\r
+                ItemTarget, ItemToolChain, ItemArch, ItemTool, ItemAttr = Item.split('_')\r
+                if ItemTarget == DataType.TAB_STAR:\r
+                    ItemTarget = KeyStringBuildTarget\r
+                if ItemToolChain == DataType.TAB_STAR:\r
+                    ItemToolChain = KeyStringToolChain\r
+                if ItemArch == DataType.TAB_STAR:\r
+                    ItemArch = KeyStringArch\r
+                if ItemTarget != KeyStringBuildTarget:\r
+                    continue\r
+                if ItemToolChain != KeyStringToolChain:\r
+                    continue\r
+                if ItemArch != KeyStringArch:\r
+                    continue\r
+                if ItemTool != ToolName:\r
+                    continue\r
+                if ItemAttr == 'PATH':\r
+                    if MatchPathItem:\r
+                        if CalculatePriorityValue(MatchPathItem) <= CalculatePriorityValue(Item):\r
+                            MatchPathItem = Item\r
+                    else:\r
+                        MatchPathItem = Item\r
+                if ItemAttr == 'FLAGS':\r
+                    if MatchOptionsItem:\r
+                        if CalculatePriorityValue(MatchOptionsItem) <= CalculatePriorityValue(Item):\r
+                            MatchOptionsItem = Item\r
+                    else:\r
+                        MatchOptionsItem = Item\r
+        if MatchPathItem:\r
+            ToolPathTmp = ToolDef.ToolsDefTxtDictionary[MatchPathItem]\r
+        if MatchOptionsItem:\r
+            ToolOption = ToolDef.ToolsDefTxtDictionary[MatchOptionsItem]\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] == DataType.TAB_STAR:\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
+        MatchItem = None\r
+        MatchPathItem = None\r
+        MatchOptionsItem = None\r
+        for KeyString in KeyStringList:\r
+            KeyStringBuildTarget, KeyStringToolChain, KeyStringArch = KeyString.split('_')\r
+            if KeyStringArch != Arch:\r
+                continue\r
+            Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, KeyStringBuildTarget, KeyStringToolChain]\r
+            for Item in Platform.BuildOptions:\r
+                if len(Item[1].split('_')) < 5:\r
+                    continue\r
+                ItemTarget, ItemToolChain, ItemArch, ItemTool, ItemAttr = Item[1].split('_')\r
+                if ItemTarget == DataType.TAB_STAR:\r
+                    ItemTarget = KeyStringBuildTarget\r
+                if ItemToolChain == DataType.TAB_STAR:\r
+                    ItemToolChain = KeyStringToolChain\r
+                if ItemArch == DataType.TAB_STAR:\r
+                    ItemArch = KeyStringArch\r
+                if ItemTarget != KeyStringBuildTarget:\r
+                    continue\r
+                if ItemToolChain != KeyStringToolChain:\r
+                    continue\r
+                if ItemArch != KeyStringArch:\r
+                    continue\r
+                if ItemAttr != DataType.TAB_GUID:\r
+                    # Not GUID attribute match\r
+                    continue\r
+                if Platform.BuildOptions[Item].lower() != NameGuid.lower():\r
+                    # No GUID value match\r
+                    continue\r
+                if MatchItem:\r
+                    if MatchItem[1].split('_')[3] == ItemTool:\r
+                        # Tool name is the same\r
+                        continue\r
+                    if CalculatePriorityValue(MatchItem[1]) > CalculatePriorityValue(Item[1]):\r
+                        # Current MatchItem is higher priority than new match item\r
+                        continue\r
+                MatchItem = Item\r
+            if not MatchItem:\r
+                continue\r
+            ToolName = MatchItem[1].split('_')[3]\r
+            for Item in Platform.BuildOptions:\r
+                if len(Item[1].split('_')) < 5:\r
+                    continue\r
+                ItemTarget, ItemToolChain, ItemArch, ItemTool, ItemAttr = Item[1].split('_')\r
+                if ItemTarget == DataType.TAB_STAR:\r
+                    ItemTarget = KeyStringBuildTarget\r
+                if ItemToolChain == DataType.TAB_STAR:\r
+                    ItemToolChain = KeyStringToolChain\r
+                if ItemArch == DataType.TAB_STAR:\r
+                    ItemArch = KeyStringArch\r
+                if ItemTarget != KeyStringBuildTarget:\r
+                    continue\r
+                if ItemToolChain != KeyStringToolChain:\r
+                    continue\r
+                if ItemArch != KeyStringArch:\r
+                    continue\r
+                if ItemTool != ToolName:\r
+                    continue\r
+                if ItemAttr == 'PATH':\r
+                    if MatchPathItem:\r
+                        if CalculatePriorityValue(MatchPathItem[1]) <= CalculatePriorityValue(Item[1]):\r
+                            MatchPathItem = Item\r
+                    else:\r
+                        MatchPathItem = Item\r
+                if ItemAttr == 'FLAGS':\r
+                    if MatchOptionsItem:\r
+                        if CalculatePriorityValue(MatchOptionsItem[1]) <= CalculatePriorityValue(Item[1]):\r
+                            MatchOptionsItem = Item\r
+                    else:\r
+                        MatchOptionsItem = Item\r
+    if MatchPathItem:\r
+        ToolPathTmp = Platform.BuildOptions[MatchPathItem]\r
+    if MatchOptionsItem:\r
+        ToolOption = Platform.BuildOptions[MatchOptionsItem]\r
     GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)\r
     return ToolPathTmp, ToolOption\r
index e5693c0d27a2010ef5a20803386cbce48934f55a..037493f0b02a78da6f4b1303d866838db1e59988 100755 (executable)
@@ -62,6 +62,7 @@ from AutoGen.ModuleAutoGenHelper import WorkSpaceInfo, PlatformInfo
 from GenFds.FdfParser import FdfParser\r
 from AutoGen.IncludesAutoGen import IncludesAutoGen\r
 from GenFds.GenFds import resetFdsGlobalVariable\r
+from AutoGen.AutoGen import CalculatePriorityValue\r
 \r
 ## standard targets of build command\r
 gSupportedTarget = ['all', 'genc', 'genmake', 'modules', 'libraries', 'fds', 'clean', 'cleanall', 'cleanlib', 'run']\r
@@ -2425,27 +2426,42 @@ class Build():
                 FvDir = Wa.FvDir\r
                 if not os.path.exists(FvDir):\r
                     continue\r
-\r
                 for Arch in self.ArchList:\r
-                    # Look through the tool definitions for GUIDed tools\r
+                    guidList = []\r
+                    tooldefguidList = []\r
                     guidAttribs = []\r
-                    for (attrib, value) in self.ToolDef.ToolsDefTxtDictionary.items():\r
-                        GuidBuildTarget, GuidToolChain, GuidArch, GuidTool, GuidAttr = attrib.split('_')\r
-                        if GuidAttr.upper() == 'GUID':\r
-                            if GuidBuildTarget == TAB_STAR:\r
-                                GuidBuildTarget = BuildTarget\r
-                            if GuidToolChain == TAB_STAR:\r
-                                GuidToolChain = ToolChain\r
-                            if GuidArch == TAB_STAR:\r
-                                GuidArch = Arch\r
-                            if GuidBuildTarget == BuildTarget and GuidToolChain == ToolChain and GuidArch == Arch:\r
-                                path = '_'.join(attrib.split('_')[:-1]) + '_PATH'\r
-                                if path in self.ToolDef.ToolsDefTxtDictionary:\r
-                                    path = self.ToolDef.ToolsDefTxtDictionary[path]\r
-                                    path = self.GetRealPathOfTool(path)\r
-                                    guidAttribs.append((value.lower(), GuidTool, path))\r
+                    for Platform in Wa.AutoGenObjectList:\r
+                        if Platform.BuildTarget != BuildTarget:\r
+                            continue\r
+                        if Platform.ToolChain != ToolChain:\r
+                            continue\r
+                        if Platform.Arch != Arch:\r
+                            continue\r
+                        if hasattr (Platform, 'BuildOption'):\r
+                            for Tool in Platform.BuildOption:\r
+                                if 'GUID' in Platform.BuildOption[Tool]:\r
+                                    if 'PATH' in Platform.BuildOption[Tool]:\r
+                                        value = Platform.BuildOption[Tool]['GUID']\r
+                                        if value in guidList:\r
+                                            EdkLogger.error("build", FORMAT_INVALID, "Duplicate GUID value %s used with Tool %s in DSC [BuildOptions]." % (value, Tool))\r
+                                        path = Platform.BuildOption[Tool]['PATH']\r
+                                        guidList.append(value)\r
+                                        guidAttribs.append((value, Tool, path))\r
+                        for Tool in Platform.ToolDefinition:\r
+                            if 'GUID' in Platform.ToolDefinition[Tool]:\r
+                                if 'PATH' in Platform.ToolDefinition[Tool]:\r
+                                    value = Platform.ToolDefinition[Tool]['GUID']\r
+                                    if value in tooldefguidList:\r
+                                        EdkLogger.error("build", FORMAT_INVALID, "Duplicate GUID value %s used with Tool %s in tools_def.txt." % (value, Tool))\r
+                                    tooldefguidList.append(value)\r
+                                    if value in guidList:\r
+                                        # Already added by platform\r
+                                        continue\r
+                                    path = Platform.ToolDefinition[Tool]['PATH']\r
+                                    guidList.append(value)\r
+                                    guidAttribs.append((value, Tool, path))\r
                     # Sort by GuidTool name\r
-                    sorted (guidAttribs, key=lambda x: x[1])\r
+                    guidAttribs = sorted (guidAttribs, key=lambda x: x[1])\r
                     # Write out GuidedSecTools.txt\r
                     toolsFile = os.path.join(FvDir, 'GuidedSectionTools.txt')\r
                     toolsFile = open(toolsFile, 'wt')\r