#### 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...
{
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;
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-";
}
# 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"),
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)
------------------------