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.120, mailfrom: zhijux.fan@intel.com) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by groups.io with SMTP; Mon, 22 Jul 2019 17:34:19 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jul 2019 17:34:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,297,1559545200"; d="dat'59?scan'59,208,59";a="344580462" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga005.jf.intel.com with ESMTP; 22 Jul 2019 17:34:18 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 22 Jul 2019 17:34:18 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 22 Jul 2019 17:34:17 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.134]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.109]) with mapi id 14.03.0439.000; Tue, 23 Jul 2019 08:34:16 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" , "Shi, Steven" Subject: [PATCH] BaseTools:Fix GenFds multi-thread build fails if enable build cache Thread-Topic: [PATCH] BaseTools:Fix GenFds multi-thread build fails if enable build cache Thread-Index: AdVA7ln/XVsi0fyUS2isD4kcsRpXbQ== Date: Tue, 23 Jul 2019 00:34:15 +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: 44182 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF9634ASHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF9634ASHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1923 The GenFds multi-thread will build fail if enable the build cache. 1. First, produce the build cache: edk2>build -p OvmfPkg\OvmfPkgIa32X64.dsc -a IA32 -a X64 -t VS2015x86 -n 5 --genfds-multi-thread --hash --binary-destination=3DBinCache 2. Remove the build folder: edk2>rmdir Build /s /q 3. Clean build with build cache and GenFds multi-thread enabled together: edk2>build -p OvmfPkg\OvmfPkgIa32X64.dsc -a IA32 -a X64 -t VS2015x86 -n 5 --genfds-multi-thread --hash --binary-source=3DBinCache If disable GenFds multi-thread, the build cache can work well This patch is going to fix that issue. Cc: Bob Feng Cc: Liming Gao Cc: Shi, Steven Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/AutoGen/AutoGen.py | 41 ++++++++++++++++++++++----= ---- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/= Python/AutoGen/AutoGen.py index e8e09dc8a3..77eca79fc2 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -3584,6 +3584,7 @@ class ModuleAutoGen(AutoGen): retVal =3D set() OutputDir =3D self.OutputDir.replace('\\', '/').strip('/') DebugDir =3D self.DebugDir.replace('\\', '/').strip('/') + FfsOutputDir =3D self.FfsOutputDir.replace('\\', '/').rstrip('/') for Item in self.CodaTargetList: File =3D Item.Target.Path.replace('\\', '/').strip('/').replac= e(DebugDir, '').replace(OutputDir, '').strip('/') retVal.add(File) @@ -3599,6 +3600,11 @@ class ModuleAutoGen(AutoGen): if File.lower().endswith('.pdb'): retVal.add(File) =20 + for Root, Dirs, Files in os.walk(FfsOutputDir): + for File in Files: + if File.lower().endswith('.ffs'): + retVal.add(File) + return retVal =20 ## Create AsBuilt INF file the module @@ -3929,8 +3935,16 @@ class ModuleAutoGen(AutoGen): =20 self.IsAsBuiltInfCreated =3D True =20 + def CacheCopyFile(self, OriginDir, CopyDir, File): + sub_dir =3D os.path.relpath(File, CopyDir) + destination_file =3D os.path.join(OriginDir, sub_dir) + destination_dir =3D os.path.dirname(destination_file) + CreateDirectory(destination_dir) + CopyFileOnChange(File, destination_dir) + def CopyModuleToCache(self): FileDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.= OutputDir, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.SourceD= ir, self.MetaFile.BaseName) + FfsDir =3D path.join(GlobalData.gBinCacheDest, self.PlatformInfo.O= utputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs",= self.Guid + self.Name) CreateDirectory (FileDir) HashFile =3D path.join(self.BuildDir, self.Name + '.hash') if os.path.exists(HashFile): @@ -3946,13 +3960,15 @@ class ModuleAutoGen(AutoGen): for File in self.OutputFile: File =3D str(File) if not os.path.isabs(File): - File =3D os.path.join(self.OutputDir, File) + NewFile =3D os.path.join(self.OutputDir, File) + if not os.path.exists(NewFile): + NewFile =3D os.path.join(self.FfsOutputDir, File) + File =3D NewFile if os.path.exists(File): - sub_dir =3D os.path.relpath(File, self.OutputDir) - destination_file =3D os.path.join(FileDir, sub_dir) - destination_dir =3D os.path.dirname(destination_file) - CreateDirectory(destination_dir) - CopyFileOnChange(File, destination_dir) + if File.endswith('.ffs'): + self.CacheCopyFile(FfsDir, self.FfsOutputDir, File) + else: + self.CacheCopyFile(FileDir, self.OutputDir, File) =20 def AttemptModuleCacheCopy(self): # If library or Module is binary do not skip by hash @@ -3963,6 +3979,7 @@ class ModuleAutoGen(AutoGen): if '.inc' in str(f_ext): return False FileDir =3D path.join(GlobalData.gBinCacheSource, self.PlatformInf= o.OutputDir, self.BuildTarget + "_" + self.ToolChain, self.Arch, self.Sourc= eDir, self.MetaFile.BaseName) + FfsDir =3D path.join(GlobalData.gBinCacheSource, self.PlatformInfo= .OutputDir, self.BuildTarget + "_" + self.ToolChain, TAB_FV_DIRECTORY, "Ffs= ", self.Guid + self.Name) HashFile =3D path.join(FileDir, self.Name + '.hash') if os.path.exists(HashFile): f =3D open(HashFile, 'r') @@ -3977,11 +3994,13 @@ class ModuleAutoGen(AutoGen): CopyFileOnChange(HashFile, self.BuildDir) else: File =3D path.join(root, f) - sub_dir =3D os.path.relpath(File, FileDir) - destination_file =3D os.path.join(self.Out= putDir, sub_dir) - destination_dir =3D os.path.dirname(destin= ation_file) - CreateDirectory(destination_dir) - CopyFileOnChange(File, destination_dir) + self.CacheCopyFile(self.OutputDir, FileDir= , File) + if GlobalData.gEnableGenfdsMultiThread and os.path.exi= sts(FfsDir): + for root, dir, files in os.walk(FfsDir): + for f in files: + File =3D path.join(root, f) + self.CacheCopyFile(self.FfsOutputDir, FfsD= ir, File) + if self.Name =3D=3D "PcdPeim" or self.Name =3D=3D "Pcd= Dxe": CreatePcdDatabaseCode(self, TemplateString(), Temp= lateString()) return True --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF9634ASHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+InlIAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAADZDODI3RkNF MkY5NDFBNDc4MjkyNkVDMkM5OEU0MkFCAFEHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBwAXAAAA IgAPAAIAOwEBIIADAA4AAADjBwcAFwAAACIADwACADsBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAEwAAABbUEFUQ0hdIEJhc2VUb29sczpGaXggR2VuRmRzIG11bHRpLXRo cmVhZCBidWlsZCBmYWlscyBpZiBlbmFibGUgYnVpbGQgY2FjaGUAlRoBC4ABACEAAAA2QzgyN0ZD RTJGOTQxQTQ3ODI5MjZFQzJDOThFNDJBQgBRBwEDkAYAjBMAADMAAAACAX8AAQAAAEgAAAA8RkFE MEQ3RTBBRTBGQTU0RDk4N0Y2RTcyNDM1Q0FGRDUwQUY5NjM0QUBTSFNNU1gxMDEuY2NyLmNvcnAu aW50ZWwuY29tPgALAB8OAQAAAAIBCRABAAAAqQkAAKUJAABbGwAATFpGdcPfHh1hAApmYmlkBAAA Y2PAcGcxMjUyAP4DQ/B0ZXh0AfcCpAPjAgAEY2gKwHNldDAg7wdtAoMAUBFNMgqABrQCgJZ9CoAI yDsJYjE5DsC/CcMWcgoyFnECgBViKgmwcwnwBJBhdAWyDlADYHOibwGAIEV4EcFuGDBdBlJ2BJAX tgIQcgDAdH0IUG4aMRAgBcAFoBtkZJogA1IgECIXslx2CJDkd2sLgGQ1HVME8AdADRdwMApxF/Ji a21rBnMBkAAgIEJNX0LgRUdJTn0K/AHxC/ERH7BaOmgCQHBzOsAvL2J1Z3oDEAtgJC50BzBubwWh ZS4BBbBnL3Nob3dfQSJRLmNnaT8N0D3RFnEzXGwLgGUKgSUUlFRoGeBHCfBGZAQgiG11bCLgLXRo CXDuYRxgA/AioCAiUAMQHGH3C3ADIAaQIAnwAaAecBzAPyXxJ7QeUBHAI2AlBTEuCCBGaRHwdCwg cNEDYGR1YyjvOiUFCYAIazI+J7QtcCBPAHZtZlBrZ1xcAS3lSWEzMlg2NAouJmBjLaBhIElBny8A L5IvIS2gBUBWUwHQ4DE1eDg2LaADoB3gmSUULS0YMQVwcy0mmz8yEBHQI8AzYQ3AKKByeT4tAQAf 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 JJSBr3phqBL68n3Bd7Dga5+v/6EvoY08EKOBoyOkr6jfeK//eb+oD60flw+YGTLtMiWaCxd2nyzs ZIg9E6AiUGPgZFBlaW1dcD/RtB/wRHhlInaPkV/s87aSv+NhWMBV8MMQiCC+BVQ8YY9asVnA/fCj gGcoKbq/jilz/0lv+xBUcnVK1oYtkEC9BTIuMTTAkNej0KOAQRB3iVAxvQW9BQx9fb1QwqAAAAAf AEIAAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAGUAAQAAACoAAAB6AGgAaQBqAHUA eAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AZAABAAAACgAAAFMATQBUAFAAAAAA AAIBQQABAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUA WAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAf AAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A 5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBt AAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAB8MAQAAACoAAAB6AGgA aQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AHgwBAAAACgAAAFMATQBU AFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgA aQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBv AG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AI0ABAAAAKgAAAHoAaABp AGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAiQAEAAAAKAAAAUwBNAFQA UAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABp AGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8A bQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAA AAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAuAE4AbwB0AGUAAAAAAAMA8T8JBAAACwBAOgEA AAADAP0/5AQAAAIBCzABAAAAEAAAAGyCf84vlBpHgpJuwsmOQqsDABcAAQAAAEAAOQCAnfla7kDV AUAACDASNTJb7kDVAR8AAICGAwIAAAAAAMAAAAAAAABGAQAAAB4AAABhAGMAYwBlAHAAdABsAGEA bgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0AVQBTAAAAHwA3AAEAAACYAAAAWwBQAEEAVABD AEgAXQAgAEIAYQBzAGUAVABvAG8AbABzADoARgBpAHgAIABHAGUAbgBGAGQAcwAgAG0AdQBsAHQA aQAtAHQAaAByAGUAYQBkACAAYgB1AGkAbABkACAAZgBhAGkAbABzACAAaQBmACAAZQBuAGEAYgBs AGUAIABiAHUAaQBsAGQAIABjAGEAYwBoAGUAAAAfAD0AAQAAAAIAAAAAAAAAAwA2AAAAAAACAXEA AQAAABYAAAAB1UDuWf9dWyLR/JRLaKwPiRyxGldtAAAfAHAAAQAAAJgAAABbAFAAQQBUAEMASABd ACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBGAGkAeAAgAEcAZQBuAEYAZABzACAAbQB1AGwAdABpAC0A dABoAHIAZQBhAGQAIABiAHUAaQBsAGQAIABmAGEAaQBsAHMAIABpAGYAIABlAG4AYQBiAGwAZQAg AGIAdQBpAGwAZAAgAGMAYQBjAGgAZQAAAB8ANRABAAAAkAAAADwARgBBAEQAMABEADcARQAwAEEA RQAwAEYAQQA1ADQARAA5ADgANwBGADYARQA3ADIANAAzADUAQwBBAEYARAA1ADAAQQBGADkANgAz ADQAQQBAAFMASABTAE0AUwBYADEAMAAxAC4AYwBjAHIALgBjAG8AcgBwAC4AaQBuAHQAZQBsAC4A YwBvAG0APgAAAAMA3j+fTgAAQAAHME5yLVvuQNUBAgELAAEAAAAQAAAAbIJ/zi+UGkeCkm7CyY5C qwMAJgAAAAAAAgFHAAEAAAAzAAAAYz1VUzthPU1DSTtwPUludGVsO2w9U0hTTVNYMTAxLTE5MDcy MzAwMzQxNVotMTg0ODMAAAIBEDABAAAARgAAAAAAAAAmd705O+w4SaSmFT3LpXtCBwD60Nfgrg+l TZh/bnJDXK/VAAAARBFeAACmk2g2iHZsS6dK0+tHmkxkAAAJVI/jAAAAAB8A+j8BAAAAGAAAAEYA YQBuACwAIABaAGgAaQBqAHUAWAAAAAMACVkBAAAAQAAAgAggBgAAAAAAwAAAAAAAAEYAAAAAv4UA AJC+AFruQNUBCwAAgAggBgAAAAAAwAAAAAAAAEYAAAAAgoUAAAAAAAAfAACAhgMCAAAAAADAAAAA AAAARgEAAAAYAAAAZABsAHAALQBwAHIAbwBkAHUAYwB0AAAAAQAAABoAAABkAGwAcABlAC0AdwBp AG4AZABvAHcAcwAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AdgBlAHIA cwBpAG8AbgAAAAEAAAAWAAAAMQAxAC4AMAAuADYAMAAwAC4ANwAAAAAAHwAAgIYDAgAAAAAAwAAA AAAAAEYBAAAAGgAAAGQAbABwAC0AcgBlAGEAYwB0AGkAbwBuAAAAAAABAAAAFAAAAG4AbwAtAGEA YwB0AGkAbwBuAAAAAwANNP0/AAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAgAAAAeAAtAG0AcwAt AGgAYQBzAC0AYQB0AHQAYQBjAGgAAAABAAAAAgAAAAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEA AAAiAAAAeAAtAG8AcgBpAGcAaQBuAGEAdABpAG4AZwAtAGkAcAAAAAAAAQAAACAAAABbADEAMAAu ADIAMwA5AC4AMQAyADcALgA0ADAAXQAAAK+U --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF9634ASHSMSX101ccrcor_--