From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.43, mailfrom: zhijux.fan@intel.com) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by groups.io with SMTP; Sun, 28 Jul 2019 23:03:42 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jul 2019 23:03:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,321,1559545200"; d="dat'59?scan'59,208,59";a="162076817" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga007.jf.intel.com with ESMTP; 28 Jul 2019 23:03:41 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 28 Jul 2019 23:03:41 -0700 Received: from shsmsx107.ccr.corp.intel.com (10.239.4.96) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 28 Jul 2019 23:03:40 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.80]) by SHSMSX107.ccr.corp.intel.com ([169.254.9.65]) with mapi id 14.03.0439.000; Mon, 29 Jul 2019 14:03:38 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" , "Shi, Steven" Subject: [PATCH 2/2] BaseTools:Build cache generate the offset file for hii/vfr module Thread-Topic: [PATCH 2/2] BaseTools:Build cache generate the offset file for hii/vfr module Thread-Index: AdVF01ueXoPKSQbkS8i/cPDQCfU5NA== Date: Mon, 29 Jul 2019 06:03:37 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 44478 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54D2SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54D2SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1958 Current build cache cannot generate the offset file for hii/vfr module Reproduce steps on OVMF: 1. Generate the build cache and save the build folder as Build1: $ source edksetup.sh $ build -p OvmfPkg/OvmfPkgIa32X64.dsc -a IA32 -a X64 -t GCC5 -b NOOPT --hash --binary-destination=3DBinCache $ mv Build/ Build1 2. Consume the build cache and save the build folder as Build2: $ build -p OvmfPkg/OvmfPkgIa32X64.dsc -a IA32 -a X64 -t GCC5 -b NOOPT --hash --binary-source=3DBinCache $ mv Build Build2 Compare the hii/vfr module ffs folder, e.g. UiApp as below, in the Build1 and Build2, you will find the *.offset, *.raw, *.raw.txt, *.map files are missing. This Patch is going to add these content to Cache Cc: Bob Feng Cc: Liming Gao Cc: Steven Shi Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 38 ++++++++++++++++++++= ++-- BaseTools/Source/Python/build/build.py | 9 +++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/S= ource/Python/AutoGen/ModuleAutoGen.py index 4bb72eb10d..d9baad9c62 100644 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -1244,6 +1244,19 @@ class ModuleAutoGen(AutoGen): fStringIO.close () fInputfile.close () return OutputName + + @cached_property + def OutputFfsFile(self): + retVal =3D set() + FfsOutputDir =3D self.FfsOutputDir.replace('\\', '/').rstrip('/') + for Root, Dirs, Files in os.walk(FfsOutputDir): + for File in Files: + if File.lower().endswith('.ffs') or File.lower().endswith(= '.offset') or File.lower().endswith('.raw') \ + or File.lower().endswith('.raw.txt') or File.lower= ().endswith('.map'): + retVal.add(File) + + return retVal + @cached_property def OutputFile(self): retVal =3D set() @@ -1267,7 +1280,8 @@ class ModuleAutoGen(AutoGen): =20 for Root, Dirs, Files in os.walk(FfsOutputDir): for File in Files: - if File.lower().endswith('.ffs'): + if File.lower().endswith('.ffs') or File.lower().endswith(= '.offset') or File.lower().endswith('.raw') \ + or File.lower().endswith('.raw.txt') or File.lower= ().endswith('.map'): retVal.add(File) =20 return retVal @@ -1607,6 +1621,23 @@ class ModuleAutoGen(AutoGen): CreateDirectory(destination_dir) CopyFileOnChange(File, destination_dir) =20 + def CopyFfsToCache(self): + FfsDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.O= utputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs",= self.Guid + self.Name) + for File in self.OutputFfsFile: + File =3D str(File) + if not os.path.isabs(File): + FfsFile =3D os.path.join(FfsDir, File) + NewFile =3D os.path.join(self.FfsOutputDir, File) + File =3D NewFile + else: + sub_dir =3D os.path.relpath(File, self.FfsOutputDir) + destination_file =3D os.path.join(FfsDir, sub_dir) + FfsFile =3D os.path.dirname(destination_file) + if os.path.exists(File) and not os.path.exists(FfsFile): + if File.lower().endswith('.ffs') or File.lower().endswith(= '.offset') or File.lower().endswith('.raw') \ + or File.lower().endswith('.raw.txt') or File.lower= ().endswith('.map'): + self.CacheCopyFile(FfsDir, self.FfsOutputDir, File) + def CopyModuleToCache(self): FileDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.= Name, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceDir, s= elf.MetaFile.BaseName) FfsDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.O= utputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs",= self.Guid + self.Name) @@ -1628,7 +1659,8 @@ class ModuleAutoGen(AutoGen): NewFile =3D os.path.join(self.FfsOutputDir, File) File =3D NewFile if os.path.exists(File): - if File.endswith('.ffs'): + if File.lower().endswith('.ffs') or File.lower().endswith(= '.offset') or File.lower().endswith('.raw') \ + or File.lower().endswith('.raw.txt') or File.lower= ().endswith('.map'): self.CacheCopyFile(FfsDir, self.FfsOutputDir, File) else: self.CacheCopyFile(FileDir, self.OutputDir, File) @@ -1658,7 +1690,7 @@ class ModuleAutoGen(AutoGen): else: File =3D path.join(root, f) self.CacheCopyFile(self.OutputDir, FileDir= , File) - if GlobalData.gEnableGenfdsMultiThread and os.path.exi= sts(FfsDir): + if os.path.exists(FfsDir): for root, dir, files in os.walk(FfsDir): for f in files: File =3D path.join(root, f) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Pyth= on/build/build.py index dc92495f3f..153c77aec8 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -2084,7 +2084,6 @@ class Build(): BuildTask.WaitForComplete() if GlobalData.gBinCacheDest: self.UpdateBuildCache() - self.BuildModules =3D [] self.MakeTime +=3D int(round((time.time() - MakeContiue))) # # Check for build error, and raise exception if one @@ -2136,6 +2135,9 @@ class Build(): # Save MAP buffer into MAP file. # self._SaveMapFile(MapBuffer, Wa) + if not GlobalData.gEnableGenfdsMultiThread and GlobalData.= gBinCacheDest: + self.UpdateBuildFfsCache() + self.BuildModules =3D [] self.invalidateHash() =20 ## Generate GuidedSectionTools.txt in the FV directories. @@ -2244,6 +2246,11 @@ class Build(): all_lib_set.clear() all_mod_set.clear() self.HashSkipModules =3D [] + + def UpdateBuildFfsCache(self): + for Module in self.BuildModules: + Module.CopyFfsToCache() + ## Do some clean-up works when error occurred def Relinquish(self): OldLogLevel =3D EdkLogger.GetLevel() --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54D2SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" 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 NDSABpXAlh+Zv5rMKx+hcJivn4+azLniMjA4/jS6YqTj2+Bx10CTuVCQ78OnVkCVc2suV0KA9VDz vqDmgG1w9bDf0LlXp1+Pgc09mqbffD9VcGTfwf9Aky7Uf/98e0CTcmS/0E/gjFtdrV98ik1hay6g fmkTQEFAT+DDULlAefB1+VjQKCjkMBNAYiC1gblQn7oAclC1QeaAtgBpdSxw97gws2+41SO4b7l2 5nAvANxja8Kzl8MG0HJ58EARvxdCXcAYYMMwGECisHDkcseHk9sQpDoxMzbb0r9RODUsOaXPrU+6 vFNh4nb0YE1BULwhWXBYcO214m/DcxQyLsFfuT/Fb+18mV/DMrUwcH3TyUFAkP/D4jdgqQAUf/jt gf+DD4QU/6vPrN3LH67fQLFEAbAc0R/vsg+zH3y3kGB22sBE0N/B/kg6IFkw5P7GhLtwcwFYcMff wc8ARMFlZFPgIeER/6ITYiL0clkg9GBDEIvS4CP+adZwxQako5wwpZKlUJwwOb+AMTHAP8FP2GBs X/dF0AjQW7Eu3+CD8FiB4M894dFtcnDiP9c+2NJTa/xpcNYvLOjUcy3S0r8vDv/za3Jk9HfV2urP 0VJyZGagX2cSRBAutiyP2jVExGBzB6mA9GDksm4tdXAg6ne8AGvWgHcvANywvJNZYoBjYzigCdBk LR5Sey9AkGBxRMDY8S8/0VNPQUDATG9nTGXDUGyxT9FFZGv30UEQckSgXzmQ+AOwaLDwxuUynLA0 35ywjOCboWMgEoAxxuXG5Qx9fccw/PAAAAAfAEIAAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1 AFgAAAAfAGUAAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAAAB8AZAABAAAACgAAAFMATQBUAFAAAAAAAAIBQQABAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0B D1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYA YQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAfAAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBu AEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgA LgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBo AGkAagB1AFgAAAAfAB8MAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4A YwBvAG0AAAAAAB8AHgwBAAAACgAAAFMATQBUAFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQ GZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUA eAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAu AGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgA aQBqAHUAWAAAAB8AI0ABAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBj AG8AbQAAAAAAHwAiQAEAAAAKAAAAUwBNAFQAUAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZ nW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4 AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4A ZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAu AE4AbwB0AGUAAAAAAAMA8T8JBAAACwBAOgEAAAADAP0/5AQAAAIBCzABAAAAEAAAABhyuk1hz6NJ uj3WTHUH10IDABcAAQAAAEAAOQCAAoZc00XVAUAACDDAz6pc00XVAR8AAICGAwIAAAAAAMAAAAAA AABGAQAAAB4AAABhAGMAYwBlAHAAdABsAGEAbgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0A VQBTAAAAHwA3AAEAAACcAAAAWwBQAEEAVABDAEgAIAAyAC8AMgBdACAAQgBhAHMAZQBUAG8AbwBs AHMAOgBCAHUAaQBsAGQAIABjAGEAYwBoAGUAIABnAGUAbgBlAHIAYQB0AGUAIAB0AGgAZQAgAG8A ZgBmAHMAZQB0ACAAZgBpAGwAZQAgAGYAbwByACAAaABpAGkALwB2AGYAcgAgAG0AbwBkAHUAbABl AAAAHwA9AAEAAAACAAAAAAAAAAMANgAAAAAAAgFxAAEAAAAWAAAAAdVF01ueXoPKSQbkS8i/cPDQ CfU5NAAAHwBwAAEAAACcAAAAWwBQAEEAVABDAEgAIAAyAC8AMgBdACAAQgBhAHMAZQBUAG8AbwBs AHMAOgBCAHUAaQBsAGQAIABjAGEAYwBoAGUAIABnAGUAbgBlAHIAYQB0AGUAIAB0AGgAZQAgAG8A ZgBmAHMAZQB0ACAAZgBpAGwAZQAgAGYAbwByACAAaABpAGkALwB2AGYAcgAgAG0AbwBkAHUAbABl AAAAHwA1EAEAAACQAAAAPABGAEEARAAwAEQANwBFADAAQQBFADAARgBBADUANABEADkAOAA3AEYA NgBFADcAMgA0ADMANQBDAEEARgBEADUAMABBAEYAQQA1ADQARAAyAEAAUwBIAFMATQBTAFgAMQAw ADEALgBjAGMAcgAuAGMAbwByAHAALgBpAG4AdABlAGwALgBjAG8AbQA+AAAAAwDeP59OAABAAAcw wM+qXNNF1QECAQsAAQAAABAAAAAYcrpNYc+jSbo91kx1B9dCAwAmAAAAAAACAUcAAQAAADIAAABj PVVTO2E9TUNJO3A9SW50ZWw7bD1TSFNNU1gxMDEtMTkwNzI5MDYwMzM3Wi0zMDc4AAAAAgEQMAEA AABGAAAAAAAAACZ3vTk77DhJpKYVPcule0IHAPrQ1+CuD6VNmH9uckNcr9UAAABEEV4AAKaTaDaI dmxLp0rT60eaTGQAAAlUj+0AAAAAHwD6PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAA AwAJWQEAAABAAACACCAGAAAAAADAAAAAAAAARgAAAAC/hQAAcF2gW9NF1QELAACACCAGAAAAAADA AAAAAAAARgAAAACChQAAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHAA cgBvAGQAdQBjAHQAAAABAAAAGgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACAhgMC AAAAAADAAAAAAAAARgEAAAAYAAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABYAAAAxADEA LgAwAC4ANgAwADAALgA3AAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAaAAAAZABsAHAALQBy AGUAYQBjAHQAaQBvAG4AAAAAAAEAAAAUAAAAbgBvAC0AYQBjAHQAaQBvAG4AAAADAA00/T8AAB8A AICGAwIAAAAAAMAAAAAAAABGAQAAACAAAAB4AC0AbQBzAC0AaABhAHMALQBhAHQAdABhAGMAaAAA AAEAAAACAAAAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACIAAAB4AC0AbwByAGkAZwBpAG4A YQB0AGkAbgBnAC0AaQBwAAAAAAABAAAAIAAAAFsAMQAwAC4AMgAzADkALgAxADIANwAuADQAMABd AAAAWnA= --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFA54D2SHSMSX101ccrcor_--