From c340c5bd1b3e59ced03bd188981d4fe98aa62cac Mon Sep 17 00:00:00 2001 From: "Shi, Steven" Date: Thu, 15 Aug 2019 22:26:19 +0800 Subject: BaseTools: Change the [Arch][Name] module key in Build cache BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1951 Current build cache use the module's [self.Arch][self.Name] info as the ModuleAutoGen object key in hash list and dictionary. The [self.Arch][self.Name] is not safe as the module key because there could be two modules with same module name and arch name in one platform. E.g. A platform can override a module or library instance in another different path, the overriding module can has the same module name and arch name as the original one. Directly use the ModuleAutoGen obj self as the key, because the obj __hash__ and __repr__ attributes already contain the full path and arch name. Cc: Liming Gao Cc: Bob Feng Signed-off-by: Steven Shi Reviewed-by: Bob Feng --- BaseTools/Source/Python/AutoGen/GenMake.py | 6 +--- BaseTools/Source/Python/build/build.py | 48 +++++++++++++----------------- 2 files changed, 21 insertions(+), 33 deletions(-) (limited to 'BaseTools/Source') diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index 0d581c9..47dae82 100755 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -959,16 +959,12 @@ cleanlib: # Keep the file to be checked headerFileDependencySet.add(aFileName) - # Ensure that gModuleBuildTracking has been initialized per architecture - if self._AutoGenObject.Arch not in GlobalData.gModuleBuildTracking: - GlobalData.gModuleBuildTracking[self._AutoGenObject.Arch] = dict() - # Check if a module dependency header file is missing from the module's MetaFile for aFile in headerFileDependencySet: if aFile in headerFilesInMetaFileSet: continue if GlobalData.gUseHashCache: - GlobalData.gModuleBuildTracking[self._AutoGenObject.Arch][self._AutoGenObject] = 'FAIL_METAFILE' + GlobalData.gModuleBuildTracking[self._AutoGenObject] = 'FAIL_METAFILE' EdkLogger.warn("build","Module MetaFile [Sources] is missing local header!", ExtraData = "Local Header: " + aFile + " not found in " + self._AutoGenObject.MetaFile.Path ) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index d7c817b..299fa64 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -630,12 +630,11 @@ class BuildTask: # Set the value used by hash invalidation flow in GlobalData.gModuleBuildTracking to 'SUCCESS' # If Module or Lib is being tracked, it did not fail header check test, and built successfully - if (self.BuildItem.BuildObject.Arch in GlobalData.gModuleBuildTracking and - self.BuildItem.BuildObject in GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch] and - GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch][self.BuildItem.BuildObject] != 'FAIL_METAFILE' and + if (self.BuildItem.BuildObject in GlobalData.gModuleBuildTracking and + GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject] != 'FAIL_METAFILE' and not BuildTask._ErrorFlag.isSet() ): - GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch][self.BuildItem.BuildObject] = 'SUCCESS' + GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject] = 'SUCCESS' # indicate there's a thread is available for another build task BuildTask._RunningQueueLock.acquire() @@ -1171,25 +1170,24 @@ class Build(): return # GlobalData.gModuleBuildTracking contains only modules or libs that cannot be skipped by hash - for moduleAutoGenObjArch in GlobalData.gModuleBuildTracking.keys(): - for moduleAutoGenObj in GlobalData.gModuleBuildTracking[moduleAutoGenObjArch].keys(): - # Skip invalidating for Successful Module/Lib builds - if GlobalData.gModuleBuildTracking[moduleAutoGenObjArch][moduleAutoGenObj] == 'SUCCESS': - continue + for Ma in GlobalData.gModuleBuildTracking: + # Skip invalidating for Successful Module/Lib builds + if GlobalData.gModuleBuildTracking[Ma] == 'SUCCESS': + continue - # The module failed to build, failed to start building, or failed the header check test from this point on + # The module failed to build, failed to start building, or failed the header check test from this point on - # Remove .hash from build - ModuleHashFile = os.path.join(moduleAutoGenObj.BuildDir, moduleAutoGenObj.Name + ".hash") - if os.path.exists(ModuleHashFile): - os.remove(ModuleHashFile) + # Remove .hash from build + ModuleHashFile = os.path.join(Ma.BuildDir, Ma.Name + ".hash") + if os.path.exists(ModuleHashFile): + os.remove(ModuleHashFile) - # Remove .hash file from cache - if GlobalData.gBinCacheDest: - FileDir = os.path.join(GlobalData.gBinCacheDest, moduleAutoGenObj.Arch, moduleAutoGenObj.SourceDir, moduleAutoGenObj.MetaFile.BaseName) - HashFile = os.path.join(FileDir, moduleAutoGenObj.Name + '.hash') - if os.path.exists(HashFile): - os.remove(HashFile) + # Remove .hash file from cache + if GlobalData.gBinCacheDest: + FileDir = os.path.join(GlobalData.gBinCacheDest, Ma.PlatformInfo.OutputDir, Ma.BuildTarget + "_" + Ma.ToolChain, Ma.Arch, Ma.SourceDir, Ma.MetaFile.BaseName) + HashFile = os.path.join(FileDir, Ma.Name + '.hash') + if os.path.exists(HashFile): + os.remove(HashFile) ## Build a module or platform # @@ -1889,10 +1887,7 @@ class Build(): self.BuildModules.append(Ma) # Initialize all modules in tracking to 'FAIL' - if Ma.Arch not in GlobalData.gModuleBuildTracking: - GlobalData.gModuleBuildTracking[Ma.Arch] = dict() - if Ma not in GlobalData.gModuleBuildTracking[Ma.Arch]: - GlobalData.gModuleBuildTracking[Ma.Arch][Ma] = 'FAIL' + GlobalData.gModuleBuildTracking[Ma] = 'FAIL' self.AutoGenTime += int(round((time.time() - AutoGenStart))) MakeStart = time.time() for Ma in self.BuildModules: @@ -2075,10 +2070,7 @@ class Build(): PcdMaList.append(Ma) TotalModules.append(Ma) # Initialize all modules in tracking to 'FAIL' - if Ma.Arch not in GlobalData.gModuleBuildTracking: - GlobalData.gModuleBuildTracking[Ma.Arch] = dict() - if Ma not in GlobalData.gModuleBuildTracking[Ma.Arch]: - GlobalData.gModuleBuildTracking[Ma.Arch][Ma] = 'FAIL' + GlobalData.gModuleBuildTracking[Ma] = 'FAIL' mqueue = mp.Queue() for m in Pa.GetAllModuleInfo: -- cgit v1.1