From: "Steven Shi" <steven.shi@intel.com>
To: "Feng, Bob C" <bob.c.feng@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Gao, Liming" <liming.gao@intel.com>,
"Rodriguez, Christian" <christian.rodriguez@intel.com>
Subject: Re: [Patch 2/2] BaseTools: Move Build Cache related function out of CreateAsBuiltInf
Date: Mon, 24 Jun 2019 07:19:31 +0000 [thread overview]
Message-ID: <06C8AB66E78EE34A949939824ABE2B314002D20F@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <20190624015144.31904-1-bob.c.feng@intel.com>
Reviewed-by: Steven Shi <steven.shi@intel.com>
> -----Original Message-----
> From: Feng, Bob C
> Sent: Monday, June 24, 2019 9:52 AM
> To: devel@edk2.groups.io
> Cc: Feng, Bob C <bob.c.feng@intel.com>; Shi, Steven <steven.shi@intel.com>;
> Gao, Liming <liming.gao@intel.com>; Rodriguez, Christian
> <christian.rodriguez@intel.com>
> Subject: [Patch 2/2] BaseTools: Move Build Cache related function out of
> CreateAsBuiltInf
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1932
> There are two functions in current CreateAsBuiltInf, Copy Binary files
> to build cache folder and create asbuild inf file.
>
> This patch is to separate UpdateBuildCache and CreateAsBuiltInf into
> two functions.
>
> Signed-off-by: Bob Feng <bob.c.feng@intel.com>
> Cc: Steven Shi <steven.shi@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Christian Rodriguez <christian.rodriguez@intel.com>
> ---
> BaseTools/Source/Python/AutoGen/AutoGen.py | 68
> +++++++++++++++++++++++++++++++++++++-------------------------------
> BaseTools/Source/Python/build/build.py | 28 ++++++++++++++++++++++----
> --
> 2 files changed, 59 insertions(+), 37 deletions(-)
>
> diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
> b/BaseTools/Source/Python/AutoGen/AutoGen.py
> index 45b81ed660..e8e09dc8a3 100644
> --- a/BaseTools/Source/Python/AutoGen/AutoGen.py
> +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
> @@ -3577,23 +3577,41 @@ class ModuleAutoGen(AutoGen):
>
> fStringIO.close ()
> 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
> if not self.SourceFileList:
> return
> @@ -3710,11 +3728,10 @@ class ModuleAutoGen(AutoGen):
>
> 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)
> if os.path.isabs(File):
> File = File.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')
> if Item.Target.Ext.lower() == '.aml':
> AsBuiltInfDict['binary_item'].append('ASL|' + File)
> elif Item.Target.Ext.lower() == '.acpi':
> @@ -3726,28 +3743,25 @@ class ModuleAutoGen(AutoGen):
> if not self.DepexGenerated:
> DepexFile = os.path.join(self.OutputDir, self.Name + '.depex')
> 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]:
> AsBuiltInfDict['binary_item'].append('DXE_DEPEX|' + self.Name +
> '.depex')
> elif self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]:
> AsBuiltInfDict['binary_item'].append('SMM_DEPEX|' + self.Name +
> '.depex')
>
> 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)):
> if HeaderComments[Index].find('@BinaryHeader') != -1:
> HeaderComments[Index] =
> HeaderComments[Index].replace('@BinaryHeader', '@file')
> @@ -3912,43 +3926,35 @@ class ModuleAutoGen(AutoGen):
> AsBuiltInf.Append(gAsBuiltInfHeaderString.Replace(AsBuiltInfDict))
>
> 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)
> CreateDirectory (FileDir)
> 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
> if self.IsBinaryModule:
> return False
> diff --git a/BaseTools/Source/Python/build/build.py
> b/BaseTools/Source/Python/build/build.py
> index 3ece4d4c61..8c3315619a 100644
> --- a/BaseTools/Source/Python/build/build.py
> +++ b/BaseTools/Source/Python/build/build.py
> @@ -1248,10 +1248,13 @@ class Build():
> # build modules
> if BuildModule:
> BuildCommand = BuildCommand + [Target]
> LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)
> self.CreateAsBuiltInf()
> + if GlobalData.gBinCacheDest:
> + self.UpdateBuildCache()
> + self.BuildModules = []
> return True
>
> # build library
> if Target == 'libraries':
> for Lib in AutoGenObject.LibraryBuildDirectoryList:
> @@ -1266,10 +1269,13 @@ class Build():
> LaunchCommand(NewBuildCommand, AutoGenObject.MakeFileDir)
> for Mod in AutoGenObject.ModuleBuildDirectoryList:
> 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
> if Target == 'cleanlib':
> for Lib in AutoGenObject.LibraryBuildDirectoryList:
> @@ -1359,10 +1365,13 @@ class Build():
> if BuildModule:
> if Target != 'fds':
> BuildCommand = BuildCommand + [Target]
> AutoGenObject.BuildTime = LaunchCommand(BuildCommand,
> AutoGenObject.MakeFileDir)
> self.CreateAsBuiltInf()
> + if GlobalData.gBinCacheDest:
> + self.UpdateBuildCache()
> + self.BuildModules = []
> return True
>
> # genfds
> if Target == 'fds':
> if GenFdsApi(AutoGenObject.GenFdsCommandDict, self.Db):
> @@ -1872,10 +1881,13 @@ class Build():
>
> MakeContiue = time.time()
> 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()
> EdkLogger.error("build", BUILD_ERROR, "Failed to build module",
> ExtraData=GlobalData.gBuildingModule)
>
> @@ -2072,10 +2084,13 @@ class Build():
> # to exit if all tasks are completed
> #
> 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
> # has been signaled.
> #
> @@ -2211,28 +2226,29 @@ class Build():
>
> if self.Target == 'cleanall':
> 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):
> OldLogLevel = EdkLogger.GetLevel()
> EdkLogger.SetLevel(EdkLogger.ERROR)
> --
> 2.20.1.windows.1
prev parent reply other threads:[~2019-06-24 7:20 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-24 1:51 [Patch 2/2] BaseTools: Move Build Cache related function out of CreateAsBuiltInf Bob Feng
2019-06-24 7:19 ` Steven Shi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=06C8AB66E78EE34A949939824ABE2B314002D20F@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox