BaseTools: back up the binary files when hash value is same

V2: change to use InfBuildData but not ModuleAutoGen

We meet the case that first build with --hash option, then build it
again with --hash and --binary-destination option, since the hash value
is same, tool will not build the driver again, it cause the binary
files are not backed up.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Yonghong Zhu 2017-12-12 15:18:22 +08:00
parent 5381ff6342
commit 83397f95f9
2 changed files with 16 additions and 2 deletions

View File

@ -3838,7 +3838,13 @@ class ModuleAutoGen(AutoGen):
## Create AsBuilt INF file the module ## Create AsBuilt INF file the module
# #
def CreateAsBuiltInf(self): def CreateAsBuiltInf(self, IsOnlyCopy = False):
self.OutputFile = []
if IsOnlyCopy:
if GlobalData.gBinCacheDest:
self.CopyModuleToCache()
return
if self.IsAsBuiltInfCreated: if self.IsAsBuiltInfCreated:
return return
@ -3971,7 +3977,6 @@ class ModuleAutoGen(AutoGen):
AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']] AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]
OutputDir = self.OutputDir.replace('\\', '/').strip('/') OutputDir = self.OutputDir.replace('\\', '/').strip('/')
self.OutputFile = []
for Item in self.CodaTargetList: for Item in self.CodaTargetList:
File = Item.Target.Path.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/') File = Item.Target.Path.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')
if File not in self.OutputFile: if File not in self.OutputFile:
@ -4198,8 +4203,12 @@ class ModuleAutoGen(AutoGen):
shutil.copy2(HashFile, FileDir) shutil.copy2(HashFile, FileDir)
if os.path.exists(ModuleFile): if os.path.exists(ModuleFile):
shutil.copy2(ModuleFile, FileDir) shutil.copy2(ModuleFile, FileDir)
if not self.OutputFile:
Ma = self.Workspace.BuildDatabase[PathClass(ModuleFile), self.Arch, self.BuildTarget, self.ToolChain]
self.OutputFile = Ma.Binaries
if self.OutputFile: if self.OutputFile:
for File in self.OutputFile: for File in self.OutputFile:
File = str(File)
if not os.path.isabs(File): if not os.path.isabs(File):
File = os.path.join(self.OutputDir, File) File = os.path.join(self.OutputDir, File)
if os.path.exists(File): if os.path.exists(File):

View File

@ -825,6 +825,7 @@ class Build():
self.LoadFixAddress = 0 self.LoadFixAddress = 0
self.UniFlag = BuildOptions.Flag self.UniFlag = BuildOptions.Flag
self.BuildModules = [] self.BuildModules = []
self.HashSkipModules = []
self.Db_Flag = False self.Db_Flag = False
self.LaunchPrebuildFlag = False self.LaunchPrebuildFlag = False
self.PlatformBuildPath = os.path.join(GlobalData.gConfDirectory,'.cache', '.PlatformBuild') self.PlatformBuildPath = os.path.join(GlobalData.gConfDirectory,'.cache', '.PlatformBuild')
@ -2016,6 +2017,7 @@ class Build():
if Ma == None: if Ma == None:
continue continue
if Ma.CanSkipbyHash(): if Ma.CanSkipbyHash():
self.HashSkipModules.append(Ma)
continue continue
# Not to auto-gen for targets 'clean', 'cleanlib', 'cleanall', 'run', 'fds' # Not to auto-gen for targets 'clean', 'cleanlib', 'cleanall', 'run', 'fds'
@ -2214,7 +2216,10 @@ class Build():
def CreateAsBuiltInf(self): def CreateAsBuiltInf(self):
for Module in self.BuildModules: for Module in self.BuildModules:
Module.CreateAsBuiltInf() Module.CreateAsBuiltInf()
for Module in self.HashSkipModules:
Module.CreateAsBuiltInf(True)
self.BuildModules = [] self.BuildModules = []
self.HashSkipModules = []
## Do some clean-up works when error occurred ## Do some clean-up works when error occurred
def Relinquish(self): def Relinquish(self):
OldLogLevel = EdkLogger.GetLevel() OldLogLevel = EdkLogger.GetLevel()