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