diff --git a/eng/testing/tests.mobile.targets b/eng/testing/tests.mobile.targets
index b78d6451612c88..90a18f86ca84ea 100644
--- a/eng/testing/tests.mobile.targets
+++ b/eng/testing/tests.mobile.targets
@@ -3,17 +3,19 @@
$([MSBuild]::NormalizeDirectory('$(OutDir)', 'AppBundle'))
$([MSBuild]::NormalizePath('$(BundleDir)', '$(RunScriptOutputName)'))
+ true
+
- arm64-v8a
- armeabi
- x86_64
- $(TargetArchitecture)
+ arm64-v8a
+ armeabi
+ x86_64
+ x86
@@ -22,7 +24,6 @@
-
@@ -35,10 +36,11 @@
-
+
@@ -53,6 +55,11 @@
+
+
+
+
@@ -60,25 +67,44 @@
+
-
-
-
+
@@ -87,8 +113,6 @@
-
diff --git a/eng/testing/tests.props b/eng/testing/tests.props
index 09b51e3163a7d4..382ffe67684d96 100644
--- a/eng/testing/tests.props
+++ b/eng/testing/tests.props
@@ -26,6 +26,7 @@
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AppleTestRunner', '$(MobileHelpersDirSuffix)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder', '$(MobileHelpersDirSuffix)'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidTestRunner', '$(MobileHelpersDirSuffix)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'MonoAOTCompiler', '$(MobileHelpersDirSuffix)'))
$(PackageRID)
true
diff --git a/src/mono/Directory.Build.props b/src/mono/Directory.Build.props
index 425f7a1cf725ab..aa7e500eb75a64 100644
--- a/src/mono/Directory.Build.props
+++ b/src/mono/Directory.Build.props
@@ -108,5 +108,6 @@
$([MSBuild]::NormalizeDirectory('$(MonoProjectRoot)', 'msbuild', 'AppleTestRunner'))
$([MSBuild]::NormalizeDirectory('$(MonoProjectRoot)', 'msbuild', 'AndroidAppBuilder'))
$([MSBuild]::NormalizeDirectory('$(MonoProjectRoot)', 'msbuild', 'AndroidTestRunner'))
+ $([MSBuild]::NormalizeDirectory('$(MonoProjectRoot)', 'msbuild', 'AotCompilerTask'))
diff --git a/src/mono/mono.proj b/src/mono/mono.proj
index 0ac63489b21ed8..834b513f5ec38b 100644
--- a/src/mono/mono.proj
+++ b/src/mono/mono.proj
@@ -29,13 +29,14 @@
$(ArtifactsDir)bin\testhost\$(NetCoreAppCurrent)-$(TargetOS)-$(LibrariesTestConfig)-$(Platform)\
$(LibrariesTesthostRoot)shared\Microsoft.NETCore.App\$(ProductVersion)\
/Applications/Xcode.app/Contents/Developer
- true
- true
+ true
+ true
true
+ $(MonoObjDir)cross\config.h
-
+
@@ -163,56 +164,7 @@
<_MonoLDFLAGS Include="-lobjc" />
<_MonoLDFLAGS Include="-lc++" />
-
- <_MonoAotCrossConfigureParams Include="--host=x86_64-apple-darwin10" />
- <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm64'" Include="--target=aarch64-darwin" />
- <_MonoAotCrossConfigureParams Include="--with-cross-offsets=$(MonoObjDir)cross/offsets-$(Platform)-darwin.h" />
- <_MonoAotCrossConfigureParams Include="--with-core=only" />
- <_MonoAotCrossConfigureParams Include="--enable-maintainer-mode" />
- <_MonoAotCrossConfigureParams Include="--enable-compile-warnings" />
- <_MonoAotCrossConfigureParams Include="--prefix=$(MonoObjDir)cross/out" />
- <_MonoAotCrossConfigureParams Include="--disable-boehm" />
- <_MonoAotCrossConfigureParams Include="--disable-btls" />
- <_MonoAotCrossConfigureParams Include="--disable-iconv" />
- <_MonoAotCrossConfigureParams Include="--disable-libraries" />
- <_MonoAotCrossConfigureParams Include="--disable-mcs-build" />
- <_MonoAotCrossConfigureParams Include="--disable-nls" />
- <_MonoAotCrossConfigureParams Include="--enable-dtrace=no" />
- <_MonoAotCrossConfigureParams Include="--enable-icall-symbol-map" />
- <_MonoAotCrossConfigureParams Include="--enable-minimal=com,remoting" />
- <_MonoAotCrossConfigureParams Include="--enable-monotouch" />
- <_MonoAotCrossConfigureParams Include="--disable-crash-reporting" />
- <_MonoAotCrossConfigureParams Include="--with-llvm=$(MonoLLVMDir)" />
-
- <_MonoAotCrossAC_VARS Include="ac_cv_func_shm_open_working_with_mmap=no" />
-
- <_MonoAotCrossCFLAGS Include="-O2" />
- <_MonoAotCrossCFLAGS Include="-g" />
- <_MonoAotCrossCFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
- <_MonoAotCrossCFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
- <_MonoAotCrossCFLAGS Include="-Qunused-arguments" />
- <_MonoAotCrossCFLAGS Include="-m64" />
-
- <_MonoAotCrossCXXFLAGS Include="-O2" />
- <_MonoAotCrossCXXFLAGS Include="-g" />
- <_MonoAotCrossCXXFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
- <_MonoAotCrossCXXFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
- <_MonoAotCrossCXXFLAGS Include="-Qunused-arguments" />
- <_MonoAotCrossCXXFLAGS Include="-stdlib=libc++" />
- <_MonoAotCrossCXXFLAGS Include="-m64" />
-
- <_MonoAotCrossCPPFLAGS Include="-O2" />
- <_MonoAotCrossCPPFLAGS Include="-g" />
- <_MonoAotCrossCPPFLAGS Include="-DMONOTOUCH=1" />
- <_MonoAotCrossCPPFLAGS Include="-m64" />
-
- <_MonoAotCrossCXXPPFLAGS Include="-O2" />
- <_MonoAotCrossCXXPPFLAGS Include="-g" />
- <_MonoAotCrossCXXPPFLAGS Include="-m64" />
-
- <_MonoAotCrossLDFLAGS Include="-stdlib=libc++" />
-
<_MonoAotCrossOffsetsToolParams Condition="'$(Platform)' == 'arm64'" Include="--abi=aarch64-apple-darwin10" />
<_MonoAotCrossOffsetsToolParams Include="--netcore" />
<_MonoAotCrossOffsetsToolParams Include="--targetdir="$(MonoObjDir)"" />
@@ -356,57 +308,7 @@
<_MonoLDFLAGS Include="-lobjc" />
<_MonoLDFLAGS Include="-lc++" />
-
- <_MonoAotCrossConfigureParams Include="--host=x86_64-apple-darwin10" />
- <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm64'" Include="--target=aarch64-darwin" />
- <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm'" Include="--target=arm-darwin" />
- <_MonoAotCrossConfigureParams Include="--with-cross-offsets=$(MonoObjDir)cross/offsets-$(Platform)-darwin.h" />
- <_MonoAotCrossConfigureParams Include="--with-core=only" />
- <_MonoAotCrossConfigureParams Include="--enable-maintainer-mode" />
- <_MonoAotCrossConfigureParams Include="--enable-compile-warnings" />
- <_MonoAotCrossConfigureParams Include="--prefix=$(MonoObjDir)cross/out" />
- <_MonoAotCrossConfigureParams Include="--disable-boehm" />
- <_MonoAotCrossConfigureParams Include="--disable-btls" />
- <_MonoAotCrossConfigureParams Include="--disable-iconv" />
- <_MonoAotCrossConfigureParams Include="--disable-libraries" />
- <_MonoAotCrossConfigureParams Include="--disable-mcs-build" />
- <_MonoAotCrossConfigureParams Include="--disable-nls" />
- <_MonoAotCrossConfigureParams Include="--enable-dtrace=no" />
- <_MonoAotCrossConfigureParams Include="--enable-icall-symbol-map" />
- <_MonoAotCrossConfigureParams Include="--enable-minimal=com,remoting" />
- <_MonoAotCrossConfigureParams Include="--enable-monotouch" />
- <_MonoAotCrossConfigureParams Include="--disable-crash-reporting" />
- <_MonoAotCrossConfigureParams Include="--with-llvm=$(MonoLLVMDir)" />
-
- <_MonoAotCrossAC_VARS Include="ac_cv_func_shm_open_working_with_mmap=no" />
-
- <_MonoAotCrossCFLAGS Include="-O2" />
- <_MonoAotCrossCFLAGS Include="-g" />
- <_MonoAotCrossCFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
- <_MonoAotCrossCFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
- <_MonoAotCrossCFLAGS Include="-Qunused-arguments" />
- <_MonoAotCrossCFLAGS Include="-m64" />
-
- <_MonoAotCrossCXXFLAGS Include="-O2" />
- <_MonoAotCrossCXXFLAGS Include="-g" />
- <_MonoAotCrossCXXFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
- <_MonoAotCrossCXXFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
- <_MonoAotCrossCXXFLAGS Include="-Qunused-arguments" />
- <_MonoAotCrossCXXFLAGS Include="-stdlib=libc++" />
- <_MonoAotCrossCXXFLAGS Include="-m64" />
-
- <_MonoAotCrossCPPFLAGS Include="-O2" />
- <_MonoAotCrossCPPFLAGS Include="-g" />
- <_MonoAotCrossCPPFLAGS Include="-DMONOTOUCH=1" />
- <_MonoAotCrossCPPFLAGS Include="-m64" />
-
- <_MonoAotCrossCXXPPFLAGS Include="-O2" />
- <_MonoAotCrossCXXPPFLAGS Include="-g" />
- <_MonoAotCrossCXXPPFLAGS Include="-m64" />
-
- <_MonoAotCrossLDFLAGS Include="-stdlib=libc++" />
-
<_MonoAotCrossOffsetsToolParams Condition="'$(Platform)' == 'arm64'" Include="--abi=aarch64-apple-darwin10" />
<_MonoAotCrossOffsetsToolParams Condition="'$(Platform)' == 'arm'" Include="--abi=arm-apple-darwin10" />
<_MonoAotCrossOffsetsToolParams Include="--netcore" />
@@ -467,6 +369,61 @@
<_MonoCPPFLAGS Include="-DHOST_IOS" />
+
+
+
+
+ <_MonoAotCrossConfigureParams Include="--host=x86_64-apple-darwin10" />
+ <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm64'" Include="--target=aarch64-darwin" />
+ <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm'" Include="--target=arm-darwin" />
+ <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'x86'" Include="--target=i386-apple-darwin" />
+ <_MonoAotCrossConfigureParams Condition="'$(Platform)' == 'arm64' or '$(Platform)' == 'arm'" Include="--with-cross-offsets=$(MonoObjDir)cross/offsets-$(Platform)-darwin.h" />
+ <_MonoAotCrossConfigureParams Include="--with-core=only" />
+ <_MonoAotCrossConfigureParams Include="--enable-maintainer-mode" />
+ <_MonoAotCrossConfigureParams Include="--enable-compile-warnings" />
+ <_MonoAotCrossConfigureParams Include="--prefix=$(MonoObjDir)cross/out" />
+ <_MonoAotCrossConfigureParams Include="--disable-boehm" />
+ <_MonoAotCrossConfigureParams Include="--disable-btls" />
+ <_MonoAotCrossConfigureParams Include="--disable-iconv" />
+ <_MonoAotCrossConfigureParams Include="--disable-libraries" />
+ <_MonoAotCrossConfigureParams Include="--disable-mcs-build" />
+ <_MonoAotCrossConfigureParams Include="--disable-nls" />
+ <_MonoAotCrossConfigureParams Include="--enable-dtrace=no" />
+ <_MonoAotCrossConfigureParams Include="--enable-icall-symbol-map" />
+ <_MonoAotCrossConfigureParams Include="--enable-minimal=com,remoting" />
+ <_MonoAotCrossConfigureParams Include="--enable-monotouch" />
+ <_MonoAotCrossConfigureParams Include="--disable-crash-reporting" />
+ <_MonoAotCrossConfigureParams Include="--with-llvm=$(MonoLLVMDir)" />
+
+ <_MonoAotCrossAC_VARS Include="ac_cv_func_shm_open_working_with_mmap=no" />
+
+ <_MonoAotCrossCFLAGS Include="-O2" />
+ <_MonoAotCrossCFLAGS Include="-g" />
+ <_MonoAotCrossCFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
+ <_MonoAotCrossCFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
+ <_MonoAotCrossCFLAGS Include="-Qunused-arguments" />
+ <_MonoAotCrossCFLAGS Include="-m64" />
+
+ <_MonoAotCrossCXXFLAGS Include="-O2" />
+ <_MonoAotCrossCXXFLAGS Include="-g" />
+ <_MonoAotCrossCXXFLAGS Include="-isysroot $(XcodeDir)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(macOSVersion).sdk" />
+ <_MonoAotCrossCXXFLAGS Include="-mmacosx-version-min=$(macOSVersionMin)" />
+ <_MonoAotCrossCXXFLAGS Include="-Qunused-arguments" />
+ <_MonoAotCrossCXXFLAGS Include="-stdlib=libc++" />
+ <_MonoAotCrossCXXFLAGS Include="-m64" />
+
+ <_MonoAotCrossCPPFLAGS Include="-O2" />
+ <_MonoAotCrossCPPFLAGS Include="-g" />
+ <_MonoAotCrossCPPFLAGS Include="-DMONOTOUCH=1" />
+ <_MonoAotCrossCPPFLAGS Include="-m64" />
+
+ <_MonoAotCrossCXXPPFLAGS Include="-O2" />
+ <_MonoAotCrossCXXPPFLAGS Include="-g" />
+ <_MonoAotCrossCXXPPFLAGS Include="-m64" />
+
+ <_MonoAotCrossLDFLAGS Include="-stdlib=libc++" />
+
+
<_MonoConfigureParams Condition="'$(Platform)' == 'arm64'" Include="--host=aarch64-linux-android" />
@@ -727,7 +684,7 @@
<_MonoAotCrossCCLDFLAGSOption Condition="@(_MonoAotCrossCCLDFLAGS->Count()) > 0">CCLDFLAGS="@(_MonoAotCrossCCLDFLAGS, ' ')"
<_MonoAotCrossConfigureCommand>$(MonoProjectRoot)configure @(_MonoAotCrossConfigureParams, ' ') @(_MonoAotCrossAC_VARS, ' ') $(_MonoAotCrossCFLAGSOption) $(_MonoAotCrossCXXFLAGSOption) $(_MonoAotCrossCPPFLAGSOption) $(_MonoAotCrossCXXCPPFLAGSOption) $(_MonoAotCrossLDFLAGSOption) $(_MonoAotCrossCCLDFLAGSOption) $(_MonoCCOption) $(_MonoCXXOption) $(_MonoAROption) $(_MonoASOption) $(_MonoCPPOption) $(_MonoCXXCPPOption) $(_MonoDLLTOOLOption) $(_MonoLDOption) $(_MonoOBJDUMPOption) $(_MonoRANLIBOption) $(_MonoCMAKEOption) $(_MonoSTRIPOption)
- <_MonoAotCrossOffsetsCommand>python3 $(MonoProjectRoot)mono/tools/offsets-tool/offsets-tool.py @(_MonoAotCrossOffsetsToolParams, ' ')
+ <_MonoAotCrossOffsetsCommand Condition="@(_MonoAotCrossOffsetsToolParams->Count()) > 0">python3 $(MonoProjectRoot)mono/tools/offsets-tool/offsets-tool.py @(_MonoAotCrossOffsetsToolParams, ' ')
@@ -926,7 +883,7 @@
-
+
@@ -935,7 +892,7 @@
Targets="Restore;Build" />
-
+
@@ -945,15 +902,21 @@
-
+
+
+
+
+
-
+
<_MonoRuntimeFilePath Condition="'$(TargetsWindows)' == 'true' and '$(Platform)' == 'x64'">$(MonoObjDir)x64\Bin\$(Configuration)\mono-2.0-sgen.dll
<_MonoRuntimeFilePath Condition="'$(TargetsWindows)' == 'true' and '$(Platform)' == 'x86'">$(MonoObjDir)Win32\Bin\$(Configuration)\mono-2.0-sgen.dll
@@ -966,7 +929,10 @@
<_MonoRuntimeStaticFilePath Condition="'$(TargetsiOS)' == 'true' or '$(TargetstvOS)' == 'true' or '$(TargetsAndroid)' == 'true'">$(MonoObjDir)out\lib\libmonosgen-2.0.a
<_MonoAotCrossFilePath Condition="'$(TargetsiOS)' == 'true' and '$(Platform)' == 'arm64'">$(MonoObjDir)cross\out\bin\aarch64-darwin-mono-sgen
<_MonoAotCrossFilePath Condition="'$(TargetsiOS)' == 'true' and '$(Platform)' == 'arm'">$(MonoObjDir)cross\out\bin\arm-darwin-mono-sgen
+ <_MonoAotCrossFilePath Condition="'$(TargetsiOS)' == 'true' and '$(Platform)' == 'x64'">$(MonoObjDir)cross\out\bin\mono-sgen
+ <_MonoAotCrossFilePath Condition="'$(TargetsiOS)' == 'true' and '$(Platform)' == 'x86'">$(MonoObjDir)cross\out\bin\mono-sgen
<_MonoAotCrossFilePath Condition="'$(TargetstvOS)' == 'true' and '$(Platform)' == 'arm64'">$(MonoObjDir)cross\out\bin\aarch64-darwin-mono-sgen
+ <_MonoAotCrossFilePath Condition="'$(TargetstvOS)' == 'true' and '$(Platform)' == 'x64'">$(MonoObjDir)cross\out\bin\mono-sgen
<_MonoAotCrossFilePath Condition="'$(TargetsBrowser)' == 'true'">$(MonoObjDir)cross\out\bin\wasm32-unknown-none-mono-sgen
diff --git a/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.cs b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.cs
new file mode 100644
index 00000000000000..8f8643ae606d7f
--- /dev/null
+++ b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.cs
@@ -0,0 +1,256 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+public class MonoAOTCompiler : Microsoft.Build.Utilities.Task
+{
+ ///
+ /// Path to AOT cross-compiler binary (mono-aot-cross)
+ ///
+ [Required]
+ public string CompilerBinaryPath { get; set; } = ""!;
+
+ ///
+ /// Assemblies to be AOTd. They need to be in a self-contained directory.
+ ///
+ /// Metadata:
+ /// - AotArguments: semicolon-separated list of options that will be passed to --aot=
+ /// - ProcessArguments: semicolon-separated list of options that will be passed to the AOT compiler itself
+ ///
+ [Required]
+ public ITaskItem[] Assemblies { get; set; } = Array.Empty();
+
+ ///
+ /// Assemblies which were AOT compiled.
+ ///
+ /// Successful AOT compilation will set the following metadata on the items:
+ /// - AssemblerFile (when using OutputType=AsmOnly)
+ /// - ObjectFile (when using OutputType=Normal)
+ /// - AotDataFile
+ /// - LlvmObjectFile (if using LLVM)
+ /// - LlvmBitcodeFile (if using LLVM-only)
+ ///
+ [Output]
+ public ITaskItem[]? CompiledAssemblies { get; set; }
+
+ ///
+ /// Disable parallel AOT compilation
+ ///
+ public bool DisableParallelAot { get; set; }
+
+ ///
+ /// Use LLVM for AOT compilation.
+ /// The cross-compiler must be built with LLVM support
+ ///
+ public bool UseLLVM { get; set; }
+
+ ///
+ /// Choose between 'Normal', 'Full', 'LLVMOnly'.
+ /// LLVMOnly means to use only LLVM for FullAOT, AOT result will be a LLVM Bitcode file (the cross-compiler must be built with LLVM support)
+ ///
+ public string Mode { get; set; } = nameof(MonoAotMode.Normal);
+
+ ///
+ /// Choose between 'Normal', 'AsmOnly'
+ /// AsmOnly means the AOT compiler will produce .s assembly code instead of an .o object file.
+ ///
+ public string OutputType { get; set; } = nameof(MonoAotOutputType.Normal);
+
+ ///
+ /// Path to the directory where LLVM binaries (opt and llc) are found.
+ /// It's required if UseLLVM is set
+ ///
+ public string? LLVMPath { get; set; }
+
+ ///
+ /// Path to the directory where msym artifacts are stored.
+ ///
+ public string? MsymPath { get; set; }
+
+ ConcurrentBag compiledAssemblies = new ConcurrentBag();
+ MonoAotMode parsedAotMode;
+ MonoAotOutputType parsedOutputType;
+
+ public override bool Execute()
+ {
+ Utils.Logger = Log;
+
+ if (string.IsNullOrEmpty(CompilerBinaryPath))
+ {
+ throw new ArgumentException($"'{nameof(CompilerBinaryPath)}' is required.", nameof(CompilerBinaryPath));
+ }
+
+ if (!File.Exists(CompilerBinaryPath))
+ {
+ throw new ArgumentException($"'{CompilerBinaryPath}' doesn't exist.", nameof(CompilerBinaryPath));
+ }
+
+ if (Assemblies.Length == 0)
+ {
+ throw new ArgumentException($"'{nameof(Assemblies)}' is required.", nameof(Assemblies));
+ }
+
+ if (UseLLVM && string.IsNullOrEmpty(LLVMPath))
+ {
+ // prevent using some random llc/opt from PATH (installed with clang)
+ throw new ArgumentException($"'{nameof(LLVMPath)}' is required when '{nameof(UseLLVM)}' is true.", nameof(LLVMPath));
+ }
+
+ switch (Mode)
+ {
+ case "Normal": parsedAotMode = MonoAotMode.Normal; break;
+ case "Full": parsedAotMode = MonoAotMode.Full; break;
+ case "LLVMOnly": parsedAotMode = MonoAotMode.LLVMOnly; break;
+ default:
+ throw new ArgumentException($"'{nameof(Mode)}' must be one of: '{nameof(MonoAotMode.Normal)}', '{nameof(MonoAotMode.Full)}', '{nameof(MonoAotMode.LLVMOnly)}'. Received: '{Mode}'.", nameof(Mode));
+ }
+
+ switch (OutputType)
+ {
+ case "Normal": parsedOutputType = MonoAotOutputType.Normal; break;
+ case "AsmOnly": parsedOutputType = MonoAotOutputType.AsmOnly; break;
+ default:
+ throw new ArgumentException($"'{nameof(OutputType)}' must be one of: '{nameof(MonoAotOutputType.Normal)}', '{nameof(MonoAotOutputType.AsmOnly)}'. Received: '{OutputType}'.", nameof(OutputType));
+ }
+
+ if (parsedAotMode == MonoAotMode.LLVMOnly && !UseLLVM)
+ {
+ throw new ArgumentException($"'{nameof(UseLLVM)}' must be true when '{nameof(Mode)}' is {nameof(MonoAotMode.LLVMOnly)}.", nameof(UseLLVM));
+ }
+
+ Parallel.ForEach(Assemblies,
+ new ParallelOptions { MaxDegreeOfParallelism = DisableParallelAot ? 1 : Environment.ProcessorCount },
+ assemblyItem => PrecompileLibrary (assemblyItem));
+
+ CompiledAssemblies = compiledAssemblies.ToArray();
+
+ return true;
+ }
+
+ private void PrecompileLibrary(ITaskItem assemblyItem)
+ {
+ string assembly = assemblyItem.ItemSpec;
+ string directory = Path.GetDirectoryName(assembly)!;
+ var aotAssembly = new TaskItem(assembly);
+ var aotArgs = new List();
+ var processArgs = new List();
+
+ var a = assemblyItem.GetMetadata("AotArguments");
+ if (a != null)
+ {
+ aotArgs.AddRange(a.Split(";", StringSplitOptions.RemoveEmptyEntries));
+ }
+
+ var p = assemblyItem.GetMetadata("ProcessArguments");
+ if (p != null)
+ {
+ processArgs.AddRange(p.Split(";", StringSplitOptions.RemoveEmptyEntries));
+ }
+
+ Utils.LogInfo($"[AOT] {assembly}");
+
+ processArgs.Add("--debug");
+
+ // add LLVM options
+ if (UseLLVM)
+ {
+ processArgs.Add("--llvm");
+
+ aotArgs.Add($"nodebug"); // can't use debug symbols with LLVM
+ aotArgs.Add($"llvm-path={LLVMPath}");
+ }
+ else
+ {
+ processArgs.Add("--nollvm");
+ }
+
+ // compute output mode and file names
+ if (parsedAotMode == MonoAotMode.LLVMOnly)
+ {
+ aotArgs.Add("llvmonly");
+
+ string llvmBitcodeFile = Path.ChangeExtension(assembly, ".dll.bc");
+ aotArgs.Add($"outfile={llvmBitcodeFile}");
+ aotAssembly.SetMetadata("LlvmBitcodeFile", llvmBitcodeFile);
+ }
+ else
+ {
+ if (parsedAotMode == MonoAotMode.Full)
+ {
+ aotArgs.Add("full");
+ }
+
+ if (parsedOutputType == MonoAotOutputType.AsmOnly)
+ {
+ aotArgs.Add("asmonly");
+
+ string assemblerFile = Path.ChangeExtension(assembly, ".dll.s");
+ aotArgs.Add($"outfile={assemblerFile}");
+ aotAssembly.SetMetadata("AssemblerFile", assemblerFile);
+ }
+ else
+ {
+ string objectFile = Path.ChangeExtension(assembly, ".dll.o");
+ aotArgs.Add($"outfile={objectFile}");
+ aotAssembly.SetMetadata("ObjectFile", objectFile);
+ }
+
+ if (UseLLVM)
+ {
+ string llvmObjectFile = Path.ChangeExtension(assembly, ".dll-llvm.o");
+ aotArgs.Add($"llvm-outfile={llvmObjectFile}");
+ aotAssembly.SetMetadata("LlvmObjectFile", llvmObjectFile);
+ }
+ }
+
+ // pass msym-dir if specified
+ if (MsymPath != null)
+ {
+ aotArgs.Add($"msym-dir={MsymPath}");
+ }
+
+ string aotDataFile = Path.ChangeExtension(assembly, ".aotdata");
+ aotArgs.Add($"data-outfile={aotDataFile}");
+ aotAssembly.SetMetadata("AotDataFile", aotDataFile);
+
+ // we need to quote the entire --aot arguments here to make sure it is parsed
+ // on Windows as one argument. Otherwise it will be split up into multiple
+ // values, which wont work.
+ processArgs.Add($"\"--aot={String.Join(",", aotArgs)}\"");
+
+ processArgs.Add(assembly);
+
+ var envVariables = new Dictionary
+ {
+ {"MONO_PATH", directory},
+ {"MONO_ENV_OPTIONS", String.Empty} // we do not want options to be provided out of band to the cross compilers
+ };
+
+ // run the AOT compiler
+ Utils.RunProcess(CompilerBinaryPath, String.Join(" ", processArgs), envVariables, directory);
+
+ compiledAssemblies.Add(aotAssembly);
+ }
+}
+
+public enum MonoAotMode
+{
+ Normal,
+ Full,
+ LLVMOnly,
+}
+
+public enum MonoAotOutputType
+{
+ Normal,
+ AsmOnly,
+}
\ No newline at end of file
diff --git a/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.csproj b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.csproj
new file mode 100644
index 00000000000000..f5766a3fdcfb7f
--- /dev/null
+++ b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.csproj
@@ -0,0 +1,17 @@
+
+
+ Library
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.props b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.props
new file mode 100644
index 00000000000000..6824a7fc1c6f10
--- /dev/null
+++ b/src/mono/msbuild/AotCompilerTask/MonoAOTCompiler.props
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mono/msbuild/AotCompilerTask/Utils.cs b/src/mono/msbuild/AotCompilerTask/Utils.cs
new file mode 100644
index 00000000000000..ac649c9661843b
--- /dev/null
+++ b/src/mono/msbuild/AotCompilerTask/Utils.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+internal class Utils
+{
+ public static string RunProcess(
+ string path,
+ string args = "",
+ IDictionary? envVars = null,
+ string? workingDir = null,
+ bool ignoreErrors = false)
+ {
+ LogInfo($"Running: {path} {args}");
+ var outputBuilder = new StringBuilder();
+ var errorBuilder = new StringBuilder();
+ var processStartInfo = new ProcessStartInfo
+ {
+ FileName = path,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardError = true,
+ RedirectStandardOutput = true,
+ Arguments = args,
+ };
+
+ if (workingDir != null)
+ {
+ processStartInfo.WorkingDirectory = workingDir;
+ }
+
+ if (envVars != null)
+ {
+ foreach (KeyValuePair envVar in envVars)
+ {
+ processStartInfo.EnvironmentVariables[envVar.Key] = envVar.Value;
+ }
+ }
+
+ Process process = Process.Start(processStartInfo)!;
+ process.ErrorDataReceived += (sender, e) =>
+ {
+ LogError(e.Data);
+ outputBuilder.AppendLine(e.Data);
+ errorBuilder.AppendLine(e.Data);
+ };
+ process.OutputDataReceived += (sender, e) =>
+ {
+ LogInfo(e.Data);
+ outputBuilder.AppendLine(e.Data);
+ };
+ process.BeginOutputReadLine();
+ process.BeginErrorReadLine();
+ process.WaitForExit();
+ if (process.ExitCode != 0)
+ {
+ throw new Exception("Error: " + errorBuilder);
+ }
+
+ return outputBuilder.ToString().Trim('\r','\n');
+ }
+
+ public static TaskLoggingHelper? Logger { get; set; }
+
+ public static void LogInfo(string? msg)
+ {
+ if (msg != null)
+ {
+ Logger?.LogMessage(MessageImportance.High, msg);
+ }
+ }
+
+ public static void LogError(string? msg)
+ {
+ if (msg != null)
+ {
+ Logger?.LogError(msg);
+ }
+ }
+}
diff --git a/src/mono/msbuild/AppleAppBuilder/AotCompiler.cs b/src/mono/msbuild/AppleAppBuilder/AotCompiler.cs
deleted file mode 100644
index 5a5b8f9ae8b555..00000000000000
--- a/src/mono/msbuild/AppleAppBuilder/AotCompiler.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading.Tasks;
-
-internal class AotCompiler
-{
- ///
- /// Precompile all assemblies in parallel
- ///
- public static void PrecompileLibraries(
- string crossCompiler,
- string arch,
- bool parallel,
- string binDir,
- string[] libsToPrecompile,
- IDictionary envVariables,
- bool optimize,
- bool useLlvm,
- string? llvmPath)
- {
- Parallel.ForEach(libsToPrecompile,
- new ParallelOptions { MaxDegreeOfParallelism = parallel ? Environment.ProcessorCount : 1 },
- lib => PrecompileLibrary(crossCompiler, arch, binDir, lib, envVariables, optimize, useLlvm, llvmPath));
- }
-
- private static void PrecompileLibrary(
- string crossCompiler,
- string arch,
- string binDir,
- string libToPrecompile,
- IDictionary envVariables,
- bool optimize,
- bool useLlvm,
- string? llvmPath)
- {
- Utils.LogInfo($"[AOT] {libToPrecompile}");
-
- var crossArgs = new StringBuilder();
- crossArgs
- .Append(" -O=gsharedvt")
- .Append(" -O=-float32")
- .Append(useLlvm ? " --llvm" : " --nollvm")
- .Append(" --debug");
-
- string libName = Path.GetFileNameWithoutExtension(libToPrecompile);
- var aotArgs = new StringBuilder();
- aotArgs
- .Append("mtriple=").Append(arch).Append("-ios,")
- .Append("static,")
- .Append("asmonly,")
- .Append("direct-icalls,")
- .Append("nodebug,")
- .Append("dwarfdebug,")
- .Append("outfile=").Append(Path.Combine(binDir, libName + ".dll.s,"))
- .Append("msym-dir=").Append(Path.Combine(binDir, "Msym,"))
- .Append("data-outfile=").Append(Path.Combine(binDir, libName + ".aotdata,"))
- // TODO: enable direct-pinvokes (to get rid of -force_loads)
- //.Append("direct-pinvoke,")
- .Append("full,")
- .Append("mattr=+crc,"); // enable System.Runtime.Intrinsics.Arm (Crc32 and ArmBase for now)
-
- if (useLlvm)
- {
- aotArgs
- .Append("llvm-path=").Append(llvmPath).Append(',')
- .Append("llvm-outfile=").Append(Path.Combine(binDir, libName + ".dll-llvm.o,"));
- // it has -llvm.o suffix because we need both LLVM and non-LLVM bits for every assembly
- // most of the stuff from non-llvm .o will be linked out.
- }
-
- // TODO: enable Interpreter
-
- crossArgs
- .Append(" --aot=").Append(aotArgs).Append(" ")
- .Append(libToPrecompile);
-
- Utils.RunProcess(crossCompiler, crossArgs.ToString(), envVariables, binDir);
-
- var clangArgs = new StringBuilder();
- if (optimize)
- {
- clangArgs.Append(" -Os");
- }
- clangArgs
- .Append(" -isysroot ").Append(Xcode.Sysroot)
- .Append(" -miphoneos-version-min=10.1")
- .Append(" -arch ").Append(arch)
- .Append(" -c ").Append(Path.Combine(binDir, libName)).Append(".dll.s")
- .Append(" -o ").Append(Path.Combine(binDir, libName)).Append(".dll.o");
-
- Utils.RunProcess("clang", clangArgs.ToString(), workingDir: binDir);
- }
-
- public static void GenerateLinkAllFile(string[] objFiles, string outputFile)
- {
- // Generates 'modules.m' in order to register all managed libraries
- //
- //
- // extern void *mono_aot_module_Lib1_info;
- // extern void *mono_aot_module_Lib2_info;
- // ...
- //
- // void mono_ios_register_modules (void)
- // {
- // mono_aot_register_module (mono_aot_module_Lib1_info);
- // mono_aot_register_module (mono_aot_module_Lib2_info);
- // ...
- // }
-
- Utils.LogInfo("Generating 'modules.m'...");
-
- var lsDecl = new StringBuilder();
- lsDecl
- .AppendLine("#include ")
- .AppendLine("#include ")
- .AppendLine()
- .AppendLine("#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR")
- .AppendLine();
-
- var lsUsage = new StringBuilder();
- lsUsage
- .AppendLine("void mono_ios_register_modules (void)")
- .AppendLine("{");
- foreach (string objFile in objFiles)
- {
- string symbol = "mono_aot_module_" +
- Path.GetFileName(objFile)
- .Replace(".dll.o", "")
- .Replace(".", "_")
- .Replace("-", "_") + "_info";
-
- lsDecl.Append("extern void *").Append(symbol).Append(';').AppendLine();
- lsUsage.Append("\tmono_aot_register_module (").Append(symbol).Append(");").AppendLine();
- }
- lsDecl
- .AppendLine()
- .Append(lsUsage)
- .AppendLine("}")
- .AppendLine()
- .AppendLine("#endif")
- .AppendLine();
-
- File.WriteAllText(outputFile, lsDecl.ToString());
- Utils.LogInfo($"Saved to {outputFile}.");
- }
-}
diff --git a/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.cs b/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.cs
index bdf5362a888187..41bc3cb75eebe3 100644
--- a/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.cs
+++ b/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.cs
@@ -6,18 +6,13 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Text;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class AppleAppBuilderTask : Task
{
- ///
- /// Path to arm64 AOT cross-compiler (mono-aot-cross)
- /// It's not used for x64 (Simulator)
- ///
- public string? CrossCompiler { get; set; }
-
///
/// ProjectName is used as an app name, bundleId and xcode project name
///
@@ -43,20 +38,20 @@ public class AppleAppBuilderTask : Task
public string MainLibraryFileName { get; set; } = ""!;
///
- /// Path to store build artifacts
+ /// List of paths to assemblies to be included in the app. For AOT builds the 'ObjectFile' metadata key needs to point to the object file.
///
- public string? OutputDirectory { get; set; }
+ [Required]
+ public ITaskItem[] Assemblies { get; set; } = Array.Empty();
///
- /// Produce optimized binaries (e.g. use -O2 in AOT)
- /// and use 'Release' config in xcode
+ /// Path to store build artifacts
///
- public bool Optimized { get; set; }
+ public string? OutputDirectory { get; set; }
///
- /// Disable parallel AOT compilation
+ /// Produce optimized binaries and use 'Release' config in xcode
///
- public bool DisableParallelAot { get; set; }
+ public bool Optimized { get; set; }
///
/// Target arch, can be "arm64" (device) or "x64" (simulator) at the moment
@@ -96,18 +91,6 @@ public class AppleAppBuilderTask : Task
///
public bool UseConsoleUITemplate { get; set; }
- ///
- /// Use LLVM for FullAOT
- /// The cross-compiler must be built with LLVM support
- ///
- public bool UseLlvm { get; set; }
-
- ///
- /// Path to LLVM binaries (opt and llc)
- /// It's required if UseLlvm is set
- ///
- public string? LlvmPath { get; set; }
-
///
/// Path to *.app bundle
///
@@ -124,10 +107,6 @@ public override bool Execute()
{
Utils.Logger = Log;
bool isDevice = Arch.Equals("arm64", StringComparison.InvariantCultureIgnoreCase);
- if (isDevice && string.IsNullOrEmpty(CrossCompiler))
- {
- throw new ArgumentException("arm64 arch requires CrossCompiler");
- }
if (!File.Exists(Path.Combine(AppDir, MainLibraryFileName)))
{
@@ -139,12 +118,6 @@ public override bool Execute()
throw new ArgumentException($"ProjectName='{ProjectName}' should not contain spaces");
}
- if (UseLlvm && string.IsNullOrEmpty(LlvmPath))
- {
- // otherwise we might accidentally use some random llc/opt from PATH (installed with clang)
- throw new ArgumentException($"LlvmPath shoun't be empty when UseLlvm is set");
- }
-
string[] excludes = new string[0];
if (ExcludeFromAppDir != null)
{
@@ -153,9 +126,6 @@ public override bool Execute()
.Select(i => i.ItemSpec)
.ToArray();
}
- string[] libsToAot = Directory.GetFiles(AppDir, "*.dll")
- .Where(f => !excludes.Contains(Path.GetFileName(f)))
- .ToArray();
string binDir = Path.Combine(AppDir, $"bin-{ProjectName}-{Arch}");
if (!string.IsNullOrEmpty(OutputDirectory))
@@ -164,25 +134,30 @@ public override bool Execute()
}
Directory.CreateDirectory(binDir);
- // run AOT compilation only for devices
- if (isDevice)
+ var assemblerFiles = new List();
+ foreach (ITaskItem file in Assemblies)
{
- if (string.IsNullOrEmpty(CrossCompiler))
- throw new InvalidOperationException("cross-compiler is not set");
+ // use AOT files if available
+ var obj = file.GetMetadata("AssemblerFile");
+ if (!String.IsNullOrEmpty(obj))
+ {
+ assemblerFiles.Add(obj);
+ }
+ }
- AotCompiler.PrecompileLibraries(CrossCompiler, Arch, !DisableParallelAot, binDir, libsToAot,
- new Dictionary { {"MONO_PATH", AppDir} },
- Optimized, UseLlvm, LlvmPath);
+ if (isDevice && !assemblerFiles.Any())
+ {
+ throw new InvalidOperationException("Need list of AOT files for device builds.");
}
// generate modules.m
- AotCompiler.GenerateLinkAllFile(
- Directory.GetFiles(binDir, "*.dll.o"),
+ GenerateLinkAllFile(
+ assemblerFiles,
Path.Combine(binDir, "modules.m"));
if (GenerateXcodeProject)
{
- XcodeProjectPath = Xcode.GenerateXCode(ProjectName, MainLibraryFileName,
+ XcodeProjectPath = Xcode.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, NativeMainSource);
if (BuildAppBundle)
@@ -203,4 +178,57 @@ public override bool Execute()
return true;
}
+
+ static void GenerateLinkAllFile(IEnumerable asmFiles, string outputFile)
+ {
+ // Generates 'modules.m' in order to register all managed libraries
+ //
+ //
+ // extern void *mono_aot_module_Lib1_info;
+ // extern void *mono_aot_module_Lib2_info;
+ // ...
+ //
+ // void mono_ios_register_modules (void)
+ // {
+ // mono_aot_register_module (mono_aot_module_Lib1_info);
+ // mono_aot_register_module (mono_aot_module_Lib2_info);
+ // ...
+ // }
+
+ Utils.LogInfo("Generating 'modules.m'...");
+
+ var lsDecl = new StringBuilder();
+ lsDecl
+ .AppendLine("#include ")
+ .AppendLine("#include ")
+ .AppendLine()
+ .AppendLine("#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR")
+ .AppendLine();
+
+ var lsUsage = new StringBuilder();
+ lsUsage
+ .AppendLine("void mono_ios_register_modules (void)")
+ .AppendLine("{");
+ foreach (string asmFile in asmFiles)
+ {
+ string symbol = "mono_aot_module_" +
+ Path.GetFileName(asmFile)
+ .Replace(".dll.s", "")
+ .Replace(".", "_")
+ .Replace("-", "_") + "_info";
+
+ lsDecl.Append("extern void *").Append(symbol).Append(';').AppendLine();
+ lsUsage.Append("\tmono_aot_register_module (").Append(symbol).Append(");").AppendLine();
+ }
+ lsDecl
+ .AppendLine()
+ .Append(lsUsage)
+ .AppendLine("}")
+ .AppendLine()
+ .AppendLine("#endif")
+ .AppendLine();
+
+ File.WriteAllText(outputFile, lsDecl.ToString());
+ Utils.LogInfo($"Saved to {outputFile}.");
+ }
}
diff --git a/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.csproj b/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.csproj
index 32022609a7d619..859da678a7d27f 100644
--- a/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.csproj
+++ b/src/mono/msbuild/AppleAppBuilder/AppleAppBuilder.csproj
@@ -14,7 +14,6 @@
-
diff --git a/src/mono/msbuild/AppleAppBuilder/Templates/CMakeLists.txt.template b/src/mono/msbuild/AppleAppBuilder/Templates/CMakeLists.txt.template
index 78afc51ecd1d10..8ba0e854c063ed 100644
--- a/src/mono/msbuild/AppleAppBuilder/Templates/CMakeLists.txt.template
+++ b/src/mono/msbuild/AppleAppBuilder/Templates/CMakeLists.txt.template
@@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.14.5)
project(%ProjectName%)
+enable_language(OBJC ASM)
set(APP_RESOURCES
%AppResources%
@@ -15,6 +16,8 @@ add_executable(
${APP_RESOURCES}
)
+%AotSources%
+
include_directories("%MonoInclude%")
set_target_properties(%ProjectName% PROPERTIES
diff --git a/src/mono/msbuild/AppleAppBuilder/Xcode.cs b/src/mono/msbuild/AppleAppBuilder/Xcode.cs
index 305e5d45762565..5c51e245135f22 100644
--- a/src/mono/msbuild/AppleAppBuilder/Xcode.cs
+++ b/src/mono/msbuild/AppleAppBuilder/Xcode.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
@@ -14,6 +15,7 @@ internal class Xcode
public static string GenerateXCode(
string projectName,
string entryPointLib,
+ IEnumerable asmFiles,
string workspace,
string binDir,
string monoInclude,
@@ -66,12 +68,18 @@ public static string GenerateXCode(
toLink += $" \"-force_load {lib}\"{Environment.NewLine}";
}
}
- foreach (string lib in Directory.GetFiles(binDir, "*.dll.o"))
+
+ string aotSources = "";
+ foreach (string asm in asmFiles)
{
// these libraries are linked via modules.m
- toLink += $" \"{lib}\"{Environment.NewLine}";
+ var name = Path.GetFileNameWithoutExtension(asm);
+ aotSources += $"add_library({name} OBJECT {asm}){Environment.NewLine}";
+ toLink += $" {name}{Environment.NewLine}";
}
+
cmakeLists = cmakeLists.Replace("%NativeLibrariesToLink%", toLink);
+ cmakeLists = cmakeLists.Replace("%AotSources%", aotSources);
string plist = Utils.GetEmbeddedResource("Info.plist.template")
.Replace("%BundleIdentifier%", projectName);
diff --git a/src/mono/netcore/System.Private.CoreLib/src/LinkerDescriptor/System.Private.CoreLib.xml b/src/mono/netcore/System.Private.CoreLib/src/LinkerDescriptor/System.Private.CoreLib.xml
index 57d8454b006e47..3489337befd197 100644
--- a/src/mono/netcore/System.Private.CoreLib/src/LinkerDescriptor/System.Private.CoreLib.xml
+++ b/src/mono/netcore/System.Private.CoreLib/src/LinkerDescriptor/System.Private.CoreLib.xml
@@ -386,6 +386,9 @@
+
+
+
diff --git a/src/mono/netcore/sample/Android/Program.csproj b/src/mono/netcore/sample/Android/Program.csproj
index 7a7247fda82d5d..00831a0d344eb8 100644
--- a/src/mono/netcore/sample/Android/Program.csproj
+++ b/src/mono/netcore/sample/Android/Program.csproj
@@ -7,7 +7,7 @@
x64
$(ArtifactsDir)bin\lib-runtime-packs\$(NetCoreAppCurrent)-Android-$(Configuration)-$(TargetArchitecture)\runtimes\android-$(TargetArchitecture)
$(MSBuildThisFileDirectory)\bin\bundle
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder', '$(NetCoreAppCurrent)-$(Configuration)'))
@@ -15,8 +15,8 @@
Properties="Configuration=$(Configuration);Platform=$(HostArch)" Targets="Restore;Build" />
-
+
diff --git a/src/mono/netcore/sample/iOS/Makefile b/src/mono/netcore/sample/iOS/Makefile
index 31a7e9340f5f62..40a59f0c07e8d2 100644
--- a/src/mono/netcore/sample/iOS/Makefile
+++ b/src/mono/netcore/sample/iOS/Makefile
@@ -12,7 +12,7 @@ program:
bundle: clean program
$(DOTNET) msbuild /t:BuildAppBundle /p:Configuration=$(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
- /p:UseLlvm=$(USE_LLVM)
+ /p:UseLLVM=$(USE_LLVM)
deploy-sim:
$(DOTNET) msbuild /t:IosDeployToSimulator /p:Configuration=$(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH)
diff --git a/src/mono/netcore/sample/iOS/Program.csproj b/src/mono/netcore/sample/iOS/Program.csproj
index 32e8b6ef336cd3..473832246ae0b3 100644
--- a/src/mono/netcore/sample/iOS/Program.csproj
+++ b/src/mono/netcore/sample/iOS/Program.csproj
@@ -4,11 +4,14 @@
bin
Portable
$(NetCoreAppCurrent)
+ iOS
x64
$(ArtifactsDir)bin\lib-runtime-packs\$(NetCoreAppCurrent)-iOS-$(Configuration)-$(TargetArchitecture)\runtimes\ios-$(TargetArchitecture)
$(ArtifactsDir)bin\mono\iOS.$(TargetArchitecture).$(Configuration)
$(MSBuildThisFileDirectory)\bin\bundle
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AppleAppBuilder'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AppleAppBuilder', '$(NetCoreAppCurrent)-$(Configuration)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'MonoAOTCompiler', '$(NetCoreAppCurrent)-$(Configuration)'))
+ true
@@ -16,39 +19,72 @@
Properties="Configuration=$(Configuration);Platform=$(HostArch)" Targets="Restore;Build" />
-
+
+
+
-
-
- arm64
- x64
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+ @(MonoAOTCompilerDefaultAotArguments, ';')
+ @(MonoAOTCompilerDefaultProcessArguments, ';')
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+