Skip to content

Commit

Permalink
Configurations/15-android.conf: detect clang by PATH, not by CC.
Browse files Browse the repository at this point in the history
Since they intend to omit gcc, it's more appropriate to simply detect
if there is NDK's clang on PATH, as opposite to requiring to specify it
with CC=clang (and looking for it on PATH).

Also detect NDK version and default to armv7-a for NDK>16.

Address failure to recognize -D__ADNDROID_API__=N in CPPFLAGS.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from openssl/openssl#5613)
  • Loading branch information
Andy Polyakov committed Mar 19, 2018
1 parent f39276f commit df3a155
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 13 deletions.
35 changes: 26 additions & 9 deletions Configurations/15-android.conf
Original file line number Diff line number Diff line change
@@ -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...

{
Expand All @@ -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;
Expand All @@ -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-";
}
Expand Down Expand Up @@ -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"),
Expand Down
9 changes: 5 additions & 4 deletions NOTES.ANDROID
Original file line number Diff line number Diff line change
Expand Up @@ -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)
------------------------
Expand Down

0 comments on commit df3a155

Please sign in to comment.