From 91f7618f766a2f19bbfab223db0e6017d5c4bce8 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 30 Jan 2025 15:12:58 +0000 Subject: [PATCH] Try using MSbuild for at least one test --- .../Xamarin.Android.Build.Tests/BuildTest2.cs | 9 ++++-- .../Xamarin.ProjectTools/Common/Builder.cs | 30 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 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 539142c14b8..8de81ff6388 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 @@ -730,8 +730,11 @@ public void FooMethod () {{ } [Test] - public void SwitchBetweenDesignTimeBuild () + public void SwitchBetweenDesignTimeBuild ([Values (false, true)] bool useMSBuild) { + if (useMSBuild && !IsWindows) { + Assert.Ignore ("This test is only relevant when using Windows"); + } var proj = new XamarinAndroidApplicationProject (); proj.AndroidResources.Add (new AndroidItem.AndroidResource ("Resources\\layout\\custom_text.xml") { TextContent = () => @" @@ -767,14 +770,14 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, }); using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { + b.UseMSBuild = useMSBuild; Assert.IsTrue (b.Build (proj), "first *regular* build should have succeeded."); var build_props = b.Output.GetIntermediaryPath ("build.props"); var designtime_build_props = b.Output.GetIntermediaryPath (Path.Combine ("designtime", "build.props")); FileAssert.Exists (build_props, "build.props should exist after a first `Build`."); FileAssert.DoesNotExist (designtime_build_props, "designtime/build.props should *not* exist after a first `Build`."); - b.Target = "Compile"; - Assert.IsTrue (b.Build (proj, parameters: new [] { "DesignTimeBuild=True" }), "first design-time build should have succeeded."); + Assert.IsTrue (b.DesignTimeBuild (proj), "first design-time build should have succeeded."); FileAssert.Exists (build_props, "build.props should exist after a design-time build."); FileAssert.Exists (designtime_build_props, "designtime/build.props should exist after a design-time build."); 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 5ecf6827bd3..b335fa355f6 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; using Xamarin.Android.Tasks; @@ -57,6 +58,19 @@ public IEnumerable LastBuildOutput { /// public bool AutomaticNuGetRestore { get; set; } = true; + public bool UseMSBuild {get; set; } = false; + + /// + /// 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 bool CrossCompilerAvailable (string supportedAbis) { var crossCompilerLookup = new Dictionary { @@ -185,14 +199,26 @@ 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 "); + psi.FileName = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet"); + if (UseMSBuild) { + psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; + } else { + args.Append ("build "); + } if (TestEnvironment.UseLocalBuildOutput) { psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_MANIFEST_ROOTS", TestEnvironment.WorkloadManifestOverridePath); psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_PACK_ROOTS", TestEnvironment.WorkloadPackOverridePath); } + if (UseMSBuild) { + 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")); + } args.AppendFormat ("{0} /t:{1} {2}", QuoteFileName (Path.Combine (XABuildPaths.TestOutputDirectory, projectOrSolution)), target, logger);