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