Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 36 additions & 15 deletions src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't you love C#6? :-)

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; }
Expand Down Expand Up @@ -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<string> GetAllAvailableAndroidSdks ();
Expand Down Expand Up @@ -136,16 +143,22 @@ protected IEnumerable<string> FindExecutableInPath (string executable)

protected IEnumerable<string> FindExecutableInDirectory(string executable, string dir)
{
foreach (var exe in Executables (executable))
if (File.Exists (Path.Combine (dir, exe)))
yield return dir;
}

IEnumerable<string> 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)
Expand All @@ -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;
}
}
}

11 changes: 0 additions & 11 deletions src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,13 @@ 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"; }
}
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 ();
Expand Down
14 changes: 5 additions & 9 deletions src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of the great side-effects of the "let's do this for everything" approach is that we shouldn't need to override these properties anymore. We thus shrink AndroidSdkWindows and AndroidSdkUnix.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jonpryor well be kinda do. The main reason is these files

zipalign, jarsigner, keytool, javac

are either in the java directory which we don't scan for since we rely on the "system" one. Or are in the build-tools folder which is versioned... and we don't know the version at the point where we scan for the tools.

So for those 4 tools we should default the extension to .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 {
Expand Down