diff --git a/external/xamarin-android-tools b/external/xamarin-android-tools index 9f02d77692b..47f95ab99f6 160000 --- a/external/xamarin-android-tools +++ b/external/xamarin-android-tools @@ -1 +1 @@ -Subproject commit 9f02d77692bca8c6585941de03750d5eaaca5c5a +Subproject commit 47f95ab99f6201d956eecfa1c7b2fd5fa7e43946 diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidDotnetToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidDotnetToolTask.cs index efa01c48478..8f26c94f85c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidDotnetToolTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidDotnetToolTask.cs @@ -105,7 +105,7 @@ string FindDotnet () string FindMono () { - string mono = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal (MonoKey, Lifetime); + string mono = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal (MonoKey, Lifetime, flags: RegisterTaskObjectKeyFlags.None); if (!string.IsNullOrEmpty (mono)) { Log.LogDebugMessage ($"Found cached mono via {nameof (BuildEngine4.RegisterTaskObject)}"); return mono; @@ -116,7 +116,7 @@ string FindMono () foreach (var path in env.Split (Path.PathSeparator)) { if (File.Exists (mono = Path.Combine (path, "mono"))) { Log.LogDebugMessage ("Found mono in $PATH"); - BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono, Lifetime); + BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono, Lifetime, flags: RegisterTaskObjectKeyFlags.None); return mono; } } @@ -125,13 +125,13 @@ string FindMono () foreach (var path in KnownMonoPaths) { if (File.Exists (mono = path)) { Log.LogDebugMessage ($"Found mono in {nameof (KnownMonoPaths)}"); - BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono, Lifetime); + BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono, Lifetime, flags: RegisterTaskObjectKeyFlags.None); return mono; } } // Last resort - BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono = "mono", Lifetime); + BuildEngine4.RegisterTaskObjectAssemblyLocal (MonoKey, mono = "mono", Lifetime, flags: RegisterTaskObjectKeyFlags.None); return mono; } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs index 24fe06606b7..1c16ce4feb2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs @@ -247,6 +247,30 @@ public void AllProjectsHaveSameOutputDirectory() sb.Dispose (); } + [Test] + public void BuildSolutionWithMultipleProjectsInParallel () + { + var testPath = Path.Combine ("temp", "BuildSolutionWithMultipleProjects"); + var sb = new SolutionBuilder("BuildSolutionWithMultipleProjects.sln") { + SolutionPath = Path.Combine (Root, testPath), + MaxCpuCount = 4, + }; + for (int i=1; i <= 4; i++) { + var app1 = new XamarinAndroidApplicationProject () { + ProjectName = $"App{i}", + PackageName = $"com.companyname.App{i}", + AotAssemblies = true, + IsRelease = true, + }; + app1.SetProperty ("AndroidEnableMarshalMethods", "True"); + sb.Projects.Add (app1); + } + sb.BuildingInsideVisualStudio = false; + Assert.IsTrue (sb.Build (), "Build of solution should have succeeded"); + Assert.IsTrue (sb.ReBuild (), "ReBuild of solution should have succeeded"); + sb.Dispose (); + } + [Test] public void JavacTaskDoesNotRunOnSecondBuild () { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs index 8ee83fc9876..dd2386b5d0e 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs @@ -105,7 +105,7 @@ public void Aapt2DaemonInstances (int maxInstances, int expectedMax, int expecte DaemonKeepInDomain = false, }; Assert.True (task.Execute (), $"task should have succeeded. {string.Join (";", errors.Select (x => x.Message))}"); - var daemon = engine.GetRegisteredTaskObjectAssemblyLocal (Aapt2Daemon.RegisterTaskObjectKey, RegisteredTaskObjectLifetime.Build); + var daemon = engine.GetRegisteredTaskObjectAssemblyLocal (Aapt2Daemon.RegisterTaskObjectKey, RegisteredTaskObjectLifetime.Build, flags: RegisterTaskObjectKeyFlags.None); Assert.IsNotNull (daemon, "Should have got a Daemon"); Assert.AreEqual (expectedMax, daemon.MaxInstances, $"Expected {expectedMax} but was {daemon.MaxInstances}"); Assert.AreEqual (expectedInstances, daemon.CurrentInstances, $"Expected {expectedInstances} but was {daemon.CurrentInstances}"); diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs b/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs index ec6aa25a035..db31d2b2252 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs @@ -22,11 +22,11 @@ internal class Aapt2Daemon : IDisposable public static Aapt2Daemon GetInstance (IBuildEngine4 engine, string aapt2, int numberOfInstances, int initalNumberOfDaemons, bool registerInDomain = false) { var area = registerInDomain ? RegisteredTaskObjectLifetime.AppDomain : RegisteredTaskObjectLifetime.Build; - var daemon = engine.GetRegisteredTaskObjectAssemblyLocal (RegisterTaskObjectKey, area); + var daemon = engine.GetRegisteredTaskObjectAssemblyLocal (RegisterTaskObjectKey, area, flags: RegisterTaskObjectKeyFlags.None); if (daemon == null) { daemon = new Aapt2Daemon (aapt2, numberOfInstances, initalNumberOfDaemons); - engine.RegisterTaskObjectAssemblyLocal (RegisterTaskObjectKey, daemon, area, allowEarlyCollection: false); + engine.RegisterTaskObjectAssemblyLocal (RegisterTaskObjectKey, daemon, area, allowEarlyCollection: false, flags: RegisterTaskObjectKeyFlags.None); } return daemon; }