]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Print first cache missing file for build cachle
authorShi, Steven <steven.shi@intel.com>
Thu, 15 Aug 2019 14:26:18 +0000 (22:26 +0800)
committerFeng, Bob C <bob.c.feng@intel.com>
Tue, 20 Aug 2019 06:06:06 +0000 (14:06 +0800)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1925

When a module build cache miss, add support to print the first
cache missing file path and name.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Signed-off-by: Steven Shi <steven.shi@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/AutoGen/AutoGenWorker.py
BaseTools/Source/Python/AutoGen/ModuleAutoGen.py

index a84ed46f2e5050118141d83c83f6da4edd2037a0..30d2f96fc74ca2cb2821a993a76c6bacc7aba7ed 100755 (executable)
@@ -246,6 +246,8 @@ class AutoGenWorkerInProcess(mp.Process):
                     Ma.GenMakeHash(GlobalData.gCacheIR)\r
                     if Ma.CanSkipbyMakeCache(GlobalData.gCacheIR):\r
                         continue\r
+                    else:\r
+                        Ma.PrintFirstMakeCacheMissFile(GlobalData.gCacheIR)\r
         except Empty:\r
             pass\r
         except:\r
index 383078c376c95f83ce348f36e870a991a035977d..dd833208b0279ff3a45591e4885a04595d267b79 100755 (executable)
@@ -2379,6 +2379,82 @@ class ModuleAutoGen(AutoGen):
         print("[cache hit]: checkpoint_Makefile:", self.MetaFile.Path, self.Arch)\r
         return True\r
 \r
+    ## Show the first file name which causes cache miss\r
+    def PrintFirstMakeCacheMissFile(self, gDict):\r
+        if not GlobalData.gBinCacheSource:\r
+            return\r
+\r
+        # skip binary module\r
+        if self.IsBinaryModule:\r
+            return\r
+\r
+        if not (self.MetaFile.Path, self.Arch) in gDict:\r
+            return\r
+\r
+        # Only print cache miss file for the MakeCache not hit module\r
+        if gDict[(self.MetaFile.Path, self.Arch)].MakeCacheHit:\r
+            return\r
+\r
+        if not gDict[(self.MetaFile.Path, self.Arch)].MakeHashChain:\r
+            EdkLogger.quiet("[cache insight]: MakeHashChain is missing for: %s[%s]" % (self.MetaFile.Path, self.Arch))\r
+            return\r
+\r
+        # Find the cache dir name through the .ModuleHashPair file info\r
+        FileDir = path.join(GlobalData.gBinCacheSource, self.PlatformInfo.OutputDir, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceDir, self.MetaFile.BaseName)\r
+\r
+        ModuleHashPairList = [] # tuple list: [tuple(PreMakefileHash, MakeHash)]\r
+        ModuleHashPair = path.join(FileDir, self.Name + ".ModuleHashPair")\r
+        if not os.path.exists(ModuleHashPair):\r
+            EdkLogger.quiet("[cache insight]: Cannot find ModuleHashPair file for module: %s[%s]" % (self.MetaFile.Path, self.Arch))\r
+            return\r
+\r
+        try:\r
+            f = open(ModuleHashPair, 'r')\r
+            ModuleHashPairList = json.load(f)\r
+            f.close()\r
+        except:\r
+            EdkLogger.quiet("[cache insight]: Cannot load ModuleHashPair file for module: %s[%s]" % (self.MetaFile.Path, self.Arch))\r
+            return\r
+\r
+        MakeHashSet = set()\r
+        for idx, (PreMakefileHash, MakeHash) in enumerate (ModuleHashPairList):\r
+            TargetHashDir = path.join(FileDir, str(MakeHash))\r
+            if os.path.exists(TargetHashDir):\r
+                MakeHashSet.add(MakeHash)\r
+        if not MakeHashSet:\r
+            EdkLogger.quiet("[cache insight]: Cannot find valid cache dir for module: %s[%s]" % (self.MetaFile.Path, self.Arch))\r
+            return\r
+\r
+        TargetHash = list(MakeHashSet)[0]\r
+        TargetHashDir = path.join(FileDir, str(TargetHash))\r
+        if len(MakeHashSet) > 1 :\r
+            EdkLogger.quiet("[cache insight]: found multiple cache dirs for this module, random select dir '%s' to search the first cache miss file: %s[%s]" % (TargetHash, self.MetaFile.Path, self.Arch))\r
+\r
+        ListFile = path.join(TargetHashDir, self.Name + '.MakeHashChain')\r
+        if os.path.exists(ListFile):\r
+            try:\r
+                f = open(ListFile, 'r')\r
+                CachedList = json.load(f)\r
+                f.close()\r
+            except:\r
+                EdkLogger.quiet("[cache insight]: Cannot load MakeHashChain file: %s" % ListFile)\r
+                return\r
+        else:\r
+            EdkLogger.quiet("[cache insight]: Cannot find MakeHashChain file: %s" % ListFile)\r
+            return\r
+\r
+        CurrentList = gDict[(self.MetaFile.Path, self.Arch)].MakeHashChain\r
+        for idx, (file, hash) in enumerate (CurrentList):\r
+            (filecached, hashcached) = CachedList[idx]\r
+            if file != filecached:\r
+                EdkLogger.quiet("[cache insight]: first different file in %s[%s] is %s, the cached one is %s" % (self.MetaFile.Path, self.Arch, file, filecached))\r
+                break\r
+            if hash != hashcached:\r
+                EdkLogger.quiet("[cache insight]: first cache miss file in %s[%s] is %s" % (self.MetaFile.Path, self.Arch, file))\r
+                break\r
+\r
+        return True\r
+\r
     ## Decide whether we can skip the ModuleAutoGen process\r
     def CanSkipbyCache(self, gDict):\r
         # Hashing feature is off\r