## @file\r
# Create makefile for MS nmake and GNU make\r
#\r
-# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>\r
# Copyright (c) 2020, ARM Limited. All rights reserved.<BR>\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
VariableInfo.SetVpdRegionMaxSize(VpdRegionSize)\r
VariableInfo.SetVpdRegionOffset(VpdRegionBase)\r
Index = 0\r
- for Pcd in DynamicPcdSet:\r
+ for Pcd in sorted(DynamicPcdSet):\r
pcdname = ".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
for SkuName in Pcd.SkuInfoList:\r
Sku = Pcd.SkuInfoList[SkuName]\r
#\r
@cached_property\r
def BuildCommand(self):\r
- RetVal = []\r
- if "MAKE" in self.ToolDefinition and "PATH" in self.ToolDefinition["MAKE"]:\r
- RetVal += _SplitOption(self.ToolDefinition["MAKE"]["PATH"])\r
- if "FLAGS" in self.ToolDefinition["MAKE"]:\r
- NewOption = self.ToolDefinition["MAKE"]["FLAGS"].strip()\r
- if NewOption != '':\r
- RetVal += _SplitOption(NewOption)\r
- if "MAKE" in self.EdkIIBuildOption:\r
- if "FLAGS" in self.EdkIIBuildOption["MAKE"]:\r
- Flags = self.EdkIIBuildOption["MAKE"]["FLAGS"]\r
- if Flags.startswith('='):\r
- RetVal = [RetVal[0]] + [Flags[1:]]\r
- else:\r
- RetVal.append(Flags)\r
+ if "MAKE" in self.EdkIIBuildOption and "PATH" in self.EdkIIBuildOption["MAKE"]:\r
+ # MAKE_PATH in DSC [BuildOptions] section is higher priority\r
+ Path = self.EdkIIBuildOption["MAKE"]["PATH"]\r
+ if Path.startswith('='):\r
+ Path = Path[1:].strip()\r
+ RetVal = _SplitOption(Path)\r
+ elif "MAKE" in self.ToolDefinition and "PATH" in self.ToolDefinition["MAKE"]:\r
+ RetVal = _SplitOption(self.ToolDefinition["MAKE"]["PATH"])\r
+ else:\r
+ return []\r
+ if "MAKE" in self.ToolDefinition and "FLAGS" in self.ToolDefinition["MAKE"]:\r
+ NewOption = self.ToolDefinition["MAKE"]["FLAGS"].strip()\r
+ if NewOption != '':\r
+ RetVal += _SplitOption(NewOption)\r
+ if "MAKE" in self.EdkIIBuildOption and "FLAGS" in self.EdkIIBuildOption["MAKE"]:\r
+ Flags = self.EdkIIBuildOption["MAKE"]["FLAGS"]\r
+ if Flags.startswith('='):\r
+ RetVal = [RetVal[0]] + _SplitOption(Flags[1:].strip())\r
+ else:\r
+ 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
- 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
-\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
TokenNumber += 1\r
\r
for Pcd in self.NonDynamicPcdList:\r
- RetVal[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
- TokenNumber += 1\r
+ RetVal[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = 0\r
return RetVal\r
\r
@cached_property\r
def _MbList(self):\r
- return [self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain] for m in self.Platform.Modules]\r
+ ModuleList = []\r
+ for m in self.Platform.Modules:\r
+ component = self.Platform.Modules[m]\r
+ module = self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain]\r
+ module.Guid = component.Guid\r
+ ModuleList.append(module)\r
+ return ModuleList\r
\r
@cached_property\r
def _MaList(self):\r
if Attr == TAB_TOD_DEFINES_BUILDRULEORDER:\r
continue\r
Value = Options[Tool][Attr]\r
- # check if override is indicated\r
- if Value.startswith('='):\r
- BuildOptions[Tool][Attr] = mws.handleWsMacro(Value[1:])\r
- else:\r
- if Attr != 'PATH':\r
- BuildOptions[Tool][Attr] += " " + mws.handleWsMacro(Value)\r
+ ToolList = [Tool]\r
+ if Tool == TAB_STAR:\r
+ ToolList = list(AllTools)\r
+ ToolList.remove(TAB_STAR)\r
+ for ExpandedTool in ToolList:\r
+ # check if override is indicated\r
+ if Value.startswith('='):\r
+ BuildOptions[ExpandedTool][Attr] = mws.handleWsMacro(Value[1:])\r
else:\r
- BuildOptions[Tool][Attr] = mws.handleWsMacro(Value)\r
+ if Attr != 'PATH':\r
+ BuildOptions[ExpandedTool][Attr] += " " + mws.handleWsMacro(Value)\r
+ else:\r
+ BuildOptions[ExpandedTool][Attr] = mws.handleWsMacro(Value)\r
\r
return BuildOptions, BuildRuleOrder\r
\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_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 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