]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
BaseTools/Source/Python: New Target/ToolChain/Arch in DSC [BuildOptions]
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / PlatformAutoGen.py
index c16f2e4cd8b7e9a98cf6a52a42e84e827bbec596..21e72438e59e83b430f25b81007fa1d21673a671 100644 (file)
@@ -827,6 +827,33 @@ class PlatformAutoGen(AutoGen):
                 RetVal = RetVal + _SplitOption(Flags.strip())\r
         return RetVal\r
 \r
+    ## Compute a tool defintion key priority value in range 0..15\r
+    #\r
+    #  TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE  15\r
+    #  ******_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE  14\r
+    #  TARGET_*********_ARCH_COMMANDTYPE_ATTRIBUTE  13\r
+    #  ******_*********_ARCH_COMMANDTYPE_ATTRIBUTE  12\r
+    #  TARGET_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE  11\r
+    #  ******_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE  10\r
+    #  TARGET_*********_****_COMMANDTYPE_ATTRIBUTE   9\r
+    #  ******_*********_****_COMMANDTYPE_ATTRIBUTE   8\r
+    #  TARGET_TOOLCHAIN_ARCH_***********_ATTRIBUTE   7\r
+    #  ******_TOOLCHAIN_ARCH_***********_ATTRIBUTE   6\r
+    #  TARGET_*********_ARCH_***********_ATTRIBUTE   5\r
+    #  ******_*********_ARCH_***********_ATTRIBUTE   4\r
+    #  TARGET_TOOLCHAIN_****_***********_ATTRIBUTE   3\r
+    #  ******_TOOLCHAIN_****_***********_ATTRIBUTE   2\r
+    #  TARGET_*********_****_***********_ATTRIBUTE   1\r
+    #  ******_*********_****_***********_ATTRIBUTE   0\r
+    #\r
+    def ToolDefinitionPriority (self,Key):\r
+        KeyList = Key.split('_')\r
+        Priority = 0\r
+        for Index in range (0, min(4, len(KeyList))):\r
+            if KeyList[Index] != '*':\r
+                Priority += (1 << Index)\r
+        return Priority\r
+\r
     ## Get tool chain definition\r
     #\r
     #  Get each tool definition for given tool chain from tools_def.txt and platform\r
@@ -839,8 +866,16 @@ class PlatformAutoGen(AutoGen):
                             ExtraData="[%s]" % self.MetaFile)\r
         RetVal = OrderedDict()\r
         DllPathList = set()\r
-        for Def in ToolDefinition:\r
+\r
+        PrioritizedDefList = sorted(ToolDefinition.keys(), key=self.ToolDefinitionPriority, reverse=True)\r
+        for Def in PrioritizedDefList:\r
             Target, Tag, Arch, Tool, Attr = Def.split("_")\r
+            if Target == TAB_STAR:\r
+                Target = self.BuildTarget\r
+            if Tag == TAB_STAR:\r
+                Tag = self.ToolChain\r
+            if Arch == TAB_STAR:\r
+                Arch = self.Arch\r
             if Target != self.BuildTarget or Tag != self.ToolChain or Arch != self.Arch:\r
                 continue\r
 \r
@@ -850,9 +885,14 @@ class PlatformAutoGen(AutoGen):
                 DllPathList.add(Value)\r
                 continue\r
 \r
+            #\r
+            # ToolDefinition is sorted from highest priority to lowest priority.\r
+            # Only add the first(highest priority) match to RetVal\r
+            #\r
             if Tool not in RetVal:\r
                 RetVal[Tool] = OrderedDict()\r
-            RetVal[Tool][Attr] = Value\r
+            if Attr not in RetVal[Tool]:\r
+                RetVal[Tool][Attr] = Value\r
 \r
         ToolsDef = ''\r
         if GlobalData.gOptions.SilentMode and "MAKE" in RetVal:\r
@@ -860,9 +900,21 @@ class PlatformAutoGen(AutoGen):
                 RetVal["MAKE"]["FLAGS"] = ""\r
             RetVal["MAKE"]["FLAGS"] += " -s"\r
         MakeFlags = ''\r
-        for Tool in RetVal:\r
-            for Attr in RetVal[Tool]:\r
-                Value = RetVal[Tool][Attr]\r
+\r
+        ToolList = list(RetVal.keys())\r
+        ToolList.sort()\r
+        for Tool in ToolList:\r
+            if Tool == TAB_STAR:\r
+                continue\r
+            AttrList = list(RetVal[Tool].keys())\r
+            if TAB_STAR in ToolList:\r
+                AttrList += list(RetVal[TAB_STAR])\r
+            AttrList.sort()\r
+            for Attr in AttrList:\r
+                if Attr in RetVal[Tool]:\r
+                    Value = RetVal[Tool][Attr]\r
+                else:\r
+                    Value = RetVal[TAB_STAR][Attr]\r
                 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
@@ -877,7 +929,7 @@ class PlatformAutoGen(AutoGen):
                 if Attr == "PATH":\r
                     # Don't put MAKE definition in the file\r
                     if Tool != "MAKE":\r
-                        ToolsDef += "%s = %s\n" % (Tool, Value)\r
+                        ToolsDef += "%s_%s = %s\n" % (Tool, Attr, Value)\r
                 elif Attr != "DLL":\r
                     # Don't put MAKE definition in the file\r
                     if Tool == "MAKE":\r
@@ -1469,14 +1521,31 @@ class PlatformAutoGen(AutoGen):
             Family = Key[0]\r
             Target, Tag, Arch, Tool, Attr = Key[1].split("_")\r
             # if tool chain family doesn't match, skip it\r
-            if Tool in ToolDef and Family != "":\r
-                FamilyIsNull = False\r
-                if ToolDef[Tool].get(TAB_TOD_DEFINES_BUILDRULEFAMILY, "") != "":\r
-                    if Family != ToolDef[Tool][TAB_TOD_DEFINES_BUILDRULEFAMILY]:\r
-                        continue\r
-                elif Family != ToolDef[Tool][TAB_TOD_DEFINES_FAMILY]:\r
+            if Family != "":\r
+                Found = False\r
+                if Tool in ToolDef:\r
+                    FamilyIsNull = False\r
+                    if TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDef[Tool]:\r
+                        if Family == ToolDef[Tool][TAB_TOD_DEFINES_BUILDRULEFAMILY]:\r
+                            FamilyMatch = True\r
+                            Found = True\r
+                    if TAB_TOD_DEFINES_FAMILY in ToolDef[Tool]:\r
+                        if Family == ToolDef[Tool][TAB_TOD_DEFINES_FAMILY]:\r
+                            FamilyMatch = True\r
+                            Found = True\r
+                if TAB_STAR in ToolDef:\r
+                    FamilyIsNull = False\r
+                    if TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDef[TAB_STAR]:\r
+                        if Family == ToolDef[TAB_STAR][TAB_TOD_DEFINES_BUILDRULEFAMILY]:\r
+                            FamilyMatch = True\r
+                            Found = True\r
+                    if TAB_TOD_DEFINES_FAMILY in ToolDef[TAB_STAR]:\r
+                        if Family == ToolDef[TAB_STAR][TAB_TOD_DEFINES_FAMILY]:\r
+                            FamilyMatch = True\r
+                            Found = True\r
+                if not Found:\r
                     continue\r
-                FamilyMatch = True\r
+\r
             # expand any wildcard\r
             if Target == TAB_STAR or Target == self.BuildTarget:\r
                 if Tag == TAB_STAR or Tag == self.ToolChain:\r
@@ -1506,10 +1575,19 @@ class PlatformAutoGen(AutoGen):
             Family = Key[0]\r
             Target, Tag, Arch, Tool, Attr = Key[1].split("_")\r
             # if tool chain family doesn't match, skip it\r
-            if Tool not in ToolDef or Family == "":\r
+            if Family == "":\r
                 continue\r
             # option has been added before\r
-            if Family != ToolDef[Tool][TAB_TOD_DEFINES_FAMILY]:\r
+            Found = False\r
+            if Tool in ToolDef:\r
+                if TAB_TOD_DEFINES_FAMILY in ToolDef[Tool]:\r
+                    if Family == ToolDef[Tool][TAB_TOD_DEFINES_FAMILY]:\r
+                        Found = True\r
+            if TAB_STAR in ToolDef:\r
+                if TAB_TOD_DEFINES_FAMILY in ToolDef[TAB_STAR]:\r
+                    if Family == ToolDef[TAB_STAR][TAB_TOD_DEFINES_FAMILY]:\r
+                        Found = True\r
+            if not Found:\r
                 continue\r
 \r
             # expand any wildcard\r