From 13cee08e51b5e8e4f1c180af14f9eade135b9993 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Fri, 26 Aug 2016 11:03:35 +0100 Subject: [PATCH] [Xamarin.Android.Build.Utilities] Xamarin can't find NDK 12b because ndk-stack.exe is now ndk-stack.cmd Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=42566 The problem was that we did not UPDATE the ndk-stack.exe property to be ndk-stack.cmd once we had verified that the ndk was valid. Seeing as this is not the first time google has changed an extension on a executable we need to do some re-work on these classes. Firstly we'll default all the values to the 'unix' ones. We will then use the new Executables method to search for the other exe's on initalization and update the properties accordinly. However because some of the files (the java related ones) are in other paths (like build-tools/x.x.x.x) we will override those on windows to give them the exepcted .exe extension. --- .../Sdks/AndroidSdkBase.cs | 51 +++++++++++++------ .../Sdks/AndroidSdkUnix.cs | 11 ---- .../Sdks/AndroidSdkWindows.cs | 14 ++--- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs index eef691130a3..4bc52f4545c 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs @@ -34,18 +34,18 @@ public string[] AllAndroidNdks { public string AndroidToolsPathShort { get; private set; } public string AndroidPlatformToolsPathShort { get; private set; } - public abstract string Adb { get; } - public abstract string Android { get; } - public abstract string Emulator { get; } - public abstract string Monitor { get; } - public abstract string ZipAlign { get; } - public abstract string JarSigner { get; } - public abstract string KeyTool { get; } - - public abstract string NdkStack { get; } + public virtual string Adb { get; protected set; } = "adb"; + public virtual string Android { get; protected set; } = "android"; + public virtual string Emulator { get; protected set; } = "emulator"; + public virtual string Monitor { get; protected set; } = "monitor"; + public virtual string ZipAlign { get; protected set; } = "zipalign"; + public virtual string JarSigner { get; protected set; } = "jarsigner"; + public virtual string KeyTool { get; protected set; } = "keytool"; + + public virtual string NdkStack { get; protected set; } = "ndk-stack"; public abstract string NdkHostPlatform32Bit { get; } public abstract string NdkHostPlatform64Bit { get; } - public abstract string Javac { get; } + public virtual string Javac { get; protected set; } = "javac"; public abstract string PreferedAndroidSdkPath { get; } public abstract string PreferedAndroidNdkPath { get; } @@ -81,6 +81,13 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP IsNdk64Bit = Directory.EnumerateDirectories (toolchainsDir, "arm-linux-androideabi-*") .Any (dir => Directory.Exists (Path.Combine (dir, "prebuilt", NdkHostPlatform64Bit))); } + // we need to look for extensions other than the default .exe|.bat + // google have a habbit of changing them. + Adb = GetExecutablePath (AndroidPlatformToolsPath, Adb); + Android = GetExecutablePath (AndroidToolsPath, Android); + Emulator = GetExecutablePath (AndroidToolsPath, Emulator); + Monitor = GetExecutablePath (AndroidToolsPath, Monitor); + NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack); } protected abstract IEnumerable GetAllAvailableAndroidSdks (); @@ -136,16 +143,22 @@ protected IEnumerable FindExecutableInPath (string executable) protected IEnumerable FindExecutableInDirectory(string executable, string dir) { + foreach (var exe in Executables (executable)) + if (File.Exists (Path.Combine (dir, exe))) + yield return dir; + } + + IEnumerable Executables (string executable) + { + yield return executable; var pathExt = Environment.GetEnvironmentVariable ("PATHEXT"); var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); - - if (File.Exists (Path.Combine (dir, (executable)))) - yield return dir; + if (pathExts == null) yield break; + foreach (var ext in pathExts) - if (File.Exists (Path.Combine (dir, Path.ChangeExtension (executable, ext)))) - yield return dir; + yield return Path.ChangeExtension (executable, ext); } protected string NullIfEmpty (string s) @@ -155,6 +168,14 @@ protected string NullIfEmpty (string s) return null; } + + string GetExecutablePath (string dir, string exe) + { + foreach (var e in Executables (exe)) + if (File.Exists (Path.Combine (dir, e))) + return e; + return exe; + } } } diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs index 93d624d3ae8..0545c90cdc0 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs @@ -8,15 +8,6 @@ namespace Xamarin.Android.Build.Utilities { class AndroidSdkUnix : AndroidSdkBase { - public override string Adb { get { return "adb"; } } - public override string Android { get { return "android"; } } - public override string Emulator { get { return "emulator"; } } - public override string Monitor { get { return "monitor"; } } - public override string ZipAlign { get { return "zipalign"; } } - public override string JarSigner { get { return "jarsigner"; } } - public override string KeyTool { get { return "keytool"; } } - public override string NdkStack { get { return "ndk-stack"; } } - public override string NdkHostPlatform32Bit { get { return OS.IsMac ? "darwin-x86" : "linux-x86"; } } @@ -24,8 +15,6 @@ public override string NdkHostPlatform64Bit { get { return OS.IsMac ? "darwin-x86_64" : "linux-x86_64"; } } - public override string Javac { get { return "javac"; } } - public override string PreferedAndroidSdkPath { get { var config_file = GetUnixConfigFile (); diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs index 33beb3a7e78..1a93d52a7f4 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs @@ -15,17 +15,13 @@ class AndroidSdkWindows : AndroidSdkBase const string XAMARIN_ANDROID_INSTALLER_PATH = @"SOFTWARE\Xamarin\MonoAndroid"; const string XAMARIN_ANDROID_INSTALLER_KEY = "PrivateAndroidSdkPath"; - public override string Adb { get { return "adb.exe"; } } - public override string Android { get { return "android.bat"; } } - public override string Emulator { get { return "emulator.exe"; } } - public override string Monitor { get { return "monitor.bat"; } } - public override string ZipAlign { get { return "zipalign.exe"; } } - public override string JarSigner { get { return "jarsigner.exe"; } } - public override string KeyTool { get { return "keytool.exe"; } } - public override string NdkStack { get { return "ndk-stack.exe"; } } + public override string ZipAlign { get; protected set; } = "zipalign.exe"; + public override string JarSigner { get; protected set; } = "jarsigner.exe"; + public override string KeyTool { get; protected set; } = "keytool.exe"; + public override string NdkHostPlatform32Bit { get { return "windows"; } } public override string NdkHostPlatform64Bit { get { return "windows-x86_64"; } } - public override string Javac { get { return "javac.exe"; } } + public override string Javac { get; protected set; } = "javac.exe"; public override string PreferedAndroidSdkPath { get {