Loading Configurations/15-android.conf +31 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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}}) { Loading @@ -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 Loading @@ -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 { Loading NOTES.ANDROID +13 −5 Original line number Diff line number Diff line Loading @@ -24,16 +24,18 @@ in order to invoke $(CROSS_COMPILE)gcc and company. (Configure will fail and give you a hint if you get it wrong.) Apart from PATH adjustment you need to set ANDROID_NDK environment to point at NDK directory as /some/where/android-ndk-<ver>. NDK customarily supports multiple as /some/where/android-ndk-<ver>. Both variables are significant at both configuration and compilation times. NDK customarily supports multiple Android API levels, e.g. android-14, android-21, etc. By default latest one available is chosen. If you need to target older platform, pass additional -D__ANDROID_API__=N to Configure. N is numeric value of the target platform version. For example, to compile for ICS on ARM with NDK 10d: ANDROID_NDK=/some/where/android-ndk-10d export ANDROID_NDK=/some/where/android-ndk-10d PATH=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin:$PATH ./Configure android-arm -D__ANDROID_API__=14 make Caveat lector! Earlier OpenSSL versions relied on additional CROSS_SYSROOT variable set to $ANDROID_NDK/platforms/android-<api>/arch-<arch> to Loading @@ -43,12 +45,18 @@ conflict, and mixing the two is therefore not supported. Migration to CROSS_SYSROOT-less setup is recommended. 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 One can engage clang by adjusting PATH to cover same 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. It's possible that you don't need to bother, if binutils-multiarch is installed on your Linux system. Another option is to create so called "standalone toolchain" tailored for single specific platform including Android API level, and assign its location to ANDROID_NDK. In such case you have to pass matching target name to Configure and shouldn't use -D__ANDROID_API__=N. PATH adjusment becomes simpler, $ANDROID_NDK/bin:$PATH suffices. Running tests (on Linux) ------------------------ Loading Loading
Configurations/15-android.conf +31 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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}}) { Loading @@ -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 Loading @@ -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 { Loading
NOTES.ANDROID +13 −5 Original line number Diff line number Diff line Loading @@ -24,16 +24,18 @@ in order to invoke $(CROSS_COMPILE)gcc and company. (Configure will fail and give you a hint if you get it wrong.) Apart from PATH adjustment you need to set ANDROID_NDK environment to point at NDK directory as /some/where/android-ndk-<ver>. NDK customarily supports multiple as /some/where/android-ndk-<ver>. Both variables are significant at both configuration and compilation times. NDK customarily supports multiple Android API levels, e.g. android-14, android-21, etc. By default latest one available is chosen. If you need to target older platform, pass additional -D__ANDROID_API__=N to Configure. N is numeric value of the target platform version. For example, to compile for ICS on ARM with NDK 10d: ANDROID_NDK=/some/where/android-ndk-10d export ANDROID_NDK=/some/where/android-ndk-10d PATH=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin:$PATH ./Configure android-arm -D__ANDROID_API__=14 make Caveat lector! Earlier OpenSSL versions relied on additional CROSS_SYSROOT variable set to $ANDROID_NDK/platforms/android-<api>/arch-<arch> to Loading @@ -43,12 +45,18 @@ conflict, and mixing the two is therefore not supported. Migration to CROSS_SYSROOT-less setup is recommended. 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 One can engage clang by adjusting PATH to cover same 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. It's possible that you don't need to bother, if binutils-multiarch is installed on your Linux system. Another option is to create so called "standalone toolchain" tailored for single specific platform including Android API level, and assign its location to ANDROID_NDK. In such case you have to pass matching target name to Configure and shouldn't use -D__ANDROID_API__=N. PATH adjusment becomes simpler, $ANDROID_NDK/bin:$PATH suffices. Running tests (on Linux) ------------------------ Loading