diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidDefineConstants.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidDefineConstants.cs index df1da09fcca..ffefb17da5a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidDefineConstants.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidDefineConstants.cs @@ -1,6 +1,7 @@ // Copyright (C) 2011 Xamarin, Inc. All rights reserved. using System; +using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using Microsoft.Build.Framework; @@ -16,21 +17,25 @@ public class GetAndroidDefineConstants : Task public string ProductVersion { get; set; } [Output] - public string AndroidDefineConstants { get; set; } + public ITaskItem[] AndroidDefineConstants { get; set; } public override bool Execute () { - var sb = new StringBuilder (); + var constants = new List (); if (!string.IsNullOrEmpty (ProductVersion)) { - sb.AppendFormat ("__XAMARIN_ANDROID_{0}__;", Regex.Replace (ProductVersion, "[^A-Za-z0-9]", "_")); + var version = Regex.Replace (ProductVersion, "[^A-Za-z0-9]", "_"); + constants.Add (new TaskItem ($"__XAMARIN_ANDROID_{version}__")); } - sb.Append ("__MOBILE__;__ANDROID__"); - for (int i = 1; i <= AndroidApiLevel; ++i) - sb.Append (";__ANDROID_").Append (i).Append ("__"); + constants.Add (new TaskItem ("__MOBILE__")); + constants.Add (new TaskItem ("__ANDROID__")); - AndroidDefineConstants = sb.ToString (); + for (int i = 1; i <= AndroidApiLevel; ++i) { + constants.Add (new TaskItem ($"__ANDROID_{i}__")); + } + + AndroidDefineConstants = constants.ToArray (); return true; } 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 323c3574dca..ea90ff3aa05 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 @@ -50,6 +50,29 @@ public void BuildBasicApplicationReleaseFSharp () } } + [Test] + public void FSharpAppHasAndroidDefine () + { + var proj = new XamarinAndroidApplicationProject () { + Language = XamarinAndroidProjectLanguage.FSharp, + }; + proj.Sources.Add (new BuildItem ("Compile", "IsAndroidDefined.fs") { + TextContent = () => @" +module Xamarin.Android.Tests +// conditional compilation; can we elicit a compile-time error? +let x = +#if __ANDROID__ + 42 +#endif // __ANDROID__ + +printf ""%d"" x +", + }); + using (var b = CreateApkBuilder ("temp/" + nameof (FSharpAppHasAndroidDefine))) { + Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + } + } + [Test] public void BuildApplicationAndClean ([Values (false, true)] bool isRelease) { diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 1c4d1b1d1ac..1bd6cc28834 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -822,12 +822,12 @@ because xbuild doesn't support framework reference assemblies. - + - - - + + $(DefineConstants);@(AndroidDefineConstants) +