From e892b77c2edad5e986bf7127a792c99dc6d88c10 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 1 Jun 2021 10:07:18 +0100 Subject: [PATCH 1/2] [Xamarin.Android.Build.Tasks] Quote Aot Paths (again) Fixes #5964 We missed a few paths which might need to be quoted in order to handle spaces in the paths. ``` 2021-05-28T22:15:09.3191452Z [aot-compiler stdout] Executing the native linker: "C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE" -Bsymbolic -shared -o obj\Release\110\aot\armeabi-v7a\libaot-Xamarin.AndroidX.CardView.dll.so.tmp "obj\Release\110\aot\armeabi-v7a\Xamarin.AndroidX.CardView.dll\temp-llvm.o" obj\Release\110\aot\armeabi-v7a\Xamarin.AndroidX.CardView.dll\temp.s.o -LC:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x -LC:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib -LC:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\..\sysroot\usr\lib\arm-linux-androideabi "C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x\libgcc.a" "C:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib\libc.so" "C:\Program Files (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib\libm.so" 2021-05-28T22:15:09.3195848Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open Files: No such file or directory 2021-05-28T22:15:09.3197593Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x: No such file or directory 2021-05-28T22:15:09.3199375Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open Files: No such file or directory 2021-05-28T22:15:09.3200935Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open (x86)\Android\android-sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib: No such file or directory 2021-05-28T22:15:09.3202549Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open Files: No such file or directory 2021-05-28T22:15:09.3204244Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot open (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\..\sysroot\usr\lib\arm-linux-androideabi: No such file or directory 2021-05-28T22:15:09.3205865Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot find -lunwind 2021-05-28T22:15:09.3207138Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot find -lcompiler_rt-extras 2021-05-28T22:15:09.3208785Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot find -lgcc_real 2021-05-28T22:15:09.3210086Z [aot-compiler stderr] C:\Program Files (x86)\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.EXE: error: cannot find -ldl ``` So lets quote ALL the things. --- src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs | 21 +++++------ .../Xamarin.Android.Build.Tests/AotTests.cs | 36 +++++++++++++++++++ .../Xamarin.Android.Build.Tests.csproj | 1 + .../Android/AndroidSdkResolver.cs | 8 +++-- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs index 97d7388e193..311c1ba4589 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs @@ -304,7 +304,7 @@ IEnumerable GetAotConfigs () outdir = Path.Combine (AotOutputDirectory, "arm64-v8a"); mtriple = "aarch64-linux-android"; arch = AndroidTargetArch.Arm64; - break; + break; case "x86": aotCompiler = Path.Combine (sdkBinDirectory, "cross-x86"); @@ -366,21 +366,21 @@ IEnumerable GetAotConfigs () var libs = new List(); if (NdkUtil.UsingClangNDK) { - libs.Add ($"-L{toolchainLibDir}"); - libs.Add ($"-L{androidLibPath}"); + libs.Add ($"-L{toolchainLibDir.TrimEnd ('\\')}"); + libs.Add ($"-L{androidLibPath.TrimEnd ('\\')}"); if (arch == AndroidTargetArch.Arm) { // Needed for -lunwind to work string compilerLibDir = Path.Combine (toolchainPath, "..", "sysroot", "usr", "lib", NdkUtil.GetArchDirName (arch)); - libs.Add ($"-L{compilerLibDir}"); + libs.Add ($"-L{compilerLibDir.TrimEnd ('\\')}"); } } - libs.Add ($"\\\"{Path.Combine (toolchainLibDir, "libgcc.a")}\\\""); - libs.Add ($"\\\"{Path.Combine (androidLibPath, "libc.so")}\\\""); - libs.Add ($"\\\"{Path.Combine (androidLibPath, "libm.so")}\\\""); + libs.Add (Path.Combine (toolchainLibDir, "libgcc.a")); + libs.Add (Path.Combine (androidLibPath, "libc.so")); + libs.Add (Path.Combine (androidLibPath, "libm.so")); - ldFlags = string.Join(";", libs); + ldFlags = $"\\\"{string.Join("\\\";\\\"", libs)}\\\""; } string ldName = String.Empty; @@ -391,6 +391,7 @@ IEnumerable GetAotConfigs () if (ldName.IndexOf ('-') >= 0) { ldName = ldName.Substring (ldName.LastIndexOf ("-") + 1); } + ldName=$"\\\"{ldName}\\\""; } } else { ldName = "ld"; @@ -466,7 +467,7 @@ IEnumerable GetAotConfigs () } } } - + bool RunAotCompiler (string assembliesPath, string aotCompiler, string aotOptions, string assembly, string responseFile) { var stdout_completed = new ManualResetEvent (false); @@ -487,7 +488,7 @@ bool RunAotCompiler (string assembliesPath, string aotCompiler, string aotOption WindowStyle=ProcessWindowStyle.Hidden, WorkingDirectory = WorkingDirectory, }; - + // we do not want options to be provided out of band to the cross compilers psi.EnvironmentVariables ["MONO_ENV_OPTIONS"] = String.Empty; // the C code cannot parse all the license details, including the activation code that tell us which license level is allowed diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs index 8b771c94c70..bb8e58a32d1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs @@ -7,6 +7,7 @@ using Mono.Cecil; using NUnit.Framework; using Xamarin.ProjectTools; +using Xamarin.Android.Build; namespace Xamarin.Android.Build.Tests { @@ -14,6 +15,41 @@ namespace Xamarin.Android.Build.Tests [Parallelizable (ParallelScope.Children)] public class AotTests : BaseTest { + public string SdkWithSpacesPath { + get { + return Path.Combine (Root, "temp", string.Format ("SDK Ümläüts")); + } + } + + [OneTimeSetUp] + public void Setup () + { + if (!IsWindows) + return; + + var sdkPath = AndroidSdkPath; + var ndkPath = AndroidNdkPath; + + var symSdkPath = Path.Combine (SdkWithSpacesPath, "sdk"); + var symNdkPath = Path.Combine (SdkWithSpacesPath, "ndk"); + + SymbolicLink.Create (symSdkPath, sdkPath); + SymbolicLink.Create (symNdkPath, ndkPath); + + Environment.SetEnvironmentVariable ("TEST_ANDROID_SDK_PATH", symSdkPath); + Environment.SetEnvironmentVariable ("TEST_ANDROID_NDK_PATH", symNdkPath); + } + + [OneTimeTearDown] + public void TearDown () + { + if (!IsWindows) + return; + Environment.SetEnvironmentVariable ("TEST_ANDROID_SDK_PATH", ""); + Environment.SetEnvironmentVariable ("TEST_ANDROID_NDK_PATH", ""); + Directory.Delete (SdkWithSpacesPath, recursive: true); + } + [Test, Category ("SmokeTests")] public void BuildBasicApplicationReleaseProfiledAot () { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj index 8cef187dea6..e5564231596 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj @@ -28,6 +28,7 @@ + ..\Expected\GenerateDesignerFileExpected.cs PreserveNewest diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidSdkResolver.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidSdkResolver.cs index c037ec07643..6fdb866bc38 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidSdkResolver.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidSdkResolver.cs @@ -22,7 +22,9 @@ static string GetPathFromRegistry (string valueName) public static string GetAndroidSdkPath () { - var sdkPath = Environment.GetEnvironmentVariable ("ANDROID_SDK_PATH"); + var sdkPath = Environment.GetEnvironmentVariable ("TEST_ANDROID_SDK_PATH"); + if (String.IsNullOrEmpty (sdkPath)) + sdkPath = Environment.GetEnvironmentVariable ("ANDROID_SDK_PATH"); if (String.IsNullOrEmpty (sdkPath)) sdkPath = GetPathFromRegistry ("AndroidSdkDirectory"); if (String.IsNullOrEmpty (sdkPath)) @@ -34,7 +36,9 @@ public static string GetAndroidSdkPath () public static string GetAndroidNdkPath () { - var ndkPath = Environment.GetEnvironmentVariable ("ANDROID_NDK_PATH"); + var ndkPath = Environment.GetEnvironmentVariable ("TEST_ANDROID_NDK_PATH"); + if (String.IsNullOrEmpty (ndkPath)) + ndkPath = Environment.GetEnvironmentVariable ("ANDROID_NDK_PATH"); if (String.IsNullOrEmpty (ndkPath)) ndkPath = GetPathFromRegistry ("AndroidNdkDirectory"); if (String.IsNullOrEmpty (ndkPath)) From bdef15f9c48cea72ceeddbf69183fd0a666d0d6b Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Wed, 2 Jun 2021 19:11:13 +0100 Subject: [PATCH 2/2] Back out the ld-name quote change --- src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs index 311c1ba4589..acc5fef88ca 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs @@ -391,7 +391,6 @@ IEnumerable GetAotConfigs () if (ldName.IndexOf ('-') >= 0) { ldName = ldName.Substring (ldName.LastIndexOf ("-") + 1); } - ldName=$"\\\"{ldName}\\\""; } } else { ldName = "ld";