|
@@ -24,7 +24,12 @@
|
|
|
|
|
|
my $ndk = $ENV{ANDROID_NDK};
|
|
|
die "\$ANDROID_NDK is not defined" if (!$ndk);
|
|
|
- die "\$ANDROID_NDK=$ndk is invalid" if (!-d "$ndk/platforms");
|
|
|
+ if (!-d "$ndk/platforms" && !-f "$ndk/AndroidVersion.txt") {
|
|
|
+ # $ndk/platforms is traditional "all-inclusive" NDK, while
|
|
|
+ # $ndk/AndroidVersion.txt is so-called standalone toolchain
|
|
|
+ # tailored for specific target down to API level.
|
|
|
+ die "\$ANDROID_NDK=$ndk is invalid";
|
|
|
+ }
|
|
|
$ndk = canonpath($ndk);
|
|
|
|
|
|
my $ndkver = undef;
|
|
@@ -40,10 +45,18 @@
|
|
|
close $fh;
|
|
|
}
|
|
|
|
|
|
- my $sysroot;
|
|
|
+ my ($sysroot, $api, $arch);
|
|
|
+
|
|
|
+ $config{target} =~ m|[^-]+-([^-]+)$|; # split on dash
|
|
|
+ $arch = $1;
|
|
|
|
|
|
- if (!($sysroot = $ENV{CROSS_SYSROOT})) {
|
|
|
- my $api = "*";
|
|
|
+ if ($sysroot = $ENV{CROSS_SYSROOT}) {
|
|
|
+ $sysroot =~ m|/android-([0-9]+)/arch-(\w+)/?$|;
|
|
|
+ ($api, $arch) = ($1, $2);
|
|
|
+ } elsif (-f "$ndk/AndroidVersion.txt") {
|
|
|
+ $sysroot = "$ndk/sysroot";
|
|
|
+ } else {
|
|
|
+ $api = "*";
|
|
|
|
|
|
# see if user passed -D__ANDROID_API__=N
|
|
|
foreach (@{$useradd{CPPDEFINES}}, @{$user{CPPFLAGS}}) {
|
|
@@ -59,19 +72,15 @@
|
|
|
} glob("$ndk/platforms/android-$api");
|
|
|
die "no $ndk/platforms/android-$api" if ($#platforms < 0);
|
|
|
|
|
|
- $config{target} =~ m|[^-]+-([^-]+)$|; # split on dash
|
|
|
- $sysroot = "@platforms[$#platforms]/arch-$1";
|
|
|
+ $sysroot = "@platforms[$#platforms]/arch-$arch";
|
|
|
}
|
|
|
die "no sysroot=$sysroot" if (!-d $sysroot);
|
|
|
|
|
|
- $sysroot =~ m|/android-([0-9]+)/arch-(\w+)/?$|;
|
|
|
- my ($api, $arch) = ($1, $2);
|
|
|
-
|
|
|
my $triarch = $triplet{$arch};
|
|
|
my $cflags;
|
|
|
my $cppflags;
|
|
|
|
|
|
- # see if there is NDK clang on $PATH
|
|
|
+ # see if there is NDK clang on $PATH, "universal" or "standalone"
|
|
|
if (which("clang") =~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
|
|
|
my $host=$1;
|
|
|
# harmonize with gcc default
|
|
@@ -83,6 +92,18 @@
|
|
|
. "/$tritools-4.9/prebuilt/$host";
|
|
|
$user{CC} = "clang" if ($user{CC} !~ m|clang|);
|
|
|
$user{CROSS_COMPILE} = undef;
|
|
|
+ } elsif (-f "$ndk/AndroidVersion.txt") { #"standalone toolchain"
|
|
|
+ my $cc = $user{CC} // "clang";
|
|
|
+ # One can probably argue that both clang and gcc should be
|
|
|
+ # probed, but support for "standalone toolchain" was added
|
|
|
+ # *after* announcement that gcc is being phased out, so
|
|
|
+ # favouring clang is considered adequate. Those who insist
|
|
|
+ # have option to enforce test for gcc with CC=gcc.
|
|
|
+ if (which("$triarch-$cc") !~ m|^$ndk|) {
|
|
|
+ die "no NDK $triarch-$cc on \$PATH";
|
|
|
+ }
|
|
|
+ $user{CC} = $cc;
|
|
|
+ $user{CROSS_COMPILE} = "$triarch-";
|
|
|
} elsif ($user{CC} eq "clang") {
|
|
|
die "no NDK clang on \$PATH";
|
|
|
} else {
|