From 1ba5124ed0ff033cf6c95f62c84987ee3e9d29f4 Mon Sep 17 00:00:00 2001 From: Yingke Liu Date: Fri, 19 Jun 2015 01:43:45 +0000 Subject: 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 Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17665 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/Python/AutoGen/AutoGen.py | 20 ++++++++---- .../Source/Python/Workspace/WorkspaceDatabase.py | 36 ++++++++++++++-------- 2 files changed, 38 insertions(+), 18 deletions(-) (limited to 'BaseTools') diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index 0e7482a87a..ca7d5abb62 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -1963,7 +1963,8 @@ class PlatformAutoGen(AutoGen): # Key[0] -- tool family # 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('_') if Target == self.BuildTarget or Target == "*": if ToolChain == self.ToolChain or ToolChain == "*": @@ -1999,7 +2000,7 @@ class PlatformAutoGen(AutoGen): if Options.get((self.BuildRuleFamily, NowKey)) != None: Options.pop((self.BuildRuleFamily, NowKey)) - + OverrideOpt = set() for Key in Options: if ModuleStyle != None and len (Key) > 2: # Check Module style is EDK or EDKII. @@ -2025,7 +2026,9 @@ class PlatformAutoGen(AutoGen): if Arch == "*" or Arch == self.Arch: if Tool not in BuildOptions: 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] else: # 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. if FamilyMatch or FamilyIsNull: return BuildOptions - + + OverrideOpt = set() for Key in Options: if ModuleStyle != None and len (Key) > 2: # Check Module style is EDK or EDKII. @@ -2057,7 +2061,9 @@ class PlatformAutoGen(AutoGen): if Arch == "*" or Arch == self.Arch: if Tool not in BuildOptions: 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] else: # append options for the same tool @@ -2097,6 +2103,7 @@ class PlatformAutoGen(AutoGen): PlatformModuleOptions.keys() + ModuleTypeOptions.keys() + self.ToolDefinition.keys()) BuildOptions = {} + OverrideTool = set() for Tool in AllTools: if Tool not in BuildOptions: BuildOptions[Tool] = {} @@ -2115,8 +2122,9 @@ class PlatformAutoGen(AutoGen): BuildOptions[Tool][Attr] = "" # check if override is indicated if Value.startswith('='): + OverrideTool.add((Tool, Attr)) BuildOptions[Tool][Attr] = Value[1:] - else: + elif (Tool, Attr) not in OverrideTool: BuildOptions[Tool][Attr] += " " + Value if Module.AutoGenVersion < 0x00010005 and self.Workspace.UniFlag != None: # diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index 1371bb0289..6c1d518f65 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -753,19 +753,24 @@ class DscBuildData(PlatformBuildClassObject): ## Retrieve [BuildOptions] def _GetBuildOptions(self): if self._BuildOptions == None: + OverrideTool = set() 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 ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: - self._BuildOptions[ToolChainFamily, ToolChain, EDKII_NAME] = Option - # - # Retrieve build option for EDK style module - # - RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, EDK_NAME] - for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: - self._BuildOptions[ToolChainFamily, ToolChain, EDK_NAME] = Option + for CodeBase in (EDKII_NAME, EDK_NAME): + RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase] + for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: + CurKey = (ToolChainFamily, ToolChain, CodeBase) + if Option.startswith('='): + OverrideTool.add(CurKey) + # + # Only flags can be appended + # + 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 def GetBuildOptionsByModuleType(self, Edk, ModuleType): @@ -773,12 +778,19 @@ class DscBuildData(PlatformBuildClassObject): self._ModuleTypeOptions = sdict() if (Edk, ModuleType) not in self._ModuleTypeOptions: options = sdict() + OverrideTool = set() self._ModuleTypeOptions[Edk, ModuleType] = options DriverType = '%s.%s' % (Edk, ModuleType) RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType] for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList: 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] ## Retrieve non-dynamic PCD settings @@ -2007,7 +2019,7 @@ class InfBuildData(ModuleBuildClassObject): if self._Header_ == None: self._GetHeaderInfo() if self._Guid == None: - self._Guid = '00000000-0000-0000-000000000000' + self._Guid = '00000000-0000-0000-0000-000000000000' return self._Guid ## Retrieve module version -- cgit v1.2.3