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

Reply via email to