diff --git a/Configurations/15-android.conf b/Configurations/15-android.conf index 0a2a9e7bba2671712dadbc9bd623056b6372d6ae..551f71b92f55d6f20971b9d48feb81610bad5297 100644 --- a/Configurations/15-android.conf +++ b/Configurations/15-android.conf @@ -1,6 +1,6 @@ #### Android... # -# See NOTES.ANDROID for details. But don't miss platform-specific +# See NOTES.ANDROID for details, and don't miss platform-specific # comments below... { @@ -20,13 +20,26 @@ die "\$ANDROID_NDK is not defined" if (!$ndk); die "\$ANDROID_NDK=$ndk is invalid" if (!-d "$ndk/platforms"); + my $ndkver = undef; + + if (open my $fh, "<$ndk/source.properties") { + local $_; + while(<$fh>) { + if (m|Pkg\.Revision\s*=\s*([0-9]+)|) { + $ndkver = $1; + last; + } + } + close $fh; + } + my $sysroot; if (!($sysroot = $ENV{CROSS_SYSROOT})) { my $api = "*"; # see if user passed -D__ANDROID_API__=N - foreach (@{$useradd{CPPDEFINES}}) { + foreach (@{$useradd{CPPDEFINES}}, @{$user{CPPFLAGS}}) { if (m|__ANDROID_API__=([0-9]+)|) { $api = $1; last; @@ -51,20 +64,24 @@ my $cflags = "-Wa,--noexecstack"; my $cppflags; - # see if user passed CC=clang - if ($user{CC} eq "clang") { - if (which("clang") !~ m|^$ndk/.*/prebuilt/([^/]+)/|) { - die "no NDK clang on \$PATH"; - } + # see if there is NDK clang on $PATH + if (which("clang") =~ m|^$ndk/.*/prebuilt/([^/]+)/|) { my $host=$1; # harmonize with gcc default - (my $tridefault = $triarch) =~ s/^arm-/armv5te-/; + my $arm = $ndkver > 16 ? "armv7a" : "armv5te"; + (my $tridefault = $triarch) =~ s/^arm-/$arm-/; (my $tritools = $triarch) =~ s/(?:x|i6)86(_64)?-.*/x86$1/; $cflags .= " -target $tridefault " . "-gcc-toolchain \$(ANDROID_NDK)/toolchains" . "/$tritools-4.9/prebuilt/$host"; + $user{CC} = "clang" if ($user{CC} !~ m|clang|); $user{CROSS_COMPILE} = undef; + } elsif ($user{CC} eq "clang") { + die "no NDK clang on \$PATH"; } else { + if (which("$triarch-gcc") !~ m|^$ndk/.*/prebuilt/([^/]+)/|) { + die "no NDK $triarch-gcc on \$PATH"; + } $cflags .= " -mandroid"; $user{CROSS_COMPILE} = "$triarch-"; } @@ -138,7 +155,7 @@ my %targets = ( # compiler defaults, which is not necessarily what you had # in mind, in which case you would have to pass additional # -march and/or -mfloat-abi flags. NDK defaults to armv5te. - # Some NDK versions reportedly require additional -latomic. + # Newer NDK versions reportedly require additional -latomic. # inherit_from => [ "android", asm("armv4_asm") ], bn_ops => add("RC4_CHAR"), diff --git a/NOTES.ANDROID b/NOTES.ANDROID index f6c28d28ad9e1f906a6a5fecbbffd163bdb330b8..dcddc4cf779a1e3f179a0fe328b0199abf94a2a4 100644 --- a/NOTES.ANDROID +++ b/NOTES.ANDROID @@ -43,10 +43,11 @@ conflict, and mixing the two is therefore not supported. Migration to CROSS_SYSROOT-less setup is recommended. - One can engage clang by passing CC=clang to Configure. In such case - PATH needs even more adjustments to cover NDK's clang itself, as well - as unprefixed, yet target-specific, ar and ranlib (or not, if you use - binutils-multiarch on your Linux). + One can engage clang by adjusting PATH to cover NDK's clang. Just keep + in mind that if you miss it, Configure will try to use gcc... Also, + PATH would need even further adjustment to cover unprefixed, yet + target-specific, ar and ranlib (or not, if you use binutils-multiarch + on your Linux). Running tests (on Linux) ------------------------