You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[MonoAOTCompiler] more properties & custom WorkingDirectory (#62725)
Fixes: #56163
PR #58523 fixed something on Windows, but it didn't actually address
our issues on Android.
A directory name like `foo Ümläüts` fails:
* `mkdir 'foo Ümläüts' ; cd 'foo Ümläüts'`
* `dotnet new android`
* `dotnet build -c Release -p:RunAOTCompilation=true` (adding
`-p:EnableLLVM=true` complicates further)
The error:
Precompiling failed for C:\src\foo Ümläüts\obj\Release\android-arm64\linked\System.Private.CoreLib.dll: Error: Loaded assembly 'C:\src\foo ├£ml├ñ├╝ts\obj\Release\android-arm64\linked\System.Private.CoreLib.dll' doesn't match original file name 'C:\foo ▄mlΣⁿts\obj\Release\android-arm64\linked\System.Private.CoreLib.dll'. Set MONO_PATH to the assembly's location.
Reviewing the existing AOT implementation in Xamarin.Android, I found
out *why* Xamarin.Android works:
[AOT] response file obj\Release\120\aot\arm64-v8a\App36.dll\response.txt: --llvm "--aot=temp-path=obj\Release\120\aot\arm64-v8a\App36.dll,llvm-path=C:\Program Files\Microsoft Visual Studio\2022\Preview\MSBuild\Xamarin\Android,outfile=obj\Release\120\aot\arm64-v8a\libaot-App36.dll.so,msym-dir=obj\Release\120\aot\arm64-v8a,asmwriter,mtriple=aarch64-linux-android,tool-prefix=C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-,ld-name=ld.EXE,ld-flags=\"-LC:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib\gcc\aarch64-linux-android\4.9.x\";\"-LC:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm64\usr\lib\";\"C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib\gcc\aarch64-linux-android\4.9.x\libgcc.a\";\"C:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm64\usr\lib\libc.so\";\"C:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm64\usr\lib\libm.so\"" C:\Users\jopepper\source\repos\App36\App36\obj\Release\120\android\assets\shrunk\App36.dll
1. Xamarin.Android passes *relative* paths. The `foo Ümläüts`
directory name doesn't even come into play for some arguments.
2. With LLVM, `ld-flags` contains a `;`.
The existing code splits on `;` and joins on `,`:
https://github.com/dotnet/runtime/blob/25c207351c4f57cf2daa98caaf327a8b8d83edb8/src/tasks/AotCompilerTask/MonoAOTCompiler.cs#L505-L509
So we lose any `;` delimiters for the `ld-flags` value, they get
replaced by `,`.
I think the solution here is:
1. Add several missing properties to `<MonoAOTCompiler/>` so we don't
have to rely on the `%(AotArguments)` item metadata. No splitting
on `;` would be required, `ld-flags` can be passed in and used as-is.
2. Add a new `WorkingDirectory` property. When this is set, assume
paths passed in might be relative -- and don't transform paths by
calling `Path.GetFullPath()`.
Lastly, I fixed a place where the UTF8 encoding wasn't passed when
MSBuild logging the response file.
These changes I tried to make in a way where this shouldn't break
other .NET workloads like wasm. If existing MSBuild targets call this
task (not using the new properties), the behavior should remain
unchanged.
I tested these changes by commiting a modified `MonoAOTCompiler.dll`:
dotnet/android#6562
I'm able to enable several AOT tests related to #56163.
0 commit comments