From: Zhiju Fan <zhijux....@intel.com>

https://bugzilla.tianocore.org/show_bug.cgi?id=1672
The /MP option of MSVC compiler can reduce the total
time to compile the source files on the command line.

This patch is going to enable this MSVC option in BaseTools.

Cc: Bob Feng <bob.c.f...@intel.com>
Cc: Liming Gao <liming....@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Zhiju.Fan <zhijux....@intel.com>
---
 BaseTools/Conf/build_rule.template         |  2 +-
 BaseTools/Source/Python/AutoGen/GenMake.py | 81 ++++++++++++++++++++--
 2 files changed, 75 insertions(+), 8 deletions(-)

diff --git a/BaseTools/Conf/build_rule.template 
b/BaseTools/Conf/build_rule.template
index e56b1d9c59..e7d736740f 100755
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -127,11 +127,11 @@
 
     <OutputFile>
         $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj
 
     <Command.MSFT, Command.INTEL>
-        "$(CC)" /Fo${dst} $(CC_FLAGS) $(INC) ${src}
+        "$(CC)" /MP7 /Fo${d_path}\ $(CC_FLAGS) $(INC) ${src}
 
     <Command.GCC, Command.RVCT>
         # For RVCTCYGWIN CC_FLAGS must be first to work around pathing issues
         "$(CC)" $(CC_FLAGS) -c -o ${dst} $(INC) ${src}
 
diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py 
b/BaseTools/Source/Python/AutoGen/GenMake.py
index b441817b52..04951346ad 100644
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -433,11 +433,11 @@ cleanlib:
         self.BuildTargetList = []           # [target string]
         self.PendingBuildTargetList = []    # [FileBuildRule objects]
         self.CommonFileDependency = []
         self.FileListMacros = {}
         self.ListFileMacros = {}
-
+        self.ObjTargetDict = {}
         self.FileCache = {}
         self.LibraryBuildCommandList = []
         self.LibraryFileList = []
         self.LibraryMakefileList = []
         self.LibraryBuildDirectoryList = []
@@ -616,10 +616,15 @@ cleanlib:
                 ListFileName,
                 "\n".join(self.ListFileMacros[ListFileMacro]),
                 False
                 )
 
+        # Generate objlist used to create .obj file
+        for Type in self.ObjTargetDict:
+            NewLine = ' '.join(list(self.ObjTargetDict[Type]))
+            FileMacroList.append("OBJLIST_%s = %s" % 
(list(self.ObjTargetDict.keys()).index(Type), NewLine))
+
         BcTargetList = []
 
         MakefileName = self._FILE_NAME_[self._FileType]
         LibraryMakeCommandList = []
         for D in self.LibraryBuildDirectoryList:
@@ -925,17 +930,22 @@ cleanlib:
         # Extract common files list in the dependency files
         #
         for File in DepSet:
             self.CommonFileDependency.append(self.PlaceMacro(File.Path, 
self.Macros))
 
+        CmdSumDict = {}
+        CmdTargetDict = {}
+        CmdCppDict = {}
+        DependencyDict = FileDependencyDict.copy()
         for File in FileDependencyDict:
             # skip non-C files
             if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c":
                 continue
             NewDepSet = set(FileDependencyDict[File])
             NewDepSet -= DepSet
             FileDependencyDict[File] = ["$(COMMON_DEPS)"] + list(NewDepSet)
+            DependencyDict[File] = list(NewDepSet)
 
         # Convert target description object to target string in makefile
         for Type in self._AutoGenObject.Targets:
             for T in self._AutoGenObject.Targets[Type]:
                 # Generate related macros if needed
@@ -943,15 +953,25 @@ cleanlib:
                     self.FileListMacros[T.FileListMacro] = []
                 if T.GenListFile and T.ListFileMacro not in 
self.ListFileMacros:
                     self.ListFileMacros[T.ListFileMacro] = []
                 if T.GenIncListFile and T.IncListFileMacro not in 
self.ListFileMacros:
                     self.ListFileMacros[T.IncListFileMacro] = []
+                if self._AutoGenObject.BuildRuleFamily == TAB_COMPILER_MSFT 
and Type == TAB_C_CODE_FILE:
+                    NewFile = self.PlaceMacro(str(T), self.Macros)
+                    if self.ObjTargetDict.get(T.Target.SubDir):
+                        self.ObjTargetDict[T.Target.SubDir].add(NewFile)
+                    else:
+                        self.ObjTargetDict[T.Target.SubDir] = set()
+                        self.ObjTargetDict[T.Target.SubDir].add(NewFile)
 
                 Deps = []
+                CCodeDeps = []
                 # Add force-dependencies
                 for Dep in T.Dependencies:
                     Deps.append(self.PlaceMacro(str(Dep), self.Macros))
+                    if Dep != '$(MAKE_FILE)':
+                        CCodeDeps.append(self.PlaceMacro(str(Dep), 
self.Macros))
                 # Add inclusion-dependencies
                 if len(T.Inputs) == 1 and T.Inputs[0] in FileDependencyDict:
                     for F in FileDependencyDict[T.Inputs[0]]:
                         Deps.append(self.PlaceMacro(str(F), self.Macros))
                 # Add source-dependencies
@@ -971,16 +991,63 @@ cleanlib:
                 if T.GenFileListMacro:
                     Deps.append("$(%s)" % T.FileListMacro)
                     if Type in [TAB_OBJECT_FILE, TAB_STATIC_LIBRARY]:
                         Deps.append("$(%s)" % T.ListFileMacro)
 
-                TargetDict = {
-                    "target"    :   self.PlaceMacro(T.Target.Path, 
self.Macros),
-                    "cmd"       :   "\n\t".join(T.Commands),
-                    "deps"      :   Deps
-                }
-                
self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict))
+                if self._AutoGenObject.BuildRuleFamily == TAB_COMPILER_MSFT 
and Type == TAB_C_CODE_FILE:
+                    T, CmdTarget, CmdTargetDict, CmdCppDict = 
self.ParserCCodeFile(T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, 
DependencyDict)
+                    TargetDict = {"target": self.PlaceMacro(T.Target.Path, 
self.Macros), "cmd": "\n\t".join(T.Commands),"deps": CCodeDeps}
+                    CmdLine = 
self._BUILD_TARGET_TEMPLATE.Replace(TargetDict).rstrip().replace('\t$(OBJLIST', 
'$(OBJLIST')
+                    if T.Commands:
+                        CmdLine = '%s%s' %(CmdLine, TAB_LINE_BREAK)
+                    if CCodeDeps or CmdLine:
+                        self.BuildTargetList.append(CmdLine)
+                else:
+                    TargetDict = {"target": self.PlaceMacro(T.Target.Path, 
self.Macros), "cmd": "\n\t".join(T.Commands),"deps": Deps}
+                    
self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict))
+
+    def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, 
DependencyDict):
+        if not CmdSumDict:
+            for item in self._AutoGenObject.Targets[Type]:
+                CmdSumDict[item.Target.SubDir] = item.Target.BaseName
+                for CppPath in item.Inputs:
+                    Path = self.PlaceMacro(CppPath.Path, self.Macros)
+                    if CmdCppDict.get(item.Target.SubDir):
+                        CmdCppDict[item.Target.SubDir].append(Path)
+                    else:
+                        CmdCppDict[item.Target.SubDir] = ['$(MAKE_FILE)', Path]
+                    if CppPath.Path in DependencyDict:
+                        for Temp in DependencyDict[CppPath.Path]:
+                            Path = self.PlaceMacro(Temp.Path, self.Macros)
+                            if Path not in (self.CommonFileDependency + 
CmdCppDict[item.Target.SubDir]):
+                                CmdCppDict[item.Target.SubDir].append(Path)
+        if T.Commands:
+            CommandList = T.Commands[:]
+            for Item in CommandList[:]:
+                SingleCommandList = Item.split()
+                if len(SingleCommandList) > 0 and '$(CC)' in 
SingleCommandList[0]:
+                    for Temp in SingleCommandList:
+                        if Temp.startswith('/Fo'):
+                            CmdSign = '%s%s' % (Temp.rsplit(TAB_SLASH, 1)[0], 
TAB_SLASH)
+                            break
+                    else: continue
+                    if CmdSign not in list(CmdTargetDict.keys()):
+                        CmdLine = Item.replace(Temp, CmdSign)
+                        if GlobalData.gOptions.ThreadNumber:
+                            CmdLine = CmdLine.replace('/MP7', '%s%d' % ('/MP', 
GlobalData.gOptions.ThreadNumber))
+                        CmdTargetDict[CmdSign] = CmdLine
+                    else:
+                        CmdTargetDict[CmdSign] = "%s %s" % 
(CmdTargetDict[CmdSign], SingleCommandList[-1])
+                    Index = CommandList.index(Item)
+                    CommandList.pop(Index)
+                    if SingleCommandList[-1].endswith("%s%s.c" % (TAB_SLASH, 
CmdSumDict[CmdSign.lstrip('/Fo').rsplit(TAB_SLASH, 1)[0]])):
+                        Cpplist = CmdCppDict[T.Target.SubDir]
+                        Cpplist.insert(0, '$(OBJLIST_%d): $(COMMON_DEPS)' % 
list(self.ObjTargetDict.keys()).index(T.Target.SubDir))
+                        T.Commands[Index] = '%s\n\t%s' % (' 
\\\n\t'.join(Cpplist), CmdTargetDict[CmdSign])
+                    else:
+                        T.Commands.pop(Index)
+        return T, CmdSumDict, CmdTargetDict, CmdCppDict
 
     ## For creating makefile targets for dependent libraries
     def ProcessDependentLibrary(self):
         for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList:
             if not LibraryAutoGen.IsBinaryModule:
-- 
2.20.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to