Skip to content

Commit f8dd1a4

Browse files
committed
[Xamarin.Android.Build.Utilities] Xamarin can't use NDK 12b as ndk-stack.exe is now ndk-stack.cmd (#188)
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.
1 parent 2ff9afe commit f8dd1a4

File tree

3 files changed

+54
-40
lines changed

3 files changed

+54
-40
lines changed

src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ public string[] AllAndroidNdks {
3434
public string AndroidToolsPathShort { get; private set; }
3535
public string AndroidPlatformToolsPathShort { get; private set; }
3636

37-
public abstract string Adb { get; }
38-
public abstract string Android { get; }
39-
public abstract string Emulator { get; }
40-
public abstract string Monitor { get; }
41-
public abstract string ZipAlign { get; }
42-
public abstract string JarSigner { get; }
43-
public abstract string KeyTool { get; }
44-
45-
public abstract string NdkStack { get; }
37+
public virtual string Adb { get; protected set; } = "adb";
38+
public virtual string Android { get; protected set; } = "android";
39+
public virtual string Emulator { get; protected set; } = "emulator";
40+
public virtual string Monitor { get; protected set; } = "monitor";
41+
public virtual string ZipAlign { get; protected set; } = "zipalign";
42+
public virtual string JarSigner { get; protected set; } = "jarsigner";
43+
public virtual string KeyTool { get; protected set; } = "keytool";
44+
45+
public virtual string NdkStack { get; protected set; } = "ndk-stack";
4646
public abstract string NdkHostPlatform32Bit { get; }
4747
public abstract string NdkHostPlatform64Bit { get; }
48-
public abstract string Javac { get; }
48+
public virtual string Javac { get; protected set; } = "javac";
4949

5050
public abstract string PreferedAndroidSdkPath { get; }
5151
public abstract string PreferedAndroidNdkPath { get; }
@@ -81,6 +81,13 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP
8181
IsNdk64Bit = Directory.EnumerateDirectories (toolchainsDir, "arm-linux-androideabi-*")
8282
.Any (dir => Directory.Exists (Path.Combine (dir, "prebuilt", NdkHostPlatform64Bit)));
8383
}
84+
// we need to look for extensions other than the default .exe|.bat
85+
// google have a habbit of changing them.
86+
Adb = GetExecutablePath (AndroidPlatformToolsPath, Adb);
87+
Android = GetExecutablePath (AndroidToolsPath, Android);
88+
Emulator = GetExecutablePath (AndroidToolsPath, Emulator);
89+
Monitor = GetExecutablePath (AndroidToolsPath, Monitor);
90+
NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack);
8491
}
8592

8693
protected abstract IEnumerable<string> GetAllAvailableAndroidSdks ();
@@ -119,26 +126,40 @@ public virtual bool ValidateJavaSdkLocation (string loc)
119126
/// </summary>
120127
public bool ValidateAndroidNdkLocation (string loc)
121128
{
122-
return !string.IsNullOrEmpty (loc) && File.Exists (Path.Combine (loc, NdkStack));
129+
return !string.IsNullOrEmpty (loc) && FindExecutableInDirectory(NdkStack, loc).Any();
123130
}
124131

125132
protected IEnumerable<string> FindExecutableInPath (string executable)
126133
{
127134
var path = Environment.GetEnvironmentVariable ("PATH");
128135
var pathDirs = path.Split (new char[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
129-
var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
130-
var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
131136

132137
foreach (var dir in pathDirs) {
133-
if (File.Exists (Path.Combine (dir, (executable))))
134-
yield return dir;
135-
if (pathExts == null)
136-
continue;
137-
foreach (var ext in pathExts)
138-
if (File.Exists (Path.Combine (dir, Path.ChangeExtension (executable, ext))))
139-
yield return dir;
138+
foreach (var directory in FindExecutableInDirectory(executable, dir)) {
139+
yield return directory;
140+
}
140141
}
141142
}
143+
144+
protected IEnumerable<string> FindExecutableInDirectory(string executable, string dir)
145+
{
146+
foreach (var exe in Executables (executable))
147+
if (File.Exists (Path.Combine (dir, exe)))
148+
yield return dir;
149+
}
150+
151+
IEnumerable<string> Executables (string executable)
152+
{
153+
yield return executable;
154+
var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
155+
var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
156+
157+
if (pathExts == null)
158+
yield break;
159+
160+
foreach (var ext in pathExts)
161+
yield return Path.ChangeExtension (executable, ext);
162+
}
142163

143164
protected string NullIfEmpty (string s)
144165
{
@@ -147,6 +168,14 @@ protected string NullIfEmpty (string s)
147168

148169
return null;
149170
}
171+
172+
string GetExecutablePath (string dir, string exe)
173+
{
174+
foreach (var e in Executables (exe))
175+
if (File.Exists (Path.Combine (dir, e)))
176+
return e;
177+
return exe;
178+
}
150179
}
151180
}
152181

src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,13 @@ namespace Xamarin.Android.Build.Utilities
88
{
99
class AndroidSdkUnix : AndroidSdkBase
1010
{
11-
public override string Adb { get { return "adb"; } }
12-
public override string Android { get { return "android"; } }
13-
public override string Emulator { get { return "emulator"; } }
14-
public override string Monitor { get { return "monitor"; } }
15-
public override string ZipAlign { get { return "zipalign"; } }
16-
public override string JarSigner { get { return "jarsigner"; } }
17-
public override string KeyTool { get { return "keytool"; } }
18-
public override string NdkStack { get { return "ndk-stack"; } }
19-
2011
public override string NdkHostPlatform32Bit {
2112
get { return OS.IsMac ? "darwin-x86" : "linux-x86"; }
2213
}
2314
public override string NdkHostPlatform64Bit {
2415
get { return OS.IsMac ? "darwin-x86_64" : "linux-x86_64"; }
2516
}
2617

27-
public override string Javac { get { return "javac"; } }
28-
2918
public override string PreferedAndroidSdkPath {
3019
get {
3120
var config_file = GetUnixConfigFile ();

src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@ class AndroidSdkWindows : AndroidSdkBase
1515
const string XAMARIN_ANDROID_INSTALLER_PATH = @"SOFTWARE\Xamarin\MonoAndroid";
1616
const string XAMARIN_ANDROID_INSTALLER_KEY = "PrivateAndroidSdkPath";
1717

18-
public override string Adb { get { return "adb.exe"; } }
19-
public override string Android { get { return "android.bat"; } }
20-
public override string Emulator { get { return "emulator.exe"; } }
21-
public override string Monitor { get { return "monitor.bat"; } }
22-
public override string ZipAlign { get { return "zipalign.exe"; } }
23-
public override string JarSigner { get { return "jarsigner.exe"; } }
24-
public override string KeyTool { get { return "keytool.exe"; } }
25-
public override string NdkStack { get { return "ndk-stack.exe"; } }
18+
public override string ZipAlign { get; protected set; } = "zipalign.exe";
19+
public override string JarSigner { get; protected set; } = "jarsigner.exe";
20+
public override string KeyTool { get; protected set; } = "keytool.exe";
21+
2622
public override string NdkHostPlatform32Bit { get { return "windows"; } }
2723
public override string NdkHostPlatform64Bit { get { return "windows-x86_64"; } }
28-
public override string Javac { get { return "javac.exe"; } }
24+
public override string Javac { get; protected set; } = "javac.exe";
2925

3026
public override string PreferedAndroidSdkPath {
3127
get {

0 commit comments

Comments
 (0)