This feature allows the toolchain to choose a preference for source file extensions in tools_def.txt. The first extension is given the highest priority.
Here is an example usage for tools_def.txt: *_*_*_*_BUILDRULEORDER = nasm Nasm NASM asm Asm ASM S s *_XCODE5_*_*_BUILDRULEORDER = S s nasm Nasm NASM Now, if a .inf lists these sources: 1.nasm, 1.asm and 1.S All toolchains, except XCODE5 will use the 1.nasm file. The XCODE5 toolchain will use the 1.S file. Note that the build_rule.txt file also impacts the decision, because, for instance there is no build rule for .asm files on GCC toolchains. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu <yingke.d....@intel.com> Reviewed-by: Liming Gao <liming....@intel.com> --- BaseTools/Source/Python/AutoGen/AutoGen.py | 26 ++++++++++++++++++++--- BaseTools/Source/Python/AutoGen/BuildEngine.py | 29 +++++++++++++++++++------- BaseTools/Source/Python/Common/DataType.py | 1 + 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index a1e1818..b2d9f6a 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -2080,10 +2080,17 @@ class PlatformAutoGen(AutoGen): PlatformModule = self.Platform.Modules[str(Module)] PlatformModuleOptions = self._ExpandBuildOption(PlatformModule.BuildOptions) else: PlatformModuleOptions = {} + BuildRuleOrder = None + for Options in [self.ToolDefinition, ModuleOptions, PlatformOptions, PlatformModuleOptions]: + for Tool in Options: + for Attr in Options[Tool]: + if Attr == TAB_TOD_DEFINES_BUILDRULEORDER: + BuildRuleOrder = Options[Tool][Attr] + AllTools = set(ModuleOptions.keys() + PlatformOptions.keys() + PlatformModuleOptions.keys() + self.ToolDefinition.keys()) BuildOptions = {} for Tool in AllTools: if Tool not in BuildOptions: BuildOptions[Tool] = {} @@ -2091,10 +2098,15 @@ class PlatformAutoGen(AutoGen): for Options in [self.ToolDefinition, ModuleOptions, PlatformOptions, PlatformModuleOptions]: if Tool not in Options: continue for Attr in Options[Tool]: Value = Options[Tool][Attr] + # + # Do not generate it in Makefile + # + if Attr == TAB_TOD_DEFINES_BUILDRULEORDER: + continue if Attr not in BuildOptions[Tool]: BuildOptions[Tool][Attr] = "" # check if override is indicated if Value.startswith('='): BuildOptions[Tool][Attr] = Value[1:] @@ -2105,11 +2117,11 @@ class PlatformAutoGen(AutoGen): # Override UNI flag only for EDK module. # if 'BUILD' not in BuildOptions: BuildOptions['BUILD'] = {} BuildOptions['BUILD']['FLAGS'] = self.Workspace.UniFlag - return BuildOptions + return BuildOptions, BuildRuleOrder Platform = property(_GetPlatform) Name = property(_GetName) Guid = property(_GetGuid) Version = property(_GetVersion) @@ -2193,10 +2205,11 @@ class ModuleAutoGen(AutoGen): self.IsCodeFileCreated = False self.IsAsBuiltInfCreated = False self.DepexGenerated = False self.BuildDatabase = self.Workspace.BuildDatabase + self.BuildRuleOrder = None self._Module = None self._Name = None self._Guid = None self._Version = None @@ -2585,11 +2598,13 @@ class ModuleAutoGen(AutoGen): # @param PlatformInfo The object of PlatformBuildInfo # @retval dict The dict containing valid options # def _GetModuleBuildOption(self): if self._BuildOption == None: - self._BuildOption = self.PlatformInfo.ApplyBuildOption(self.Module) + self._BuildOption, self.BuildRuleOrder = self.PlatformInfo.ApplyBuildOption(self.Module) + if self.BuildRuleOrder: + self.BuildRuleOrder = ['.%s' % Ext for Ext in self.BuildRuleOrder.split()] return self._BuildOption ## Get include path list from tool option for the module build # # @retval list The include path list @@ -2744,10 +2759,15 @@ class ModuleAutoGen(AutoGen): CreateDirectory(SubDirectory) LastTarget = None RuleChain = [] SourceList = [File] Index = 0 + # + # Make sure to get build rule order value + # + self._GetModuleBuildOption() + while Index < len(SourceList): Source = SourceList[Index] Index = Index + 1 if Source != File: @@ -2777,11 +2797,11 @@ class ModuleAutoGen(AutoGen): if self.IsLibrary and FileType == TAB_STATIC_LIBRARY: if LastTarget: self._FinalBuildTargetList.add(LastTarget) break - Target = RuleObject.Apply(Source) + Target = RuleObject.Apply(Source, self.BuildRuleOrder) if not Target: if LastTarget: self._FinalBuildTargetList.add(LastTarget) break elif not Target.Outputs: diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py index d15ccc0..ee1d3c8 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -218,11 +218,11 @@ class FileBuildRule: # @param RelativeToDir The relative path of the source file # @param PathSeparator Path separator # # @retval tuple (Source file in full path, List of individual sourcefiles, Destionation file, List of build commands) # - def Apply(self, SourceFile): + def Apply(self, SourceFile, BuildRuleOrder=None): if not self.CommandList or not self.DestFileList: return None # source file if self.IsMultipleInput: @@ -279,27 +279,42 @@ class FileBuildRule: File = string.Template(str(File)).safe_substitute(BuildRulePlaceholderDict) DstFile.append(PathClass(File, IsBinary=True)) if DstFile[0] in self.BuildTargets: TargetDesc = self.BuildTargets[DstFile[0]] - TargetDesc.AddInput(SourceFile) + if BuildRuleOrder and SourceFile.Ext in BuildRuleOrder: + Index = BuildRuleOrder.index(SourceFile.Ext) + for Input in TargetDesc.Inputs: + if Input.Ext not in BuildRuleOrder or BuildRuleOrder.index(Input.Ext) > Index: + # + # Command line should be regenerated since some macros are different + # + CommandList = self._BuildCommand(BuildRulePlaceholderDict) + TargetDesc._Init([SourceFile], DstFile, CommandList, self.ExtraSourceFileList) + break + else: + TargetDesc.AddInput(SourceFile) else: - CommandList = [] - for CommandString in self.CommandList: - CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) - CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) - CommandList.append(CommandString) + CommandList = self._BuildCommand(BuildRulePlaceholderDict) TargetDesc = TargetDescBlock([SourceFile], DstFile, CommandList, self.ExtraSourceFileList) TargetDesc.ListFileMacro = self.ListFileMacro TargetDesc.FileListMacro = self.FileListMacro TargetDesc.IncListFileMacro = self.IncListFileMacro TargetDesc.GenFileListMacro = self.GenFileListMacro TargetDesc.GenListFile = self.GenListFile TargetDesc.GenIncListFile = self.GenIncListFile self.BuildTargets[DstFile[0]] = TargetDesc return TargetDesc + def _BuildCommand(self, Macros): + CommandList = [] + for CommandString in self.CommandList: + CommandString = string.Template(CommandString).safe_substitute(Macros) + CommandString = string.Template(CommandString).safe_substitute(Macros) + CommandList.append(CommandString) + return CommandList + ## Class for build rules # # BuildRule class parses rules defined in a file or passed by caller, and converts # the rule into FileBuildRule object. # diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index b4abc88..4fd46ed 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -430,10 +430,11 @@ TAB_TOD_DEFINES_TARGET = 'TARGET' TAB_TOD_DEFINES_TOOL_CHAIN_TAG = 'TOOL_CHAIN_TAG' TAB_TOD_DEFINES_TARGET_ARCH = 'TARGET_ARCH' TAB_TOD_DEFINES_COMMAND_TYPE = 'COMMAND_TYPE' TAB_TOD_DEFINES_FAMILY = 'FAMILY' TAB_TOD_DEFINES_BUILDRULEFAMILY = 'BUILDRULEFAMILY' +TAB_TOD_DEFINES_BUILDRULEORDER = 'BUILDRULEORDER' # # Conditional Statements # TAB_IF = '!if' -- 1.9.5.msysgit.0 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel