From 975d2bad6c5d4aebed822038e450f864b9ac3c80 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 21 Feb 2024 12:59:44 -0600 Subject: [PATCH 1/5] [tests] introduce test that builds with `MSBuild.exe` Context: https://github.com/dotnet/maui/issues/20752 We think this might catch problems specific to .NET framework going forward. --- .../Xamarin.Android.Build.Tests/BuildTest2.cs | 15 +++++++++++++++ .../Tests/Xamarin.ProjectTools/Common/Builder.cs | 14 ++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index e3050b3fb88..96b59eec7eb 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -96,6 +96,21 @@ public void BuildBasicApplication ([Values (true, false)] bool isRelease, [Value } } + [Test] + public void BuildWithMSBuildExe ([Values (true, false)] bool isRelease) + { + if (!IsWindows) + Assert.Ignore ("Test is only valid on Windows"); + + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; + + using var b = CreateApkBuilder (); + b.UseMSBuildExe = true; + Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + } + [Test] public void BuildBasicApplicationThenMoveIt ([Values (true, false)] bool isRelease) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index c583e2b6192..a2f3cc33bb0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Xml.XPath; using System.Xml.Linq; +using Xamarin.Android.Tools.VSWhere; namespace Xamarin.ProjectTools { @@ -142,6 +143,8 @@ public Builder () BuildLogFile = "build.log"; } + public bool UseMSBuildExe { get; set; } + public void Dispose () { Dispose (true); @@ -173,9 +176,16 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] var start = DateTime.UtcNow; var args = new StringBuilder (); - var psi = new ProcessStartInfo (Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet")); + var psi = new ProcessStartInfo (); var responseFile = Path.Combine (XABuildPaths.TestOutputDirectory, Path.GetDirectoryName (projectOrSolution), "project.rsp"); - args.Append ("build "); + if (UseMSBuildExe) { + psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; + args.Append ("/restore "); + psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH")); + } else { + psi.FileName = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet"); + args.Append ("build "); + } if (TestEnvironment.UseLocalBuildOutput) { psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_MANIFEST_ROOTS", TestEnvironment.WorkloadManifestOverridePath); From 80ed22a6ac0f7e726343c5b6306b3d8bcacad556 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 22 Feb 2024 12:31:28 -0600 Subject: [PATCH 2/5] Set %MSBUILDLOGALLENVIRONMENTVARIABLES% --- .../Tests/Xamarin.ProjectTools/Common/Builder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index a2f3cc33bb0..a5d4498b85f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -181,6 +181,7 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] if (UseMSBuildExe) { psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; args.Append ("/restore "); + psi.SetEnvironmentVariable ("MSBUILDLOGALLENVIRONMENTVARIABLES", "1"); psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH")); } else { psi.FileName = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet"); From dd55eb0a8aadf3e1a86fc53bc22e4a36a8e2053b Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 23 Feb 2024 08:44:55 -0600 Subject: [PATCH 3/5] Set %MSBuildSDKsPath% --- .../Tests/Xamarin.ProjectTools/Common/Builder.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index a5d4498b85f..839134c0584 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -143,8 +143,22 @@ public Builder () BuildLogFile = "build.log"; } + /// + /// Build with MSBuild.exe from Visual Studio, only works on Windows + /// public bool UseMSBuildExe { get; set; } + /// + /// Value for %MSBuildSdksPath%, points to bin\Release\dotnet\sdk\*\Sdks + /// + public string MSBuildSdksPath { + get { + var sdk = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "sdk"); + var sdk_version = Directory.EnumerateDirectories (sdk).OrderByDescending (x => x).First (); + return Path.Combine (sdk_version, "Sdks"); + } + } + public void Dispose () { Dispose (true); @@ -182,6 +196,7 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; args.Append ("/restore "); psi.SetEnvironmentVariable ("MSBUILDLOGALLENVIRONMENTVARIABLES", "1"); + psi.SetEnvironmentVariable ("MSBuildSDKsPath", MSBuildSdksPath); psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH")); } else { psi.FileName = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet"); From e7a3cacde6d60d2d2b89fd264bf99c54da077ed4 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 23 Feb 2024 12:45:44 -0600 Subject: [PATCH 4/5] %DOTNETSDK_WORKLOAD_PACK_ROOTS% --- .../Tests/Xamarin.ProjectTools/Common/Builder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index 839134c0584..82c12c14365 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -195,6 +195,7 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] if (UseMSBuildExe) { psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; args.Append ("/restore "); + psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_PACK_ROOTS", Path.Combine (TestEnvironment.DotNetPreviewDirectory, "packs")); psi.SetEnvironmentVariable ("MSBUILDLOGALLENVIRONMENTVARIABLES", "1"); psi.SetEnvironmentVariable ("MSBuildSDKsPath", MSBuildSdksPath); psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH")); From 4bd3b3cad6fce3d36dda6fd139bd037f219a1c7b Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 23 Feb 2024 12:46:00 -0600 Subject: [PATCH 5/5] %DOTNETSDK_WORKLOAD_MANIFEST_ROOTS% --- .../Tests/Xamarin.ProjectTools/Common/Builder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index 82c12c14365..02952895b87 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -196,6 +196,7 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; args.Append ("/restore "); psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_PACK_ROOTS", Path.Combine (TestEnvironment.DotNetPreviewDirectory, "packs")); + psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_MANIFEST_ROOTS", Path.Combine (TestEnvironment.DotNetPreviewDirectory, "sdk-manifests")); psi.SetEnvironmentVariable ("MSBUILDLOGALLENVIRONMENTVARIABLES", "1"); psi.SetEnvironmentVariable ("MSBuildSDKsPath", MSBuildSdksPath); psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH"));