Skip to content

Commit

Permalink
[WIP] Bump to NDK r23-beta5
Browse files Browse the repository at this point in the history
Let's see what breaks
  • Loading branch information
grendello committed Jul 8, 2021
1 parent e5103b0 commit c54cbad
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 54 deletions.
5 changes: 3 additions & 2 deletions build-tools/xaprepare/xaprepare/Application/BuildInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ partial class BuildInfo : AppObject
public string NDKVersionMajor { get; private set; } = String.Empty;
public string NDKVersionMinor { get; private set; } = String.Empty;
public string NDKVersionMicro { get; private set; } = String.Empty;
public string NDKVersionTag { get; private set; } = String.Empty;
public string NDKMinimumApiAvailable { get; private set; } = String.Empty;

public string VersionHash { get; private set; } = String.Empty;
Expand Down Expand Up @@ -59,15 +60,15 @@ public bool GatherNDKInfo (Context context)
string rev = parts [1].Trim ();
NDKRevision = rev;

Version ver;
if (!Version.TryParse (rev, out ver)) {
if (!Utilities.ParseAndroidPkgRevision (rev, out Version? ver, out string tag)) {
Log.ErrorLine ($"Unable to parse NDK revision '{rev}' as a valid version string");
return false;
}

NDKVersionMajor = ver.Major.ToString ();
NDKVersionMinor = ver.Minor.ToString ();
NDKVersionMicro = ver.Build.ToString ();
NDKVersionTag = tag;
break;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public override void Init (Context context)
OutputMonoBtlsFilename = Configurables.Defaults.MonoRuntimeOutputMonoBtlsFilename;
OutputMonoPosixHelperFilename = Configurables.Defaults.MonoRuntimeOutputMonoPosixHelperFilename;
OutputProfilerFilename = Configurables.Defaults.MonoRuntimeOutputProfilerFilename;
Strip = Path.Combine (Configurables.Paths.AndroidToolchainBinDirectory, $"{Configurables.Defaults.AndroidToolchainPrefixes [Name]}-strip");
Strip = Path.Combine (Configurables.Paths.AndroidToolchainBinDirectory, "llvm-strip");
}
}
}
23 changes: 23 additions & 0 deletions build-tools/xaprepare/xaprepare/Application/Utilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,29 @@ static partial class Utilities

public static readonly Encoding UTF8NoBOM = new UTF8Encoding (false);

public static bool ParseAndroidPkgRevision (string? v, out Version? version, out string? tag)
{
string? ver = v?.Trim ();
version = null;
tag = null;
if (String.IsNullOrEmpty (ver))
return false;

if (ver!.IndexOf ('.') < 0)
ver = $"{ver}.0";

int tagIdx = ver.IndexOf ('-');
if (tagIdx >= 0) {
tag = ver.Substring (tagIdx + 1);
ver = ver.Substring (0, tagIdx - 1);
}

if (Version.TryParse (ver, out version))
return true;

return false;
}

public static bool AbiChoiceChanged (Context context)
{
string cacheFile = Configurables.Paths.MonoRuntimesEnabledAbisCachePath;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Xamarin.Android.Prepare
{
class BuildAndroidPlatforms
{
public const string AndroidNdkVersion = "22b";
public const string AndroidNdkPkgRevision = "22.1.7171670";
public const string AndroidNdkVersion = "23-beta5";
public const string AndroidNdkPkgRevision = "23.0.7421159-beta5";

public static readonly List<AndroidPlatform> AllPlatforms = new List<AndroidPlatform> {
new AndroidPlatform (apiName: "", apiLevel: 1, platformID: "1"),
Expand Down Expand Up @@ -49,9 +49,9 @@ class BuildAndroidPlatforms
public const string AndroidX86_64_NET6 = AbiNames.TargetJit.AndroidX86_64 + "_NET6";

public static readonly Dictionary<string, uint> NdkMinimumAPI = new Dictionary<string, uint> {
{ AbiNames.TargetJit.AndroidArmV7a, 16 }, { AndroidArmV7a_NET6, 21 },
{ AbiNames.TargetJit.AndroidArmV7a, 19 }, { AndroidArmV7a_NET6, 21 },
{ AbiNames.TargetJit.AndroidArmV8a, 21 }, { AndroidArmV8a_NET6, 21 },
{ AbiNames.TargetJit.AndroidX86, 16 }, { AndroidX86_NET6, 21 },
{ AbiNames.TargetJit.AndroidX86, 19 }, { AndroidX86_NET6, 21 },
{ AbiNames.TargetJit.AndroidX86_64, 21 }, { AndroidX86_64_NET6, 21 },
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public AndroidToolchain ()
new AndroidToolchainComponent ("docs-24_r01", destDir: "docs", pkgRevision: "1", dependencyType: AndroidToolchainComponentType.BuildDependency),
new AndroidToolchainComponent ("android_m2repository_r47", destDir: Path.Combine ("extras", "android", "m2repository"), pkgRevision: "47.0.0", dependencyType: AndroidToolchainComponentType.BuildDependency),
new AndroidToolchainComponent ($"x86_64-29_r07-{osTag}", destDir: Path.Combine ("system-images", "android-29", "default", "x86_64"), relativeUrl: new Uri ("sys-img/android/", UriKind.Relative), pkgRevision: "7", dependencyType: AndroidToolchainComponentType.EmulatorDependency),
new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}-x86_64", destDir: AndroidNdkDirectory, pkgRevision: AndroidPkgRevision),
new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}", destDir: AndroidNdkDirectory, pkgRevision: AndroidPkgRevision),
new AndroidToolchainComponent ($"{XABuildToolsPackagePrefix}build-tools_r{XABuildToolsVersion}-{altOsTag}", destDir: Path.Combine ("build-tools", XABuildToolsFolder), isMultiVersion: true),
new AndroidToolchainComponent ($"commandlinetools-{cltOsTag}-{CommandLineToolsVersion}",
destDir: Path.Combine ("cmdline-tools", CommandLineToolsFolder), isMultiVersion: true),
Expand Down
24 changes: 4 additions & 20 deletions build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs
Original file line number Diff line number Diff line change
Expand Up @@ -307,37 +307,21 @@ bool IsInstalled (AndroidToolchainComponent component, string path, out bool mis
return false;
}

if (!ParseVersion (pkgRevision, out Version? pkgVer) || pkgVer == null) {
if (!Utilities.ParseAndroidPkgRevision (pkgRevision, out Version? pkgVer, out string pkgTag) || pkgVer == null) {
Log.DebugLine ($"Failed to parse a valid version from Pkg.Revision ({pkgRevision}) for component '{component.Name}'. Component will be reinstalled.");
return false;
}

if (!ParseVersion (component.PkgRevision, out Version? expectedPkgVer) || expectedPkgVer == null)
if (!Utilities.ParseAndroidPkgRevision (component.PkgRevision, out Version? expectedPkgVer, out string expectedTag) || expectedPkgVer == null)
throw new InvalidOperationException ($"Invalid expected package version for component '{component.Name}': {component.PkgRevision}");

bool equal = pkgVer == expectedPkgVer;
bool equal = (pkgVer == expectedPkgVer) && (pkgTag == expectedTag);
if (!equal)
Log.DebugLine ($"Installed version of '{component.Name}' ({pkgVer}) is different than the required one ({expectedPkgVer})");
Log.DebugLine ($"Installed version of '{component.Name}' ({pkgRevision}) is different than the required one ({component.PkgRevision})");

return equal;
}

bool ParseVersion (string? v, out Version? version)
{
string? ver = v?.Trim ();
version = null;
if (String.IsNullOrEmpty (ver))
return false;

if (ver!.IndexOf ('.') < 0)
ver = $"{ver}.0";

if (Version.TryParse (ver, out version))
return true;

return false;
}

bool IsNdk (AndroidToolchainComponent component)
{
return component.Name.StartsWith ("android-ndk", StringComparison.OrdinalIgnoreCase);
Expand Down
2 changes: 1 addition & 1 deletion external/xamarin-android-tools
18 changes: 13 additions & 5 deletions src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -359,14 +359,20 @@ IEnumerable<Config> GetAotConfigs ()
}

string toolchainLibDir;
if (NdkUtil.UsingClangNDK)
toolchainLibDir = GetNdkToolchainLibraryDir (toolchainPath, arch);
else
if (NdkUtil.UsingClangNDK) {
if (!NdkUtil.UsingNDKWithoutBinutils) {
toolchainLibDir = GetNdkToolchainLibraryDir (toolchainPath, arch);
} else {
toolchainLibDir = String.Empty;
}
} else
toolchainLibDir = GetNdkToolchainLibraryDir (toolchainPath);

var libs = new List<string>();
if (NdkUtil.UsingClangNDK) {
libs.Add ($"-L{toolchainLibDir.TrimEnd ('\\')}");
if (!String.IsNullOrEmpty (toolchainLibDir)) {
libs.Add ($"-L{toolchainLibDir.TrimEnd ('\\')}");
}
libs.Add ($"-L{androidLibPath.TrimEnd ('\\')}");

if (arch == AndroidTargetArch.Arm) {
Expand All @@ -376,7 +382,9 @@ IEnumerable<Config> GetAotConfigs ()
}
}

libs.Add (Path.Combine (toolchainLibDir, "libgcc.a"));
if (!String.IsNullOrEmpty (toolchainLibDir)) {
libs.Add (Path.Combine (toolchainLibDir, "libgcc.a"));
}
libs.Add (Path.Combine (androidLibPath, "libc.so"));
libs.Add (Path.Combine (androidLibPath, "libm.so"));

Expand Down
87 changes: 69 additions & 18 deletions src/Xamarin.Android.Build.Tasks/Tasks/NdkUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,20 @@ namespace Xamarin.Android.Tasks
{
public static class NdkUtil
{
class NDKToolchainInfo
{
public bool IsClangNDK;
public bool NoBinutils;
public int MajorVersion;
}

// We need it to work fine during our tests which are executed at the same time in various threads.
[ThreadStatic]
static bool usingClangNDK;
static NDKToolchainInfo? ndkToolchainInfo;

public static bool UsingClangNDK => usingClangNDK;
public static bool UsingClangNDK => ndkToolchainInfo == null ? false : ndkToolchainInfo.IsClangNDK;
public static bool UsingNDKWithoutBinutils => ndkToolchainInfo == null ? false : ndkToolchainInfo.NoBinutils;
public static int NDKMajorVersion = ndkToolchainInfo == null ? 0 : ndkToolchainInfo.MajorVersion;

public static bool Init (string ndkPath)
{
Expand All @@ -41,7 +50,11 @@ public static bool Init (Action<string, string> logError, string ndkPath)
return false;
}

usingClangNDK = ndkVersion.Major >= 19;
ndkToolchainInfo = new NDKToolchainInfo {
IsClangNDK = ndkVersion.Major >= 19,
NoBinutils = ndkVersion.Major > 22,
MajorVersion = ndkVersion.Major,
};

return true;
}
Expand Down Expand Up @@ -118,8 +131,12 @@ public static string GetCompilerTargetParameters (string androidNdkPath, Android
return $"{targetPrefix}{apiLevel} {otherParams} -fno-addrsig {stdlib}";
}

static string GetToolchainDir (string androidNdkPath)
static string GetToolchainDir (string androidNdkPath, bool forBundledBinutils = false)
{
if (forBundledBinutils) {
return MonoAndroidHelper.GetOSBinPath ();
}

return Path.Combine (androidNdkPath, "toolchains", "llvm", "prebuilt", MonoAndroidHelper.AndroidSdk.AndroidNdkHostPlatform);
}

Expand Down Expand Up @@ -155,7 +172,6 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch,
if (!UsingClangNDK)
return NdkUtilOld.GetNdkTool (androidNdkPath, arch, tool);

string toolchainDir = GetToolchainDir (androidNdkPath);
string toolName;
bool forCompiler = false;

Expand All @@ -170,6 +186,7 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch,
} else
toolName = tool;

string toolchainDir = GetToolchainDir (androidNdkPath, IsBinutilsToolOrLd ());
//
// NDK r19 bug.
//
Expand Down Expand Up @@ -198,12 +215,17 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch,
//
string toolchainPrefix;
if (forCompiler) {
if (!OS.IsWindows)
if (!OS.IsWindows || NDKMajorVersion >= 21) {
toolchainPrefix = $"{GetNdkToolchainPrefix (arch, true)}{apiLevel}";
else
} else
toolchainPrefix = String.Empty;
} else
toolchainPrefix = GetNdkToolchainPrefix (arch, false);
} else {
if (UsingNDKWithoutBinutils && !IsBinutilsToolOrLd ()) {
toolchainPrefix = "llvm";
} else {
toolchainPrefix = GetNdkToolchainPrefix (arch, false);
}
}

string extension = OS.IsWindows ? ".exe" : String.Empty;
if (forCompiler && OS.IsWindows)
Expand All @@ -212,12 +234,8 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch,
toolName = GetPrefixedName (toolName);

string toolPath = GetToolPath (toolName);
if (String.IsNullOrEmpty (toolPath) && String.Compare ("ld", tool, StringComparison.OrdinalIgnoreCase) == 0) {
// NDK r22 removed arch-prefixed `ld` binary. There exists the unprefixed `ld` binary, from the LLVM
// toolchain, and two binutils linkers - `ld.bfd` and `ld.gold`. Since we will need to keep using
// binutils once NDK removes them, let's use one of the latter. `ld.gold` is the better choice, so we'll
// use it if found
toolPath = GetToolPath (GetPrefixedName ("ld.gold"));
if (String.IsNullOrEmpty (toolPath) && IsBinutilsToolOrLd ()) {
toolPath = GetBundledToolPath (GetPrefixedName (toolName));
}

if (!String.IsNullOrEmpty (toolPath)) {
Expand All @@ -232,15 +250,41 @@ string GetPrefixedName (string name)
return $"{toolchainPrefix}-{name}{extension}";
}

string GetBundledToolPath (string name)
{
return GetFullToolPath (Path.Combine (toolchainDir, "ndk"), name);
}

string GetToolPath (string name)
{
string binDir = Path.Combine (toolchainDir, "bin");
return GetFullToolPath (Path.Combine (toolchainDir, "bin"), name);
}

string GetFullToolPath (string binDir, string name)
{
string toolExe = MonoAndroidHelper.GetExecutablePath (binDir, name);
string toolPath = Path.Combine (binDir, toolExe);
string toolPath = Path.Combine (binDir, toolExe);
if (File.Exists (toolPath))
return toolPath;
return null;
}

bool IsBinutilsToolOrLd ()
{
switch (toolName) {
case "ld":
return true;

case "as":
case "strip":
if (UsingNDKWithoutBinutils) {
return true;
}
break;
}

return false;
}
}

static string GetUnifiedHeadersPath (string androidNdkPath)
Expand Down Expand Up @@ -378,7 +422,14 @@ public static bool GetNdkToolchainRelease (string androidNdkPath, out Version nd
if (parts.Length != 2)
return false;

if (Version.TryParse (parts [1].Trim (), out ndkVersion))
string ver = parts [1].Trim ();
int tagIdx = ver.IndexOf ('-');
if (tagIdx >= 0) {
// We ignore the tag, it doesn't really matter to us. This code will be used only when testing beta releases of the NDK
ver = ver.Substring (0, tagIdx - 1);
}

if (Version.TryParse (ver, out ndkVersion))
return true;
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public void TestNdkUtil ()
Assert.IsTrue (NdkUtil.ValidateNdkPlatform (log, ndkDir, arch, enableLLVM: false));
Assert.AreEqual (0, errors.Count, "NdkUtil.ValidateNdkPlatform should not have returned false.");
int level = NdkUtil.GetMinimumApiLevelFor (arch, ndkDir);
int expected = 16;
int expected = 19;
Assert.AreEqual (expected, level, $"Min Api Level for {arch} should be {expected}.");
var compilerNoQuotes = NdkUtil.GetNdkTool (ndkDir, arch, "gcc", level);
Assert.AreEqual (0, errors.Count, "NdkUtil.GetNdkTool should not have errored.");
Expand Down
1 change: 0 additions & 1 deletion src/monodroid/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,6 @@ endif()
if(ANDROID)
add_compile_definitions(HAVE_LZ4)
add_compile_definitions(PLATFORM_ANDROID)
add_compile_definitions(__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL})

if(ANDROID_ABI MATCHES "^(arm64-v8a|x86_64)")
add_compile_definitions(ANDROID64)
Expand Down

0 comments on commit c54cbad

Please sign in to comment.