diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index 45b81ed660e..e8e09dc8a36 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -3579,19 +3579,37 @@ def _GenOffsetBin(self): fInputfile.close () return OutputName + @cached_property + def OutputFile(self): + retVal = set() + OutputDir = self.OutputDir.replace('\\', '/').strip('/') + DebugDir = self.DebugDir.replace('\\', '/').strip('/') + for Item in self.CodaTargetList: + File = Item.Target.Path.replace('\\', '/').strip('/').replace(DebugDir, '').replace(OutputDir, '').strip('/') + retVal.add(File) + if self.DepexGenerated: + retVal.add(self.Name + '.depex') + + Bin = self._GenOffsetBin() + if Bin: + retVal.add(Bin) + + for Root, Dirs, Files in os.walk(OutputDir): + for File in Files: + if File.lower().endswith('.pdb'): + retVal.add(File) + + return retVal + ## Create AsBuilt INF file the module # def CreateAsBuiltInf(self): - self.OutputFile = set() if self.IsAsBuiltInfCreated: return # Skip INF file generation for libraries if self.IsLibrary: - # Only store the library cache if needed - if GlobalData.gBinCacheDest: - self.CopyModuleToCache() return # Skip the following code for modules with no source files @@ -3712,7 +3730,6 @@ def CreateAsBuiltInf(self): DebugDir = self.DebugDir.replace('\\', '/').strip('/') for Item in self.CodaTargetList: File = Item.Target.Path.replace('\\', '/').strip('/').replace(DebugDir, '').replace(OutputDir, '').strip('/') - self.OutputFile.add(File) if os.path.isabs(File): File = File.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/') if Item.Target.Ext.lower() == '.aml': @@ -3728,7 +3745,6 @@ def CreateAsBuiltInf(self): if os.path.exists(DepexFile): self.DepexGenerated = True if self.DepexGenerated: - self.OutputFile.add(self.Name + '.depex') if self.ModuleType in [SUP_MODULE_PEIM]: AsBuiltInfDict['binary_item'].append('PEI_DEPEX|' + self.Name + '.depex') elif self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]: @@ -3739,13 +3755,11 @@ def CreateAsBuiltInf(self): Bin = self._GenOffsetBin() if Bin: AsBuiltInfDict['binary_item'].append('BIN|%s' % Bin) - self.OutputFile.add(Bin) for Root, Dirs, Files in os.walk(OutputDir): for File in Files: if File.lower().endswith('.pdb'): AsBuiltInfDict['binary_item'].append('DISPOSABLE|' + File) - self.OutputFile.add(File) HeaderComments = self.Module.HeaderComments StartPos = 0 for Index in range(len(HeaderComments)): @@ -3914,8 +3928,6 @@ def CreateAsBuiltInf(self): SaveFileOnChange(os.path.join(self.OutputDir, self.Name + '.inf'), str(AsBuiltInf), False) self.IsAsBuiltInfCreated = True - if GlobalData.gBinCacheDest: - self.CopyModuleToCache() def CopyModuleToCache(self): FileDir = path.join(GlobalData.gBinCacheDest, self.PlatformInfo.OutputDir, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceDir, self.MetaFile.BaseName) @@ -3923,30 +3935,24 @@ def CopyModuleToCache(self): HashFile = path.join(self.BuildDir, self.Name + '.hash') if os.path.exists(HashFile): CopyFileOnChange(HashFile, FileDir) - if not self.IsLibrary: - ModuleFile = path.join(self.OutputDir, self.Name + '.inf') - if os.path.exists(ModuleFile): - CopyFileOnChange(ModuleFile, FileDir) - else: - OutputDir = self.OutputDir.replace('\\', '/').strip('/') - DebugDir = self.DebugDir.replace('\\', '/').strip('/') - for Item in self.CodaTargetList: - File = Item.Target.Path.replace('\\', '/').strip('/').replace(DebugDir, '').replace(OutputDir, '').strip('/') - self.OutputFile.add(File) + ModuleFile = path.join(self.OutputDir, self.Name + '.inf') + if os.path.exists(ModuleFile): + CopyFileOnChange(ModuleFile, FileDir) + if not self.OutputFile: Ma = self.BuildDatabase[self.MetaFile, self.Arch, self.BuildTarget, self.ToolChain] self.OutputFile = Ma.Binaries - if self.OutputFile: - for File in self.OutputFile: - File = str(File) - if not os.path.isabs(File): - File = os.path.join(self.OutputDir, File) - if os.path.exists(File): - sub_dir = os.path.relpath(File, self.OutputDir) - destination_file = os.path.join(FileDir, sub_dir) - destination_dir = os.path.dirname(destination_file) - CreateDirectory(destination_dir) - CopyFileOnChange(File, destination_dir) + + for File in self.OutputFile: + File = str(File) + if not os.path.isabs(File): + File = os.path.join(self.OutputDir, File) + if os.path.exists(File): + sub_dir = os.path.relpath(File, self.OutputDir) + destination_file = os.path.join(FileDir, sub_dir) + destination_dir = os.path.dirname(destination_file) + CreateDirectory(destination_dir) + CopyFileOnChange(File, destination_dir) def AttemptModuleCacheCopy(self): # If library or Module is binary do not skip by hash diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 3ece4d4c615..8c3315619af 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -1250,6 +1250,9 @@ def _BuildPa(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMak BuildCommand = BuildCommand + [Target] LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir) self.CreateAsBuiltInf() + if GlobalData.gBinCacheDest: + self.UpdateBuildCache() + self.BuildModules = [] return True # build library @@ -1268,6 +1271,9 @@ def _BuildPa(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMak NewBuildCommand = BuildCommand + ['-f', os.path.normpath(os.path.join(Mod, makefile)), 'pbuild'] LaunchCommand(NewBuildCommand, AutoGenObject.MakeFileDir) self.CreateAsBuiltInf() + if GlobalData.gBinCacheDest: + self.UpdateBuildCache() + self.BuildModules = [] return True # cleanlib @@ -1361,6 +1367,9 @@ def _Build(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMakeF BuildCommand = BuildCommand + [Target] AutoGenObject.BuildTime = LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir) self.CreateAsBuiltInf() + if GlobalData.gBinCacheDest: + self.UpdateBuildCache() + self.BuildModules = [] return True # genfds @@ -1874,6 +1883,9 @@ def _BuildModule(self): ExitFlag.set() BuildTask.WaitForComplete() self.CreateAsBuiltInf() + if GlobalData.gBinCacheDest: + self.UpdateBuildCache() + self.BuildModules = [] self.MakeTime += int(round((time.time() - MakeContiue))) if BuildTask.HasError(): self.invalidateHash() @@ -2074,6 +2086,9 @@ def _MultiThreadBuildPlatform(self): ExitFlag.set() BuildTask.WaitForComplete() self.CreateAsBuiltInf() + if GlobalData.gBinCacheDest: + self.UpdateBuildCache() + self.BuildModules = [] self.MakeTime += int(round((time.time() - MakeContiue))) # # Check for build error, and raise exception if one @@ -2213,24 +2228,25 @@ def Launch(self): RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True) def CreateAsBuiltInf(self): + for Module in self.BuildModules: + Module.CreateAsBuiltInf() + + def UpdateBuildCache(self): all_lib_set = set() all_mod_set = set() for Module in self.BuildModules: - Module.CreateAsBuiltInf() + Module.CopyModuleToCache() all_mod_set.add(Module) for Module in self.HashSkipModules: - if GlobalData.gBinCacheDest: - Module.CopyModuleToCache() + Module.CopyModuleToCache() all_mod_set.add(Module) for Module in all_mod_set: for lib in Module.LibraryAutoGenList: all_lib_set.add(lib) for lib in all_lib_set: - if GlobalData.gBinCacheDest: - lib.CopyModuleToCache() + lib.CopyModuleToCache() all_lib_set.clear() all_mod_set.clear() - self.BuildModules = [] self.HashSkipModules = [] ## Do some clean-up works when error occurred def Relinquish(self):