]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
BaseTools: Add LogAgent to support multiple process Autogen
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index b9305bf7b25a635d04d6b21cc0161d4f7bad2028..4daef5652f8d6b6a41a91874ec85161dbdaf1dc7 100644 (file)
@@ -30,7 +30,8 @@ from optparse import OptionParser
 from AutoGen.PlatformAutoGen import PlatformAutoGen\r
 from AutoGen.ModuleAutoGen import ModuleAutoGen\r
 from AutoGen.WorkspaceAutoGen import WorkspaceAutoGen\r
-from AutoGen.AutoGenWorker import AutoGenWorkerInProcess,AutoGenManager\r
+from AutoGen.AutoGenWorker import AutoGenWorkerInProcess,AutoGenManager,\\r
+    LogAgent\r
 from AutoGen import GenMake\r
 from Common import Misc as Utils\r
 \r
@@ -699,7 +700,7 @@ class Build():
     #   @param  WorkspaceDir        The directory of workspace\r
     #   @param  BuildOptions        Build options passed from command line\r
     #\r
-    def __init__(self, Target, WorkspaceDir, BuildOptions):\r
+    def __init__(self, Target, WorkspaceDir, BuildOptions,log_q):\r
         self.WorkspaceDir   = WorkspaceDir\r
         self.Target         = Target\r
         self.PlatformFile   = BuildOptions.PlatformFile\r
@@ -830,6 +831,7 @@ class Build():
         EdkLogger.info("")\r
         os.chdir(self.WorkspaceDir)\r
         self.share_data = Manager().dict()\r
+        self.log_q = log_q\r
     def StartAutoGen(self,mqueue, DataPipe,SkipAutoGen,PcdMaList,share_data):\r
         try:\r
             if SkipAutoGen:\r
@@ -837,7 +839,7 @@ class Build():
             feedback_q = mp.Queue()\r
             file_lock = mp.Lock()\r
             error_event = mp.Event()\r
-            auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,file_lock,share_data,error_event) for _ in range(self.ThreadNumber)]\r
+            auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,file_lock,share_data,self.log_q,error_event) for _ in range(self.ThreadNumber)]\r
             self.AutoGenMgr = AutoGenManager(auto_workers,feedback_q,error_event)\r
             self.AutoGenMgr.start()\r
             for w in auto_workers:\r
@@ -2406,8 +2408,12 @@ def MyOptionParser():
 def Main():\r
     StartTime = time.time()\r
 \r
+    #\r
+    # Create a log Queue\r
+    #\r
+    LogQ = mp.Queue()\r
     # Initialize log system\r
-    EdkLogger.Initialize()\r
+    EdkLogger.LogClientInitialize(LogQ)\r
     GlobalData.gCommand = sys.argv[1:]\r
     #\r
     # Parse the options and args\r
@@ -2417,20 +2423,23 @@ def Main():
     GlobalData.gCaseInsensitive = Option.CaseInsensitive\r
 \r
     # Set log level\r
+    LogLevel = EdkLogger.INFO\r
     if Option.verbose is not None:\r
         EdkLogger.SetLevel(EdkLogger.VERBOSE)\r
+        LogLevel = EdkLogger.VERBOSE\r
     elif Option.quiet is not None:\r
         EdkLogger.SetLevel(EdkLogger.QUIET)\r
+        LogLevel = EdkLogger.QUIET\r
     elif Option.debug is not None:\r
         EdkLogger.SetLevel(Option.debug + 1)\r
+        LogLevel = Option.debug + 1\r
     else:\r
         EdkLogger.SetLevel(EdkLogger.INFO)\r
 \r
-    if Option.LogFile is not None:\r
-        EdkLogger.SetLogFile(Option.LogFile)\r
-\r
     if Option.WarningAsError == True:\r
         EdkLogger.SetWarningAsError()\r
+    Log_Agent = LogAgent(LogQ,LogLevel,Option.LogFile)\r
+    Log_Agent.start()\r
 \r
     if platform.platform().find("Windows") >= 0:\r
         GlobalData.gIsWindows = True\r
@@ -2504,7 +2513,7 @@ def Main():
         if Option.Flag is not None and Option.Flag not in ['-c', '-s']:\r
             EdkLogger.error("build", OPTION_VALUE_INVALID, "UNI flag must be one of -c or -s")\r
 \r
-        MyBuild = Build(Target, Workspace, Option)\r
+        MyBuild = Build(Target, Workspace, Option,LogQ)\r
         GlobalData.gCommandLineDefines['ARCH'] = ' '.join(MyBuild.ArchList)\r
         if not (MyBuild.LaunchPrebuildFlag and os.path.exists(MyBuild.PlatformBuildPath)):\r
             MyBuild.Launch()\r
@@ -2588,6 +2597,8 @@ def Main():
     EdkLogger.quiet("\n- %s -" % Conclusion)\r
     EdkLogger.quiet(time.strftime("Build end time: %H:%M:%S, %b.%d %Y", time.localtime()))\r
     EdkLogger.quiet("Build total time: %s\n" % BuildDurationStr)\r
+    Log_Agent.kill()\r
+    Log_Agent.join()\r
     return ReturnCode\r
 \r
 if __name__ == '__main__':\r