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
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
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
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
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
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
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