Commit a66c361a authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Configurations/15-android.conf: add support for "standalone toolchain".



Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7400)

(cherry picked from commit 03ad7c009e16a233c733098db3169c560142ccd3)
parent fc762e7d
Loading
Loading
Loading
Loading
+31 −10
Original line number Diff line number Diff line
@@ -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 {
+13 −5
Original line number Diff line number Diff line
@@ -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
@@ -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)
 ------------------------