diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs index 55d83778b33..9d136cd78f5 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs @@ -423,13 +423,21 @@ bool ValidateApiLevels () if (UseLatestAndroidPlatformSdk) { AndroidApiLevel = GetMaxInstalledApiLevel ().ToString (); - SupportedApiLevel = GetMaxSupportedApiLevel (AndroidApiLevel); + SupportedApiLevel = GetMaxStableApiLevel ().ToString (); int maxInstalled, maxSupported = 0; if (int.TryParse (AndroidApiLevel, out maxInstalled) && int.TryParse (SupportedApiLevel, out maxSupported) && maxInstalled > maxSupported) { Log.LogDebugMessage ($"API Level {AndroidApiLevel} is greater than the maximum supported API level of {SupportedApiLevel}. " + "Support for this API will be added in a future release."); AndroidApiLevel = SupportedApiLevel; } + if (!string.IsNullOrWhiteSpace (TargetFrameworkVersion)) { + var userSelected = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion); + // overwrite using user version only if it is + // above the maxStableApi and a valid apiLevel. + if (userSelected != null && userSelected > maxSupported && userSelected <= maxInstalled) { + SupportedApiLevel = userSelected.ToString (); + } + } TargetFrameworkVersion = GetTargetFrameworkVersionFromApiLevel (); return TargetFrameworkVersion != null; } @@ -461,17 +469,17 @@ bool ValidateApiLevels () int GetMaxInstalledApiLevel () { string platformsDir = Path.Combine (AndroidSdkPath, "platforms"); - var apiLevels = Directory.EnumerateDirectories (platformsDir) + var apiIds = Directory.EnumerateDirectories (platformsDir) .Select (platformDir => Path.GetFileName (platformDir)) .Where (dir => dir.StartsWith ("android-", StringComparison.OrdinalIgnoreCase)) .Select (dir => dir.Substring ("android-".Length)) .Select (apiName => MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (apiName)); int maxApiLevel = int.MinValue; - foreach (var level in apiLevels) { - int v; - if (!int.TryParse (level, NumberStyles.Integer, CultureInfo.InvariantCulture, out v)) + foreach (var id in apiIds) { + int? v = MonoAndroidHelper.SupportedVersions.GetApiLevelFromId (id); + if (!v.HasValue) continue; - maxApiLevel = Math.Max (maxApiLevel, v); + maxApiLevel = Math.Max (maxApiLevel, v.Value); } if (maxApiLevel < 0) Log.LogCodedError ("XA5300", @@ -480,6 +488,11 @@ int GetMaxInstalledApiLevel () return maxApiLevel; } + int GetMaxStableApiLevel () + { + return MonoAndroidHelper.SupportedVersions.MaxStableVersion.ApiLevel; + } + string GetMaxSupportedApiLevel (string apiLevel) { int level = 0; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index dacafbe1b5c..d3f1e739676 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -2228,6 +2228,64 @@ public void IfAndroidJarDoesNotExistThrowXA5207 () Directory.Delete (AndroidSdkDirectory, recursive: true); } + [Test] + public void ValidateUseLatestAndroid () + { + var path = Path.Combine ("temp", TestName); + var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"), + "23.0.6", minApiLevel: 10, maxApiLevel: 28, alphaApiLevel: "P"); + var referencesPath = CreateFauxReferencesDirectory (Path.Combine (path, "xbuild-frameworks"), new ApiInfo [] { + new ApiInfo () { Id = "23", Level = 23, Name = "Marshmallow", FrameworkVersion = "v6.0", Stable = true }, + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true }, + new ApiInfo () { Id = "P", Level = 28, Name = "P", FrameworkVersion="v8.99", Stable = false }, + }); + var proj = new XamarinAndroidApplicationProject () { + IsRelease = true, + TargetFrameworkVersion = "v8.0", + UseLatestPlatformSdk = false, + }; + var parameters = new string [] { + $"TargetFrameworkRootPath={referencesPath}", + $"AndroidSdkDirectory={androidSdkPath}", + }; + var envVar = new Dictionary { + { "XBUILD_FRAMEWORK_FOLDERS_PATH", referencesPath }, + }; + using (var builder = CreateApkBuilder (Path.Combine (path, proj.ProjectName), false, false)) { + builder.ThrowOnBuildFailure = false; + builder.Target = "_SetLatestTargetFrameworkVersion"; + Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar), + string.Format ("First Build should have succeeded")); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.0", 2), "TargetFrameworkVersion should be v8.0"); + + proj.TargetFrameworkVersion = "v8.0"; + Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar), + string.Format ("Second Build should have succeeded")); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.0", 2), "TargetFrameworkVersion should be v8.0"); + + proj.UseLatestPlatformSdk = true; + proj.TargetFrameworkVersion = "v8.1"; + Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar), + string.Format ("Third Build should have succeeded")); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.1", 2), "TargetFrameworkVersion should be v8.1"); + + proj.UseLatestPlatformSdk = true; + proj.TargetFrameworkVersion = "v8.99"; + Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar), + string.Format ("Third Build should have succeeded")); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.99", 2), "TargetFrameworkVersion should be v8.99"); + + proj.UseLatestPlatformSdk = true; + proj.TargetFrameworkVersion = "v6.0"; + Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar), + string.Format ("Forth Build should have succeeded")); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v6.0", 1), "TargetFrameworkVersion should initially be v6.0"); + Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.1", 1), "TargetFrameworkVersion should be v8.1"); + } + Directory.Delete (referencesPath, recursive: true); + } + [Test] [NonParallelizable] public void BuildAMassiveApp() diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/GetDependenciesTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/GetDependenciesTests.cs index 1af4d3ca7d1..91f045bf875 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/GetDependenciesTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/GetDependenciesTests.cs @@ -19,7 +19,7 @@ public void CheckNdkBundle ([Values(true, false)] bool ndkRequred) { var path = Path.Combine ("temp", TestName); var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo [] { - new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, }); MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath }); IBuildEngine engine = new MockBuildEngine (TestContext.Out); @@ -59,7 +59,7 @@ public void ManifestFileDoesNotExist () { var path = Path.Combine ("temp", TestName); var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo[] { - new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, } ); MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath }); IBuildEngine engine = new MockBuildEngine (TestContext.Out); @@ -94,7 +94,7 @@ public void ManifestFileExists () { var path = Path.Combine (Root, "temp", TestName); var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo[] { - new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, } ); MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath }); IBuildEngine engine = new MockBuildEngine (TestContext.Out); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ResolveSdksTaskTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ResolveSdksTaskTests.cs index e642d56ec4e..5df3fd728f0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ResolveSdksTaskTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ResolveSdksTaskTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using NUnit.Framework; using Xamarin.ProjectTools; using System.IO; @@ -11,8 +12,169 @@ namespace Xamarin.Android.Build.Tests { [TestFixture] - [Parallelizable (ParallelScope.Children)] + [Parallelizable (ParallelScope.Self)] public class ResolveSdksTaskTests : BaseTest { +#pragma warning disable 414 + + static ApiInfo [] apiInfoSelection = new ApiInfo [] { + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true }, + new ApiInfo () { Id = "P", Level = 28, Name = "P", FrameworkVersion = "v8.99", Stable = false }, + }; + + static object [] UseLatestAndroidSdkTestCases = new object [] { + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ true, + /* targetFrameworkVersion */ "v8.99", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.99", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ true, + /* targetFrameworkVersion */ "v8.0", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ true, + /* targetFrameworkVersion */ "v8.1", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ true, + /* targetFrameworkVersion */ "v6.0", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ true, + /* targetFrameworkVersion */ null, + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ false, + /* targetFrameworkVersion */ "v8.99", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.99", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ false, + /* targetFrameworkVersion */ "v8.1", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ false, + /* targetFrameworkVersion */ "v8.0", + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.0", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ false, + /* targetFrameworkVersion */ null, + /* expectedTaskResult */ true, + /* expectedTargetFramework */ "v8.1", + /* expectedError */ "", + /* expectedErrorMessage */ "", + }, + new object[] { + /* buildtools */ "26.0.3", + /* jdk */ "1.8.0", + /* apis*/ apiInfoSelection, + /* useLatestAndroidSdk */ false, + /* targetFrameworkVersion */ "v6.0", + /* expectedTaskResult */ false, + /* expectedTargetFramework */ "v6.0", + /* expectedError */ "XA0001", + /* expectedErrorMessage */ "Unsupported or invalid $(TargetFrameworkVersion) value of 'v6.0'. Please update your Project Options.", + }, + }; + #pragma warning restore 414 + [Test] + [TestCaseSource(nameof(UseLatestAndroidSdkTestCases))] + public void UseLatestAndroidSdk (string buildtools, string jdk, ApiInfo[] apis, bool useLatestAndroidSdk, string targetFrameworkVersion, bool expectedTaskResult, string expectedTargetFramework, string expectedError = "", string expectedErrorMessage = "") + { + var path = Path.Combine ("temp", "UseLatestAndroidSdk_" + Guid.NewGuid ()); + var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"), buildtools, minApiLevel: 26, maxApiLevel: 27, alphaApiLevel: "P"); + string javaExe = string.Empty; + var javaPath = CreateFauxJavaSdkDirectory (Path.Combine (path, "jdk"), jdk, out javaExe); + var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), apis); + var errors = new List (); + IBuildEngine engine = new MockBuildEngine (TestContext.Out, errors); + var task = new ResolveSdks { + BuildEngine = engine + }; + task.AndroidSdkPath = androidSdkPath; + task.AndroidNdkPath = androidSdkPath; + task.JavaSdkPath = javaPath; + task.TargetFrameworkVersion = targetFrameworkVersion; + task.AndroidSdkBuildToolsVersion = buildtools; + task.BuildingInsideVisualStudio = "true"; + task.UseLatestAndroidPlatformSdk = useLatestAndroidSdk; + task.AotAssemblies = false; + task.LatestSupportedJavaVersion = "1.8.0"; + task.MinimumSupportedJavaVersion = "1.7.0"; + task.ReferenceAssemblyPaths = new string [] { + Path.Combine (referencePath, "MonoAndroid"), + }; + task.CacheFile = Path.Combine (Root, path, "sdk.xml"); + task.SequencePointsMode = "None"; + task.JavaToolExe = javaExe; + Assert.AreEqual (expectedTaskResult, task.Execute (), $"Task should have {(expectedTaskResult ? "succeeded" : "failed" )}."); + Assert.AreEqual (expectedTargetFramework, task.TargetFrameworkVersion, $"TargetFrameworkVersion should be {expectedTargetFramework} but was {targetFrameworkVersion}"); + if (!string.IsNullOrWhiteSpace (expectedError)) { + Assert.AreEqual (1, errors.Count (), "An error should have been raised."); + Assert.AreEqual (expectedError, errors [0].Code, $"Expected error code {expectedError} but found {errors [0].Code}"); + Assert.AreEqual (expectedErrorMessage, errors [0].Message, $"Expected error code {expectedErrorMessage} but found {errors [0].Message}"); + } + Directory.Delete (Path.Combine (Root, path), recursive: true); + } + [Test] public void ResolveSdkTiming () { @@ -21,8 +183,8 @@ public void ResolveSdkTiming () string javaExe = string.Empty; var javaPath = CreateFauxJavaSdkDirectory (Path.Combine (path, "jdk"), "1.8.0", out javaExe); var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo [] { - new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, - new ApiInfo () { Id = 27, Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true }, + new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true }, + new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true }, }); IBuildEngine engine = new MockBuildEngine (TestContext.Out); var task = new ResolveSdks { @@ -75,6 +237,7 @@ public void ResolveSdkTiming () Assert.AreEqual (task.AndroidUseApkSigner, false, "AndroidUseApkSigner should be false"); Assert.AreEqual (task.JdkVersion, "1.8.0", "JdkVersion should be 1.8.0"); Assert.AreEqual (task.MinimumRequiredJdkVersion, "1.8", "MinimumRequiredJdkVersion should be 1.8"); + Directory.Delete (Path.Combine (Root, path), recursive: true); } } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs index 41858b33412..84d165a799f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs @@ -104,7 +104,7 @@ protected string RunProcess (string exe, string args) { return result; } - protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVersion, int minApiLevel = 10, int maxApiLevel = 26) + protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVersion, int minApiLevel = 10, int maxApiLevel = 26, string alphaApiLevel = "") { var androidSdkDirectory = Path.Combine (Root, path); var androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools"); @@ -129,11 +129,16 @@ protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVe Directory.CreateDirectory(dir); File.WriteAllText (Path.Combine (dir, "android.jar"), ""); } + if (!string.IsNullOrEmpty (alphaApiLevel)) { + var dir = Path.Combine (androidSdkPlatformsPath, $"android-{alphaApiLevel}"); + Directory.CreateDirectory (dir); + File.WriteAllText (Path.Combine (dir, "android.jar"), ""); + } return androidSdkDirectory; } public struct ApiInfo { - public int Id; + public string Id; public int Level; public string Name; public string FrameworkVersion; @@ -142,11 +147,12 @@ public struct ApiInfo { protected string CreateFauxReferencesDirectory (string path, ApiInfo [] versions) { - string referencesDirectory = Path.Combine (Root, path); Directory.CreateDirectory (referencesDirectory); - Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0")); + Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "RedistList")); File.WriteAllText (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "mscorlib.dll"), ""); + File.WriteAllText (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "RedistList", "FrameworkList.xml"), + $""); foreach (var v in versions) { Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", v.FrameworkVersion)); Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", v.FrameworkVersion, "RedistList")); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BuildHelper.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BuildHelper.cs index ce834595c04..cf873c9076c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BuildHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BuildHelper.cs @@ -60,6 +60,17 @@ public static bool ContainsText (this IEnumerable collection, string exp } return false; } + + public static bool ContainsOccurances (this IEnumerable collection, string expected, int count) + { + int found = 0; + foreach (var line in collection) { + if (line.Contains (expected)) { + found++; + } + } + return found == count; + } } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/MockBuildEngine.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/MockBuildEngine.cs index 38f36c65d7e..fe33ddc7f58 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/MockBuildEngine.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/MockBuildEngine.cs @@ -10,13 +10,16 @@ namespace Xamarin.Android.Build.Tests { public class MockBuildEngine : IBuildEngine, IBuildEngine2, IBuildEngine3, IBuildEngine4 { - public MockBuildEngine (TextWriter output) + public MockBuildEngine (TextWriter output, IList errors = null) { this.Output = output; + this.Errors = errors; } private TextWriter Output { get; } + private IList Errors { get; } + int IBuildEngine.ColumnNumberOfTaskNode => -1; bool IBuildEngine.ContinueOnError => false; @@ -37,6 +40,8 @@ void IBuildEngine.LogCustomEvent (CustomBuildEventArgs e) void IBuildEngine.LogErrorEvent (BuildErrorEventArgs e) { this.Output.WriteLine ($"Error: {e.Message}"); + if (Errors != null) + Errors.Add (e); } void IBuildEngine.LogMessageEvent (BuildMessageEventArgs e) diff --git a/tools/scripts/xabuild b/tools/scripts/xabuild index 702008dd388..5f3afc3b4cf 100755 --- a/tools/scripts/xabuild +++ b/tools/scripts/xabuild @@ -133,7 +133,11 @@ case "$MSBUILD" in XABUILD_FLAGS+=(/p:TargetFrameworkRootPath="$TARGETS_DIR-frameworks/") ;; *xbuild*) - export XBUILD_FRAMEWORK_FOLDERS_PATH="$TARGETS_DIR-frameworks" + if [ -z "$XBUILD_FRAMEWORK_FOLDERS_PATH" ]; then + export XBUILD_FRAMEWORK_FOLDERS_PATH="$TARGETS_DIR-frameworks" + else + export XBUILD_FRAMEWORK_FOLDERS_PATH="$XBUILD_FRAMEWORK_FOLDERS_PATH" + fi ;; esac