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, ';') + + + + + + + - - - - - + + + + + +