diff --git a/Documentation/guides/BuildProcess.md b/Documentation/guides/BuildProcess.md index 0b7c277a7b5..7fdebc0d194 100644 --- a/Documentation/guides/BuildProcess.md +++ b/Documentation/guides/BuildProcess.md @@ -735,6 +735,8 @@ when packaging Release applications. or not LLVM will be used when Ahead-of-Time compiling assemblies into native code. + Enabling this propery requires Android NDK to be installed. + Support for this property was added in Xamarin.Android 5.1. This property is `False` by default. diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index ccf789236e7..1cff48c557d 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -137,9 +137,17 @@ <_MSBuildFilesWin Include="$(MSBuildSrcDir)\aapt2.exe" /> <_MSBuildFilesWin Include="$(MSBuildSrcDir)\libwinpthread-1.dll" /> <_MSBuildFilesWin Include="$(MSBuildSrcDir)\aarch64-linux-android-as.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\aarch64-linux-android-ld.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\aarch64-linux-android-strip.exe" Condition=" '$(HostOS)' != 'Windows' "/> <_MSBuildFilesWin Include="$(MSBuildSrcDir)\arm-linux-androideabi-as.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\arm-linux-androideabi-ld.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\arm-linux-androideabi-strip.exe" Condition=" '$(HostOS)' != 'Windows' "/> <_MSBuildFilesWin Include="$(MSBuildSrcDir)\i686-linux-android-as.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\i686-linux-android-ld.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\i686-linux-android-strip.exe" Condition=" '$(HostOS)' != 'Windows' "/> <_MSBuildFilesWin Include="$(MSBuildSrcDir)\x86_64-linux-android-as.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\x86_64-linux-android-ld.exe" Condition=" '$(HostOS)' != 'Windows' "/> + <_MSBuildFilesWin Include="$(MSBuildSrcDir)\x86_64-linux-android-strip.exe" Condition=" '$(HostOS)' != 'Windows' "/> <_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.debug.dll" Condition=" '$(HostOS)' != 'Windows' " /> <_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.release.dll" Condition=" '$(HostOS)' != 'Windows' " /> <_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libMonoPosixHelper.dll" /> @@ -148,9 +156,17 @@ <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\aarch64-linux-android-as" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\aarch64-linux-android-ld" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\aarch64-linux-android-strip" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\arm-linux-androideabi-as" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\arm-linux-androideabi-ld" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\arm-linux-androideabi-strip" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\i686-linux-android-as" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\i686-linux-android-ld" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\i686-linux-android-strip" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\x86_64-linux-android-as" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\x86_64-linux-android-ld" /> + <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\x86_64-linux-android-strip" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\illinkanalyzer" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\jit-times" /> <_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\mono" /> diff --git a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.Unix.cs b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.Unix.cs index 5d9fe386c42..fcdb2a0feaf 100644 --- a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.Unix.cs +++ b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.Unix.cs @@ -13,7 +13,7 @@ partial void AddRequiredOSSpecificSteps (bool beforeBundle) // (because they're not useful for every day work with XA) so they must be downloaded after the bundle // is unpacked. Log.DebugLine ("Adding Windows GAS download step (AFTER bundle)"); - Steps.Add (new Step_Get_Windows_GAS ()); + Steps.Add (new Step_Get_Windows_Binutils ()); return; } diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_GAS.Unix.cs b/build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_Binutils.Unix.cs similarity index 95% rename from build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_GAS.Unix.cs rename to build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_Binutils.Unix.cs index c0e294d15a3..f5e3f55f384 100644 --- a/build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_GAS.Unix.cs +++ b/build-tools/xaprepare/xaprepare/Steps/Step_Get_Windows_Binutils.Unix.cs @@ -9,7 +9,7 @@ namespace Xamarin.Android.Prepare { - class Step_Get_Windows_GAS : Step + class Step_Get_Windows_Binutils : Step { const int EndFileChunkSize = 65535 + 22; // Maximum comment size + EOCD size const uint EOCDSignature = 0x06054b50; @@ -69,7 +69,7 @@ class LFHeader public byte[] ExtraField; }; - public Step_Get_Windows_GAS () + public Step_Get_Windows_Binutils () : base ("Downloading NDK tools for Windows") {} @@ -79,9 +79,17 @@ protected override async Task Execute (Context context) var neededFiles = new HashSet (StringComparer.OrdinalIgnoreCase) { $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/i686-linux-android-as.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/i686-linux-android-ld.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/i686-linux-android-strip.exe", $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/arm-linux-androideabi-as.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ld.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exe", $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/x86_64-linux-android-as.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/x86_64-linux-android-ld.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/x86_64-linux-android-strip.exe", $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android-as.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android-ld.exe", + $"android-ndk-r{ndkVersion}/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android-strip.exe", }; string destinationDirectory = Path.Combine (Configurables.Paths.InstallMSBuildDir); diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_PrepareBundle.Unix.cs b/build-tools/xaprepare/xaprepare/Steps/Step_PrepareBundle.Unix.cs index 34a31f3355e..0d778cb6aac 100644 --- a/build-tools/xaprepare/xaprepare/Steps/Step_PrepareBundle.Unix.cs +++ b/build-tools/xaprepare/xaprepare/Steps/Step_PrepareBundle.Unix.cs @@ -16,7 +16,7 @@ void InitOS () // We need it here (even though Scenario_Standard runs the step, because if we failed to download the // bundle, the Step_BuildMonoRuntimes above will clean the destination directory and the Windows GAS // executables with it. - AddFailureStep (new Step_Get_Windows_GAS ()); + AddFailureStep (new Step_Get_Windows_Binutils ()); AddFailureStep (new Step_CreateBundle ()); } diff --git a/build-tools/xaprepare/xaprepare/xaprepare.csproj b/build-tools/xaprepare/xaprepare/xaprepare.csproj index de16e1e6e31..f6d3f997eab 100644 --- a/build-tools/xaprepare/xaprepare/xaprepare.csproj +++ b/build-tools/xaprepare/xaprepare/xaprepare.csproj @@ -196,7 +196,7 @@ - + diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs index c990d31633e..7556fef0590 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs @@ -35,7 +35,6 @@ public class Aot : AsyncTask [Required] public string AndroidAotMode { get; set; } - [Required] public string AndroidNdkDirectory { get; set; } [Required] @@ -71,6 +70,8 @@ public class Aot : AsyncTask public ITaskItem [] Profiles { get; set; } + public string ToolsDirectory { get; set; } + [Output] public string[] NativeLibrariesReferences { get; set; } @@ -83,7 +84,7 @@ public Aot () public override bool Execute () { - if (!NdkUtil.Init (Log, AndroidNdkDirectory)) + if (EnableLLVM && !NdkUtil.Init (Log, AndroidNdkDirectory)) return false; try { @@ -346,7 +347,7 @@ IEnumerable GetAotConfigs () throw new Exception ("Unsupported Android target architecture ABI: " + abi); } - if (!NdkUtil.ValidateNdkPlatform (Log, AndroidNdkDirectory, arch, enableLLVM:EnableLLVM)) { + if (EnableLLVM && !NdkUtil.ValidateNdkPlatform (Log, AndroidNdkDirectory, arch, enableLLVM:EnableLLVM)) { yield return Config.Invalid; yield break; } @@ -360,11 +361,18 @@ IEnumerable GetAotConfigs () if (!Directory.Exists (outdir)) Directory.CreateDirectory (outdir); - int level = GetNdkApiLevel (AndroidNdkDirectory, AndroidApiLevel, arch); - string toolPrefix = NdkUtil.GetNdkToolPrefix (AndroidNdkDirectory, arch, level); + int level = 0; + string toolPrefix = EnableLLVM + ? NdkUtil.GetNdkToolPrefix (AndroidNdkDirectory, arch, level = GetNdkApiLevel (AndroidNdkDirectory, AndroidApiLevel, arch)) + : $"{ToolsDirectory}{NdkUtil.GetArchDirName (arch)}-"; var toolchainPath = toolPrefix.Substring(0, toolPrefix.LastIndexOf(Path.DirectorySeparatorChar)); var ldFlags = string.Empty; if (EnableLLVM) { + if (string.IsNullOrEmpty (AndroidNdkDirectory)) { + yield return Config.Invalid; + yield break; + } + string androidLibPath = string.Empty; try { androidLibPath = NdkUtil.GetNdkPlatformLibPath(AndroidNdkDirectory, arch, level); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MakeBundleNativeCodeExternalTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MakeBundleNativeCodeExternalTests.cs index 538ef487bc8..242097e6f04 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MakeBundleNativeCodeExternalTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MakeBundleNativeCodeExternalTests.cs @@ -53,6 +53,7 @@ public void XA5101AndroidNdkNotFound (string androidNdkDirectory) AndroidNdkDirectory = androidNdkDirectory, AndroidAotMode = "normal", AndroidApiLevel = "28", + EnableLLVM = true, ResolvedAssemblies = new ITaskItem [0], SupportedAbis = new [] { "armeabi-v7a" }, AotOutputDirectory = path, diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets index 9f7e3693811..3974810ad1a 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets @@ -151,14 +151,22 @@ <_ToolchainPrefix Include="x86_64"> x86_64-linux-android + <_ToolName Include="as"/> + <_ToolName Include="ld"/> + <_ToolName Include="strip"/> + + + + - + @@ -167,9 +175,9 @@ - <_NDKToolSource Include="$(_NDKToolLocation%(_ToolchainPrefix.Identity))" /> - <_NDKToolDestination Condition=" '$(HostOS)' != 'Windows' " Include="$(_NDKToolDestinationBase)\$(HostOS)\$([System.IO.Path]::GetFileName ('$(_NDKToolLocation%(_ToolchainPrefix.Identity))'))" /> - <_NDKToolDestination Condition=" '$(HostOS)' == 'Windows' " Include="$(_NDKToolDestinationBase)\$([System.IO.Path]::GetFileName ('$(_NDKToolLocation%(_ToolchainPrefix.Identity))'))" /> + <_NDKToolSource Include="$(_NDKToolLocation%(_ToolchainTool.Identity)-%(_ToolchainTool.Tool))" /> + <_NDKToolDestination Condition=" '$(HostOS)' != 'Windows' " Include="$(_NDKToolDestinationBase)\$(HostOS)\$([System.IO.Path]::GetFileName ('$(_NDKToolLocation%(_ToolchainTool.Identity)-%(_ToolchainTool.Tool))'))" /> + <_NDKToolDestination Condition=" '$(HostOS)' == 'Windows' " Include="$(_NDKToolDestinationBase)\$([System.IO.Path]::GetFileName ('$(_NDKToolLocation%(_ToolchainTool.Identity)-%(_ToolchainTool.Tool))'))" /> diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index e4b9fe1ccd8..56644c86804 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -2986,6 +2986,7 @@ because xbuild doesn't support framework reference assemblies. Condition="'$(AotAssemblies)' == 'True'" AndroidAotMode="$(AndroidAotMode)" AndroidNdkDirectory="$(_AndroidNdkDirectory)" + ToolsDirectory="$(MonoAndroidBinDirectory)" AndroidApiLevel="$(_AndroidApiLevel)" ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml" SupportedAbis="@(_BuildTargetAbis)"