From ece70a6c6ec98e45d4701237471096a4f8bd9712 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 27 Apr 2022 08:31:42 +0200 Subject: [PATCH] [msbuild] Copy binding resource files back to Windows. Fixes #13393. (#14702) Fixes https://github.com/xamarin/xamarin-macios/issues/13393. --- .../MSBStrings.Designer.cs | 11 +++++- .../MSBStrings.resx | 4 ++ .../Tasks/CreateBindingResourcePackageBase.cs | 21 ++++++++++- .../Tasks/CreateBindingResourcePackage.cs | 37 +++++++++++++++++-- 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.Designer.cs b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.Designer.cs index d3b2b0920d..417b7313b3 100644 --- a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.Designer.cs +++ b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.Designer.cs @@ -2683,12 +2683,21 @@ namespace Xamarin.Localization.MSBuild { } /// - /// Looks up a localized string similar to Code signing has been requested multiple times for '{0}', with different metadata. The metadata '{1}' has been values for each item (once it's '{2}', another time it's '{3}').. + /// Looks up a localized string similar to Code signing has been requested multiple times for '{0}', with different metadata. The metadata '{1}' has different values for each item (once it's '{2}', another time it's '{3}').. /// public static string W7097 { get { return ResourceManager.GetString("W7097", resourceCulture); } } + + /// + /// Looks up a localized string similar to Could not find the binding resource package: {0}. + /// + public static string W7100 { + get { + return ResourceManager.GetString("W7100", resourceCulture); + } + } } } diff --git a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx index cc19c1d8a2..af51a785ad 100644 --- a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx +++ b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx @@ -1416,6 +1416,10 @@ The UIDeviceFamily value '6' requires macOS 11.0. Please set the 'SupportedOSPlatformVersion' in the project file to at least 14.0 (the Mac Catalyst version equivalent of macOS 11.0). The current value is {0} (equivalent to macOS {1}). + + Could not find the binding resource package: {0} + + Unknown property '{0}' with value '{1}'. diff --git a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/CreateBindingResourcePackageBase.cs b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/CreateBindingResourcePackageBase.cs index d796a3c599..324896664c 100644 --- a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/CreateBindingResourcePackageBase.cs +++ b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/CreateBindingResourcePackageBase.cs @@ -26,6 +26,10 @@ namespace Xamarin.MacDev.Tasks { [Required] public ITaskItem[] NativeReferences { get; set; } + // This is a list of files to copy back to Windows + [Output] + public ITaskItem[] PackagedFiles { get; set; } + public override bool Execute () { // LinkWith must be migrated for NoBindingEmbedding styled binding projects @@ -51,6 +55,7 @@ namespace Xamarin.MacDev.Tasks { var manifestDirectory = compress ? IntermediateOutputPath : BindingResourcePath; var manifestPath = CreateManifest (manifestDirectory); + var packagedFiles = new List (); if (compress) { var zipFile = Path.GetFullPath (BindingResourcePath + ".zip"); @@ -73,15 +78,29 @@ namespace Xamarin.MacDev.Tasks { var workingDirectory = Path.GetDirectoryName (fullPath); zipArguments.Add (Path.GetFileName (fullPath)); ExecuteAsync ("zip", zipArguments, workingDirectory: workingDirectory).Wait (); + + packagedFiles.Add (zipFile); } } else { var bindingResourcePath = BindingResourcePath; Log.LogMessage (MSBStrings.M0121, bindingResourcePath); Directory.CreateDirectory (bindingResourcePath); - foreach (var nativeRef in NativeReferences) + foreach (var nativeRef in NativeReferences) { Xamarin.Bundler.FileCopier.UpdateDirectory (nativeRef.ItemSpec, bindingResourcePath, FileCopierReportErrorCallback, FileCopierLogCallback); + + var bindingOutputPath = Path.Combine (bindingResourcePath, Path.GetFileName (nativeRef.ItemSpec)); + if (Directory.Exists (bindingOutputPath)) { + packagedFiles.AddRange (Directory.GetFiles (bindingOutputPath, "*", SearchOption.AllDirectories)); + } else if (File.Exists (bindingOutputPath)) { + packagedFiles.Add (bindingOutputPath); + } else { + Log.LogWarning (MSBStrings.W7100, bindingOutputPath); + } + } } + PackagedFiles = packagedFiles.Select (v => new TaskItem (v)).ToArray (); + return !Log.HasLoggedErrors; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateBindingResourcePackage.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateBindingResourcePackage.cs index 8654da2b4a..e113b524f3 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateBindingResourcePackage.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateBindingResourcePackage.cs @@ -13,10 +13,18 @@ namespace Xamarin.MacDev.Tasks { public override bool Execute () { - if (ShouldExecuteRemotely ()) - return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; + if (!ShouldExecuteRemotely ()) + return base.Execute (); - return base.Execute (); + var taskRunner = new TaskRunner (SessionId, BuildEngine4); + + var success = taskRunner.RunAsync (this).Result; + + if (success) { + TransferBindingResourcePackagesToWindowsAsync (taskRunner).Wait (); + } + + return success; } public IEnumerable GetAdditionalItemsToBeCopied () @@ -48,5 +56,28 @@ namespace Xamarin.MacDev.Tasks .Select (x => new TaskItem (x))) yield return file; } + + async System.Threading.Tasks.Task TransferBindingResourcePackagesToWindowsAsync (TaskRunner taskRunner) + { + if (PackagedFiles is not null) { + foreach (var package in PackagedFiles) { + var localRelativePath = GetLocalRelativePath (package.ItemSpec); + await taskRunner.GetFileAsync (localRelativePath).ConfigureAwait (continueOnCapturedContext: false); + } + } + } + + string GetLocalRelativePath (string path) + { + // convert mac full path in windows relative path + // must remove \users\{user}\Library\Caches\Xamarin\mtbs\builds\{appname}\{sessionid}\ + if (path.Contains (SessionId)) { + var start = path.IndexOf (SessionId) + SessionId.Length + 1; + + return path.Substring (start); + } else { + return path; + } + } } }