]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGenWorker.py
BaseTools:Fix build tools print traceback info issue
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGenWorker.py
index 77fbd8b369f42590367f46ebcec7fa66389eb435..563d91b421cef4df35372b851c0e9291f7c35f6c 100755 (executable)
@@ -128,12 +128,27 @@ class AutoGenManager(threading.Thread):
         clearQ(taskq)\r
         clearQ(self.feedback_q)\r
         clearQ(logq)\r
+        # Copy the cache queue itmes to parent thread before clear\r
+        cacheq = self.autogen_workers[0].cache_q\r
+        try:\r
+            cache_num = 0\r
+            while True:\r
+                item = cacheq.get()\r
+                if item == "CacheDone":\r
+                    cache_num += 1\r
+                else:\r
+                    GlobalData.gModuleAllCacheStatus.add(item)\r
+                if cache_num  == len(self.autogen_workers):\r
+                    break\r
+        except:\r
+            print ("cache_q error")\r
+\r
     def TerminateWorkers(self):\r
         self.error_event.set()\r
     def kill(self):\r
         self.feedback_q.put(None)\r
 class AutoGenWorkerInProcess(mp.Process):\r
-    def __init__(self,module_queue,data_pipe_file_path,feedback_q,file_lock,cache_lock,share_data,log_q,error_event):\r
+    def __init__(self,module_queue,data_pipe_file_path,feedback_q,file_lock,cache_q,log_q,error_event):\r
         mp.Process.__init__(self)\r
         self.module_queue = module_queue\r
         self.data_pipe_file_path =data_pipe_file_path\r
@@ -141,8 +156,7 @@ class AutoGenWorkerInProcess(mp.Process):
         self.feedback_q = feedback_q\r
         self.PlatformMetaFileSet = {}\r
         self.file_lock = file_lock\r
-        self.cache_lock = cache_lock\r
-        self.share_data = share_data\r
+        self.cache_q = cache_q\r
         self.log_q = log_q\r
         self.error_event = error_event\r
     def GetPlatformMetaFile(self,filepath,root):\r
@@ -155,10 +169,11 @@ class AutoGenWorkerInProcess(mp.Process):
         try:\r
             taskname = "Init"\r
             with self.file_lock:\r
-                if not os.path.exists(self.data_pipe_file_path):\r
+                try:\r
+                    self.data_pipe = MemoryDataPipe()\r
+                    self.data_pipe.load(self.data_pipe_file_path)\r
+                except:\r
                     self.feedback_q.put(taskname + ":" + "load data pipe %s failed." % self.data_pipe_file_path)\r
-                self.data_pipe = MemoryDataPipe()\r
-                self.data_pipe.load(self.data_pipe_file_path)\r
             EdkLogger.LogClientInitialize(self.log_q)\r
             loglevel = self.data_pipe.Get("LogLevel")\r
             if not loglevel:\r
@@ -183,12 +198,19 @@ class AutoGenWorkerInProcess(mp.Process):
             GlobalData.gDisableIncludePathCheck = False\r
             GlobalData.gFdfParser = self.data_pipe.Get("FdfParser")\r
             GlobalData.gDatabasePath = self.data_pipe.Get("DatabasePath")\r
+\r
+            GlobalData.gUseHashCache = self.data_pipe.Get("UseHashCache")\r
             GlobalData.gBinCacheSource = self.data_pipe.Get("BinCacheSource")\r
             GlobalData.gBinCacheDest = self.data_pipe.Get("BinCacheDest")\r
-            GlobalData.gCacheIR = self.share_data\r
+            GlobalData.gPlatformHashFile = self.data_pipe.Get("PlatformHashFile")\r
+            GlobalData.gModulePreMakeCacheStatus = dict()\r
+            GlobalData.gModuleMakeCacheStatus = dict()\r
+            GlobalData.gHashChainStatus = dict()\r
+            GlobalData.gCMakeHashFile = dict()\r
+            GlobalData.gModuleHashFile = dict()\r
+            GlobalData.gFileHashDict = dict()\r
             GlobalData.gEnableGenfdsMultiThread = self.data_pipe.Get("EnableGenfdsMultiThread")\r
             GlobalData.file_lock = self.file_lock\r
-            GlobalData.cache_lock = self.cache_lock\r
             CommandTarget = self.data_pipe.Get("CommandTarget")\r
             pcd_from_build_option = []\r
             for pcd_tuple in self.data_pipe.Get("BuildOptPcd"):\r
@@ -204,10 +226,6 @@ class AutoGenWorkerInProcess(mp.Process):
             GlobalData.FfsCmd = FfsCmd\r
             PlatformMetaFile = self.GetPlatformMetaFile(self.data_pipe.Get("P_Info").get("ActivePlatform"),\r
                                              self.data_pipe.Get("P_Info").get("WorkspaceDir"))\r
-            libConstPcd = self.data_pipe.Get("LibConstPcd")\r
-            Refes = self.data_pipe.Get("REFS")\r
-            GlobalData.libConstPcd = libConstPcd\r
-            GlobalData.Refes = Refes\r
             while True:\r
                 if self.module_queue.empty():\r
                     break\r
@@ -229,34 +247,47 @@ class AutoGenWorkerInProcess(mp.Process):
                 toolchain = self.data_pipe.Get("P_Info").get("ToolChain")\r
                 Ma = ModuleAutoGen(self.Wa,module_metafile,target,toolchain,arch,PlatformMetaFile,self.data_pipe)\r
                 Ma.IsLibrary = IsLib\r
-                if IsLib:\r
-                    if (Ma.MetaFile.File,Ma.MetaFile.Root,Ma.Arch,Ma.MetaFile.Path) in libConstPcd:\r
-                        Ma.ConstPcd = libConstPcd[(Ma.MetaFile.File,Ma.MetaFile.Root,Ma.Arch,Ma.MetaFile.Path)]\r
-                    if (Ma.MetaFile.File,Ma.MetaFile.Root,Ma.Arch,Ma.MetaFile.Path) in Refes:\r
-                        Ma.ReferenceModules = Refes[(Ma.MetaFile.File,Ma.MetaFile.Root,Ma.Arch,Ma.MetaFile.Path)]\r
-                if GlobalData.gBinCacheSource and CommandTarget in [None, "", "all"]:\r
-                    Ma.GenModuleFilesHash(GlobalData.gCacheIR)\r
-                    Ma.GenPreMakefileHash(GlobalData.gCacheIR)\r
-                    if Ma.CanSkipbyPreMakefileCache(GlobalData.gCacheIR):\r
+                # SourceFileList calling sequence impact the makefile string sequence.\r
+                # Create cached SourceFileList here to unify its calling sequence for both\r
+                # CanSkipbyPreMakeCache and CreateCodeFile/CreateMakeFile.\r
+                RetVal = Ma.SourceFileList\r
+                if GlobalData.gUseHashCache and not GlobalData.gBinCacheDest and CommandTarget in [None, "", "all"]:\r
+                    try:\r
+                        CacheResult = Ma.CanSkipbyPreMakeCache()\r
+                    except:\r
+                        CacheResult = False\r
+                        self.feedback_q.put(taskname)\r
+\r
+                    if CacheResult:\r
+                        self.cache_q.put((Ma.MetaFile.Path, Ma.Arch, "PreMakeCache", True))\r
                         continue\r
+                    else:\r
+                        self.cache_q.put((Ma.MetaFile.Path, Ma.Arch, "PreMakeCache", False))\r
 \r
                 Ma.CreateCodeFile(False)\r
                 Ma.CreateMakeFile(False,GenFfsList=FfsCmd.get((Ma.MetaFile.Path, Ma.Arch),[]))\r
 \r
                 if GlobalData.gBinCacheSource and CommandTarget in [None, "", "all"]:\r
-                    Ma.GenMakeHeaderFilesHash(GlobalData.gCacheIR)\r
-                    Ma.GenMakeHash(GlobalData.gCacheIR)\r
-                    if Ma.CanSkipbyMakeCache(GlobalData.gCacheIR):\r
+                    try:\r
+                        CacheResult = Ma.CanSkipbyMakeCache()\r
+                    except:\r
+                        CacheResult = False\r
+                        self.feedback_q.put(taskname)\r
+\r
+                    if CacheResult:\r
+                        self.cache_q.put((Ma.MetaFile.Path, Ma.Arch, "MakeCache", True))\r
                         continue\r
                     else:\r
-                        Ma.PrintFirstMakeCacheMissFile(GlobalData.gCacheIR)\r
+                        self.cache_q.put((Ma.MetaFile.Path, Ma.Arch, "MakeCache", False))\r
+\r
         except Empty:\r
             pass\r
         except:\r
-            traceback.print_exc(file=sys.stdout)\r
             self.feedback_q.put(taskname)\r
         finally:\r
             self.feedback_q.put("Done")\r
+            self.cache_q.put("CacheDone")\r
+\r
     def printStatus(self):\r
         print("Processs ID: %d Run %d modules in AutoGen " % (os.getpid(),len(AutoGen.Cache())))\r
         print("Processs ID: %d Run %d modules in AutoGenInfo " % (os.getpid(),len(AutoGenInfo.GetCache())))\r