mirror of https://github.com/acidanthera/audk.git
BaseTools: Move FindExtendTool to GenFdsGlobalVariable.py
Importing "FindExtendTool" from GenFds.GenFds could create the following circular imports: * GenFds.FdfParser => GenFds.Capsule => GenFds.GenFds => GenFds.FdfParser * GenFds.FdfParser => GenFds.Fd => GenFds.Fv => GenFds.AprioriSection => GenFds.FfsFileStatement => GenFds.GuidSection => GenFds.GenFds => GenFds.FdfParser This commit moves "FindExtendTool" to GenFdsGlobalVariable.py to break the circles. Besides, FindExtendTool is tweaked slightly with the following changes: ToolDefClassObject.ToolDefDict => ToolDefDict TAB_GUID => DataType.TAB_GUID TAB_TOD_DEFINES_TARGET => DataType.TAB_TOD_DEFINES_TARGET TAB_TOD_DEFINES_TOOL_CHAIN_TAG => DataType.TAB_TOD_DEFINES_TOOL_CHAIN_TAG TAB_TOD_DEFINES_TARGET_ARCH => DataType.TAB_TOD_DEFINES_TARGET_ARCH Contributed-under: TianoCore Contribution Agreement 1.1 Cc: Yonghong Zhu <yonghong.zhu@intel.com> Cc: Liming Gao <liming.gao@intel.com> Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
parent
8f3f5794b4
commit
89a69d4b64
|
@ -17,6 +17,7 @@
|
||||||
#
|
#
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
from .GenFdsGlobalVariable import GenFdsGlobalVariable
|
from .GenFdsGlobalVariable import GenFdsGlobalVariable
|
||||||
|
from .GenFdsGlobalVariable import FindExtendTool
|
||||||
from CommonDataClass.FdfClass import CapsuleClassObject
|
from CommonDataClass.FdfClass import CapsuleClassObject
|
||||||
import Common.LongFilePathOs as os
|
import Common.LongFilePathOs as os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
@ -65,7 +66,6 @@ class Capsule (CapsuleClassObject) :
|
||||||
# UINT32 CapsuleImageSize;
|
# UINT32 CapsuleImageSize;
|
||||||
# } EFI_CAPSULE_HEADER;
|
# } EFI_CAPSULE_HEADER;
|
||||||
#
|
#
|
||||||
from .GenFds import FindExtendTool
|
|
||||||
Header = BytesIO()
|
Header = BytesIO()
|
||||||
#
|
#
|
||||||
# Use FMP capsule GUID: 6DCBD5ED-E82D-4C44-BDA1-7194199AD92A
|
# Use FMP capsule GUID: 6DCBD5ED-E82D-4C44-BDA1-7194199AD92A
|
||||||
|
|
|
@ -368,98 +368,6 @@ def SingleCheckCallback(option, opt_str, value, parser):
|
||||||
else:
|
else:
|
||||||
parser.error("Option %s only allows one instance in command line!" % option)
|
parser.error("Option %s only allows one instance in command line!" % option)
|
||||||
|
|
||||||
## FindExtendTool()
|
|
||||||
#
|
|
||||||
# Find location of tools to process data
|
|
||||||
#
|
|
||||||
# @param KeyStringList Filter for inputs of section generation
|
|
||||||
# @param CurrentArchList Arch list
|
|
||||||
# @param NameGuid The Guid name
|
|
||||||
#
|
|
||||||
def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):
|
|
||||||
ToolDb = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDatabase
|
|
||||||
# if user not specify filter, try to deduce it from global data.
|
|
||||||
if KeyStringList is None or KeyStringList == []:
|
|
||||||
Target = GenFdsGlobalVariable.TargetName
|
|
||||||
ToolChain = GenFdsGlobalVariable.ToolChainTag
|
|
||||||
if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:
|
|
||||||
EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)
|
|
||||||
KeyStringList = [Target + '_' + ToolChain + '_' + CurrentArchList[0]]
|
|
||||||
for Arch in CurrentArchList:
|
|
||||||
if Target + '_' + ToolChain + '_' + Arch not in KeyStringList:
|
|
||||||
KeyStringList.append(Target + '_' + ToolChain + '_' + Arch)
|
|
||||||
|
|
||||||
if GenFdsGlobalVariable.GuidToolDefinition:
|
|
||||||
if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:
|
|
||||||
return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]
|
|
||||||
|
|
||||||
ToolDefinition = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDictionary
|
|
||||||
ToolPathTmp = None
|
|
||||||
ToolOption = None
|
|
||||||
ToolPathKey = None
|
|
||||||
ToolOptionKey = None
|
|
||||||
KeyList = None
|
|
||||||
for ToolDef in ToolDefinition.items():
|
|
||||||
if NameGuid.lower() == ToolDef[1].lower() :
|
|
||||||
KeyList = ToolDef[0].split('_')
|
|
||||||
Key = KeyList[0] + \
|
|
||||||
'_' + \
|
|
||||||
KeyList[1] + \
|
|
||||||
'_' + \
|
|
||||||
KeyList[2]
|
|
||||||
if Key in KeyStringList and KeyList[4] == TAB_GUID:
|
|
||||||
ToolPathKey = Key + '_' + KeyList[3] + '_PATH'
|
|
||||||
ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'
|
|
||||||
ToolPath = ToolDefinition.get(ToolPathKey)
|
|
||||||
ToolOption = ToolDefinition.get(ToolOptionKey)
|
|
||||||
if ToolPathTmp is None:
|
|
||||||
ToolPathTmp = ToolPath
|
|
||||||
else:
|
|
||||||
if ToolPathTmp != ToolPath:
|
|
||||||
EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))
|
|
||||||
|
|
||||||
BuildOption = {}
|
|
||||||
for Arch in CurrentArchList:
|
|
||||||
Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
|
|
||||||
# key is (ToolChainFamily, ToolChain, CodeBase)
|
|
||||||
for item in Platform.BuildOptions:
|
|
||||||
if '_PATH' in item[1] or '_FLAGS' in item[1] or '_GUID' in item[1]:
|
|
||||||
if not item[0] or (item[0] and GenFdsGlobalVariable.ToolChainFamily== item[0]):
|
|
||||||
if item[1] not in BuildOption:
|
|
||||||
BuildOption[item[1]] = Platform.BuildOptions[item]
|
|
||||||
if BuildOption:
|
|
||||||
ToolList = [TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG, TAB_TOD_DEFINES_TARGET_ARCH]
|
|
||||||
for Index in range(2, -1, -1):
|
|
||||||
for Key in list(BuildOption.keys()):
|
|
||||||
List = Key.split('_')
|
|
||||||
if List[Index] == '*':
|
|
||||||
for String in ToolDb[ToolList[Index]]:
|
|
||||||
if String in [Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]:
|
|
||||||
List[Index] = String
|
|
||||||
NewKey = '%s_%s_%s_%s_%s' % tuple(List)
|
|
||||||
if NewKey not in BuildOption:
|
|
||||||
BuildOption[NewKey] = BuildOption[Key]
|
|
||||||
continue
|
|
||||||
del BuildOption[Key]
|
|
||||||
elif List[Index] not in ToolDb[ToolList[Index]]:
|
|
||||||
del BuildOption[Key]
|
|
||||||
if BuildOption:
|
|
||||||
if not KeyList:
|
|
||||||
for Op in BuildOption:
|
|
||||||
if NameGuid == BuildOption[Op]:
|
|
||||||
KeyList = Op.split('_')
|
|
||||||
Key = KeyList[0] + '_' + KeyList[1] +'_' + KeyList[2]
|
|
||||||
if Key in KeyStringList and KeyList[4] == TAB_GUID:
|
|
||||||
ToolPathKey = Key + '_' + KeyList[3] + '_PATH'
|
|
||||||
ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'
|
|
||||||
if ToolPathKey in BuildOption:
|
|
||||||
ToolPathTmp = BuildOption[ToolPathKey]
|
|
||||||
if ToolOptionKey in BuildOption:
|
|
||||||
ToolOption = BuildOption[ToolOptionKey]
|
|
||||||
|
|
||||||
GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)
|
|
||||||
return ToolPathTmp, ToolOption
|
|
||||||
|
|
||||||
## Parse command line options
|
## Parse command line options
|
||||||
#
|
#
|
||||||
# Using standard Python module optparse to parse command line option of this tool.
|
# Using standard Python module optparse to parse command line option of this tool.
|
||||||
|
|
|
@ -27,7 +27,7 @@ from Common import EdkLogger
|
||||||
from Common.Misc import SaveFileOnChange
|
from Common.Misc import SaveFileOnChange
|
||||||
|
|
||||||
from Common.TargetTxtClassObject import TargetTxtClassObject
|
from Common.TargetTxtClassObject import TargetTxtClassObject
|
||||||
from Common.ToolDefClassObject import ToolDefClassObject
|
from Common.ToolDefClassObject import ToolDefClassObject, ToolDefDict
|
||||||
from AutoGen.BuildEngine import BuildRule
|
from AutoGen.BuildEngine import BuildRule
|
||||||
import Common.DataType as DataType
|
import Common.DataType as DataType
|
||||||
from Common.Misc import PathClass
|
from Common.Misc import PathClass
|
||||||
|
@ -843,3 +843,95 @@ class GenFdsGlobalVariable:
|
||||||
DebugLogger = staticmethod(DebugLogger)
|
DebugLogger = staticmethod(DebugLogger)
|
||||||
MacroExtend = staticmethod (MacroExtend)
|
MacroExtend = staticmethod (MacroExtend)
|
||||||
GetPcdValue = staticmethod(GetPcdValue)
|
GetPcdValue = staticmethod(GetPcdValue)
|
||||||
|
|
||||||
|
## FindExtendTool()
|
||||||
|
#
|
||||||
|
# Find location of tools to process data
|
||||||
|
#
|
||||||
|
# @param KeyStringList Filter for inputs of section generation
|
||||||
|
# @param CurrentArchList Arch list
|
||||||
|
# @param NameGuid The Guid name
|
||||||
|
#
|
||||||
|
def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):
|
||||||
|
ToolDb = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDatabase
|
||||||
|
# if user not specify filter, try to deduce it from global data.
|
||||||
|
if KeyStringList is None or KeyStringList == []:
|
||||||
|
Target = GenFdsGlobalVariable.TargetName
|
||||||
|
ToolChain = GenFdsGlobalVariable.ToolChainTag
|
||||||
|
if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:
|
||||||
|
EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)
|
||||||
|
KeyStringList = [Target + '_' + ToolChain + '_' + CurrentArchList[0]]
|
||||||
|
for Arch in CurrentArchList:
|
||||||
|
if Target + '_' + ToolChain + '_' + Arch not in KeyStringList:
|
||||||
|
KeyStringList.append(Target + '_' + ToolChain + '_' + Arch)
|
||||||
|
|
||||||
|
if GenFdsGlobalVariable.GuidToolDefinition:
|
||||||
|
if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:
|
||||||
|
return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]
|
||||||
|
|
||||||
|
ToolDefinition = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDictionary
|
||||||
|
ToolPathTmp = None
|
||||||
|
ToolOption = None
|
||||||
|
ToolPathKey = None
|
||||||
|
ToolOptionKey = None
|
||||||
|
KeyList = None
|
||||||
|
for ToolDef in ToolDefinition.items():
|
||||||
|
if NameGuid.lower() == ToolDef[1].lower() :
|
||||||
|
KeyList = ToolDef[0].split('_')
|
||||||
|
Key = KeyList[0] + \
|
||||||
|
'_' + \
|
||||||
|
KeyList[1] + \
|
||||||
|
'_' + \
|
||||||
|
KeyList[2]
|
||||||
|
if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:
|
||||||
|
ToolPathKey = Key + '_' + KeyList[3] + '_PATH'
|
||||||
|
ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'
|
||||||
|
ToolPath = ToolDefinition.get(ToolPathKey)
|
||||||
|
ToolOption = ToolDefinition.get(ToolOptionKey)
|
||||||
|
if ToolPathTmp is None:
|
||||||
|
ToolPathTmp = ToolPath
|
||||||
|
else:
|
||||||
|
if ToolPathTmp != ToolPath:
|
||||||
|
EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))
|
||||||
|
|
||||||
|
BuildOption = {}
|
||||||
|
for Arch in CurrentArchList:
|
||||||
|
Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
|
||||||
|
# key is (ToolChainFamily, ToolChain, CodeBase)
|
||||||
|
for item in Platform.BuildOptions:
|
||||||
|
if '_PATH' in item[1] or '_FLAGS' in item[1] or '_GUID' in item[1]:
|
||||||
|
if not item[0] or (item[0] and GenFdsGlobalVariable.ToolChainFamily== item[0]):
|
||||||
|
if item[1] not in BuildOption:
|
||||||
|
BuildOption[item[1]] = Platform.BuildOptions[item]
|
||||||
|
if BuildOption:
|
||||||
|
ToolList = [DataType.TAB_TOD_DEFINES_TARGET, DataType.TAB_TOD_DEFINES_TOOL_CHAIN_TAG, DataType.TAB_TOD_DEFINES_TARGET_ARCH]
|
||||||
|
for Index in range(2, -1, -1):
|
||||||
|
for Key in list(BuildOption.keys()):
|
||||||
|
List = Key.split('_')
|
||||||
|
if List[Index] == '*':
|
||||||
|
for String in ToolDb[ToolList[Index]]:
|
||||||
|
if String in [Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]:
|
||||||
|
List[Index] = String
|
||||||
|
NewKey = '%s_%s_%s_%s_%s' % tuple(List)
|
||||||
|
if NewKey not in BuildOption:
|
||||||
|
BuildOption[NewKey] = BuildOption[Key]
|
||||||
|
continue
|
||||||
|
del BuildOption[Key]
|
||||||
|
elif List[Index] not in ToolDb[ToolList[Index]]:
|
||||||
|
del BuildOption[Key]
|
||||||
|
if BuildOption:
|
||||||
|
if not KeyList:
|
||||||
|
for Op in BuildOption:
|
||||||
|
if NameGuid == BuildOption[Op]:
|
||||||
|
KeyList = Op.split('_')
|
||||||
|
Key = KeyList[0] + '_' + KeyList[1] +'_' + KeyList[2]
|
||||||
|
if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:
|
||||||
|
ToolPathKey = Key + '_' + KeyList[3] + '_PATH'
|
||||||
|
ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'
|
||||||
|
if ToolPathKey in BuildOption:
|
||||||
|
ToolPathTmp = BuildOption[ToolPathKey]
|
||||||
|
if ToolOptionKey in BuildOption:
|
||||||
|
ToolOption = BuildOption[ToolOptionKey]
|
||||||
|
|
||||||
|
GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)
|
||||||
|
return ToolPathTmp, ToolOption
|
||||||
|
|
|
@ -22,6 +22,7 @@ import subprocess
|
||||||
from .Ffs import Ffs
|
from .Ffs import Ffs
|
||||||
import Common.LongFilePathOs as os
|
import Common.LongFilePathOs as os
|
||||||
from .GenFdsGlobalVariable import GenFdsGlobalVariable
|
from .GenFdsGlobalVariable import GenFdsGlobalVariable
|
||||||
|
from .GenFdsGlobalVariable import FindExtendTool
|
||||||
from CommonDataClass.FdfClass import GuidSectionClassObject
|
from CommonDataClass.FdfClass import GuidSectionClassObject
|
||||||
from Common import ToolDefClassObject
|
from Common import ToolDefClassObject
|
||||||
import sys
|
import sys
|
||||||
|
@ -131,7 +132,6 @@ class GuidSection(GuidSectionClassObject) :
|
||||||
ExternalTool = None
|
ExternalTool = None
|
||||||
ExternalOption = None
|
ExternalOption = None
|
||||||
if self.NameGuid is not None:
|
if self.NameGuid is not None:
|
||||||
from .GenFds import FindExtendTool
|
|
||||||
ExternalTool, ExternalOption = FindExtendTool(self.KeyStringList, self.CurrentArchList, self.NameGuid)
|
ExternalTool, ExternalOption = FindExtendTool(self.KeyStringList, self.CurrentArchList, self.NameGuid)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue