Skip to content

Commit b99cb37

Browse files
committed
[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.
1 parent 08ff8ba commit b99cb37

File tree

3 files changed

+54
-35
lines changed

3 files changed

+54
-35
lines changed

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

Lines changed: 49 additions & 15 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,32 @@ 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+
foreach (var exe in Executables (Adb)) {
87+
if (File.Exists (Path.Combine (AndroidPlatformToolsPath, exe)))
88+
Adb = exe;
89+
}
90+
foreach (var exe in Executables (Android)) {
91+
if (File.Exists (Path.Combine (AndroidToolsPath, exe)))
92+
Android = exe;
93+
}
94+
foreach (var exe in Executables (Emulator)) {
95+
if (File.Exists (Path.Combine (AndroidToolsPath, exe)))
96+
Emulator = exe;
97+
}
98+
foreach (var exe in Executables (Monitor)) {
99+
if (File.Exists (Path.Combine (AndroidToolsPath, exe)))
100+
Monitor = exe;
101+
}
102+
foreach (var exe in Executables (Emulator)) {
103+
if (File.Exists (Path.Combine (AndroidToolsPath, exe)))
104+
Emulator = exe;
105+
}
106+
foreach (var exe in Executables (NdkStack)) {
107+
if (File.Exists (Path.Combine (AndroidNdkPath, exe)))
108+
NdkStack = exe;
109+
}
84110
}
85111

86112
protected abstract IEnumerable<string> GetAllAvailableAndroidSdks ();
@@ -136,16 +162,24 @@ protected IEnumerable<string> FindExecutableInPath (string executable)
136162

137163
protected IEnumerable<string> FindExecutableInDirectory(string executable, string dir)
138164
{
139-
var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
140-
var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
141-
142165
if (File.Exists (Path.Combine (dir, (executable))))
143166
yield return dir;
167+
168+
foreach (var exe in Executables (executable))
169+
if (File.Exists (Path.Combine (dir, exe)))
170+
yield return dir;
171+
}
172+
173+
protected IEnumerable<string> Executables (string executable)
174+
{
175+
var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
176+
var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
177+
144178
if (pathExts == null)
145179
yield break;
180+
146181
foreach (var ext in pathExts)
147-
if (File.Exists (Path.Combine (dir, Path.ChangeExtension (executable, ext))))
148-
yield return dir;
182+
yield return Path.ChangeExtension (executable, ext);
149183
}
150184

151185
protected string NullIfEmpty (string s)

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)