BaseTools: Fixed Build Option override bugs.

if '==' is specified, it overrides all options that specified by '='; if no '==' is specified, all options that match current build criteria are combined.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yingke Liu <yingke.d.liu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17665 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Yingke Liu
2015-06-19 01:43:45 +00:00
committed by yingke
parent 27f1971727
commit 1ba5124ed0
2 changed files with 38 additions and 18 deletions

View File

@ -1963,7 +1963,8 @@ class PlatformAutoGen(AutoGen):
# Key[0] -- tool family # Key[0] -- tool family
# Key[1] -- TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE # Key[1] -- TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE
# #
if Key[0] == self.BuildRuleFamily : if (Key[0] == self.BuildRuleFamily and
(ModuleStyle == None or len(Key) < 3 or (len(Key) > 2 and Key[2] == ModuleStyle))):
Target, ToolChain, Arch, CommandType, Attr = Key[1].split('_') Target, ToolChain, Arch, CommandType, Attr = Key[1].split('_')
if Target == self.BuildTarget or Target == "*": if Target == self.BuildTarget or Target == "*":
if ToolChain == self.ToolChain or ToolChain == "*": if ToolChain == self.ToolChain or ToolChain == "*":
@ -1999,7 +2000,7 @@ class PlatformAutoGen(AutoGen):
if Options.get((self.BuildRuleFamily, NowKey)) != None: if Options.get((self.BuildRuleFamily, NowKey)) != None:
Options.pop((self.BuildRuleFamily, NowKey)) Options.pop((self.BuildRuleFamily, NowKey))
OverrideOpt = set()
for Key in Options: for Key in Options:
if ModuleStyle != None and len (Key) > 2: if ModuleStyle != None and len (Key) > 2:
# Check Module style is EDK or EDKII. # Check Module style is EDK or EDKII.
@ -2025,7 +2026,9 @@ class PlatformAutoGen(AutoGen):
if Arch == "*" or Arch == self.Arch: if Arch == "*" or Arch == self.Arch:
if Tool not in BuildOptions: if Tool not in BuildOptions:
BuildOptions[Tool] = {} BuildOptions[Tool] = {}
if Attr != "FLAGS" or Attr not in BuildOptions[Tool]: if Options[Key].startswith('='):
OverrideOpt.add((Tool, Attr))
if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or (Tool, Attr) in OverrideOpt:
BuildOptions[Tool][Attr] = Options[Key] BuildOptions[Tool][Attr] = Options[Key]
else: else:
# append options for the same tool # append options for the same tool
@ -2033,7 +2036,8 @@ class PlatformAutoGen(AutoGen):
# Build Option Family has been checked, which need't to be checked again for family. # Build Option Family has been checked, which need't to be checked again for family.
if FamilyMatch or FamilyIsNull: if FamilyMatch or FamilyIsNull:
return BuildOptions return BuildOptions
OverrideOpt = set()
for Key in Options: for Key in Options:
if ModuleStyle != None and len (Key) > 2: if ModuleStyle != None and len (Key) > 2:
# Check Module style is EDK or EDKII. # Check Module style is EDK or EDKII.
@ -2057,7 +2061,9 @@ class PlatformAutoGen(AutoGen):
if Arch == "*" or Arch == self.Arch: if Arch == "*" or Arch == self.Arch:
if Tool not in BuildOptions: if Tool not in BuildOptions:
BuildOptions[Tool] = {} BuildOptions[Tool] = {}
if Attr != "FLAGS" or Attr not in BuildOptions[Tool]: if Options[Key].startswith('='):
OverrideOpt.add((Tool, Attr))
if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or (Tool, Attr) in OverrideOpt:
BuildOptions[Tool][Attr] = Options[Key] BuildOptions[Tool][Attr] = Options[Key]
else: else:
# append options for the same tool # append options for the same tool
@ -2097,6 +2103,7 @@ class PlatformAutoGen(AutoGen):
PlatformModuleOptions.keys() + ModuleTypeOptions.keys() + PlatformModuleOptions.keys() + ModuleTypeOptions.keys() +
self.ToolDefinition.keys()) self.ToolDefinition.keys())
BuildOptions = {} BuildOptions = {}
OverrideTool = set()
for Tool in AllTools: for Tool in AllTools:
if Tool not in BuildOptions: if Tool not in BuildOptions:
BuildOptions[Tool] = {} BuildOptions[Tool] = {}
@ -2115,8 +2122,9 @@ class PlatformAutoGen(AutoGen):
BuildOptions[Tool][Attr] = "" BuildOptions[Tool][Attr] = ""
# check if override is indicated # check if override is indicated
if Value.startswith('='): if Value.startswith('='):
OverrideTool.add((Tool, Attr))
BuildOptions[Tool][Attr] = Value[1:] BuildOptions[Tool][Attr] = Value[1:]
else: elif (Tool, Attr) not in OverrideTool:
BuildOptions[Tool][Attr] += " " + Value BuildOptions[Tool][Attr] += " " + Value
if Module.AutoGenVersion < 0x00010005 and self.Workspace.UniFlag != None: if Module.AutoGenVersion < 0x00010005 and self.Workspace.UniFlag != None:
# #

View File

@ -753,19 +753,24 @@ class DscBuildData(PlatformBuildClassObject):
## Retrieve [BuildOptions] ## Retrieve [BuildOptions]
def _GetBuildOptions(self): def _GetBuildOptions(self):
if self._BuildOptions == None: if self._BuildOptions == None:
OverrideTool = set()
self._BuildOptions = sdict() self._BuildOptions = sdict()
# #
# Retrieve build option for EDKII style module # Retrieve build option for EDKII and EDK style module
# #
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, EDKII_NAME] for CodeBase in (EDKII_NAME, EDK_NAME):
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]
self._BuildOptions[ToolChainFamily, ToolChain, EDKII_NAME] = Option for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList:
# CurKey = (ToolChainFamily, ToolChain, CodeBase)
# Retrieve build option for EDK style module if Option.startswith('='):
# OverrideTool.add(CurKey)
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, EDK_NAME] #
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: # Only flags can be appended
self._BuildOptions[ToolChainFamily, ToolChain, EDK_NAME] = Option #
if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or CurKey in OverrideTool:
self._BuildOptions[CurKey] = Option
else:
self._BuildOptions[CurKey] += ' ' + Option
return self._BuildOptions return self._BuildOptions
def GetBuildOptionsByModuleType(self, Edk, ModuleType): def GetBuildOptionsByModuleType(self, Edk, ModuleType):
@ -773,12 +778,19 @@ class DscBuildData(PlatformBuildClassObject):
self._ModuleTypeOptions = sdict() self._ModuleTypeOptions = sdict()
if (Edk, ModuleType) not in self._ModuleTypeOptions: if (Edk, ModuleType) not in self._ModuleTypeOptions:
options = sdict() options = sdict()
OverrideTool = set()
self._ModuleTypeOptions[Edk, ModuleType] = options self._ModuleTypeOptions[Edk, ModuleType] = options
DriverType = '%s.%s' % (Edk, ModuleType) DriverType = '%s.%s' % (Edk, ModuleType)
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType] RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType]
for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList: for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList:
if Arch == self._Arch and Type == DriverType: if Arch == self._Arch and Type == DriverType:
options[ToolChainFamily, ToolChain, Edk] = Option Key = (ToolChainFamily, ToolChain, Edk)
if Option.startswith('='):
OverrideTool.add(Key)
if Key not in options or not ToolChain.endswith('_FLAGS') or Key in OverrideTool:
options[Key] = Option
else:
options[Key] += ' ' + Option
return self._ModuleTypeOptions[Edk, ModuleType] return self._ModuleTypeOptions[Edk, ModuleType]
## Retrieve non-dynamic PCD settings ## Retrieve non-dynamic PCD settings
@ -2007,7 +2019,7 @@ class InfBuildData(ModuleBuildClassObject):
if self._Header_ == None: if self._Header_ == None:
self._GetHeaderInfo() self._GetHeaderInfo()
if self._Guid == None: if self._Guid == None:
self._Guid = '00000000-0000-0000-000000000000' self._Guid = '00000000-0000-0000-0000-000000000000'
return self._Guid return self._Guid
## Retrieve module version ## Retrieve module version