xref: /freebsd-src/crypto/openssl/NOTES-ANDROID.md (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1*b077aed3SPierre ProncheryNotes for Android platforms
2*b077aed3SPierre Pronchery===========================
3*b077aed3SPierre Pronchery
4*b077aed3SPierre Pronchery Requirement details
5*b077aed3SPierre Pronchery -------------------
6*b077aed3SPierre Pronchery
7*b077aed3SPierre Pronchery Beside basic tools like perl and make you'll need to download the Android
8*b077aed3SPierre Pronchery NDK. It's available for Linux, macOS and Windows, but only Linux
9*b077aed3SPierre Pronchery version was actually tested. There is no reason to believe that macOS
10*b077aed3SPierre Pronchery wouldn't work. And as for Windows, it's unclear which "shell" would be
11*b077aed3SPierre Pronchery suitable, MSYS2 might have best chances. NDK version should play lesser
12*b077aed3SPierre Pronchery role, the goal is to support a range of most recent versions.
13*b077aed3SPierre Pronchery
14*b077aed3SPierre Pronchery Configuration
15*b077aed3SPierre Pronchery -------------
16*b077aed3SPierre Pronchery
17*b077aed3SPierre Pronchery Android is a cross-compiled target and you can't rely on `./Configure`
18*b077aed3SPierre Pronchery to find out the configuration target for you.  You have to name your
19*b077aed3SPierre Pronchery target explicitly; there are `android-arm`, `android-arm64`, `android-mips`,
20*b077aed3SPierre Pronchery `android-mip64`, `android-x86` and `android-x86_64` (`*MIPS` targets are no
21*b077aed3SPierre Pronchery longer supported with NDK R20+).
22*b077aed3SPierre Pronchery
23*b077aed3SPierre Pronchery Do not pass --cross-compile-prefix (as you might be tempted), as it
24*b077aed3SPierre Pronchery will be "calculated" automatically based on chosen platform. However,
25*b077aed3SPierre Pronchery you still need to know the prefix to extend your PATH, in order to
26*b077aed3SPierre Pronchery invoke `$(CROSS_COMPILE)clang` [`*gcc` on NDK 19 and lower] and company.
27*b077aed3SPierre Pronchery (`./Configure` will fail and give you a hint if you get it wrong.)
28*b077aed3SPierre Pronchery
29*b077aed3SPierre Pronchery Apart from `PATH` adjustment you need to set `ANDROID_NDK_ROOT` environment
30*b077aed3SPierre Pronchery to point at the `NDK` directory. If you're using a side-by-side NDK the path
31*b077aed3SPierre Pronchery will look something like `/some/where/android-sdk/ndk/<ver>`, and for a
32*b077aed3SPierre Pronchery standalone NDK the path will be something like `/some/where/android-ndk-<ver>`.
33*b077aed3SPierre Pronchery Both variables are significant at both configuration and compilation times.
34*b077aed3SPierre Pronchery The NDK customarily supports multiple Android API levels, e.g. `android-14`,
35*b077aed3SPierre Pronchery `android-21`, etc. By default latest API level is chosen. If you need to target
36*b077aed3SPierre Pronchery an older platform pass the argument `-D__ANDROID_API__=N` to `Configure`,
37*b077aed3SPierre Pronchery with `N` being the numerical value of the target platform version. For example,
38*b077aed3SPierre Pronchery to compile for Android 10 arm64 with a side-by-side NDK r20.0.5594570
39*b077aed3SPierre Pronchery
40*b077aed3SPierre Pronchery    export ANDROID_NDK_ROOT=/home/whoever/Android/android-sdk/ndk/20.0.5594570
41*b077aed3SPierre Pronchery    PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
42*b077aed3SPierre Pronchery    ./Configure android-arm64 -D__ANDROID_API__=29
43*b077aed3SPierre Pronchery    make
44*b077aed3SPierre Pronchery
45*b077aed3SPierre Pronchery Older versions of the NDK have GCC under their common prebuilt tools
46*b077aed3SPierre Pronchery directory, so the bin path will be slightly different. EG: to compile
47*b077aed3SPierre Pronchery for ICS on ARM with NDK 10d:
48*b077aed3SPierre Pronchery
49*b077aed3SPierre Pronchery    export ANDROID_NDK_ROOT=/some/where/android-ndk-10d
50*b077aed3SPierre Pronchery    PATH=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin:$PATH
51*b077aed3SPierre Pronchery    ./Configure android-arm -D__ANDROID_API__=14
52*b077aed3SPierre Pronchery    make
53*b077aed3SPierre Pronchery
54*b077aed3SPierre Pronchery Caveat lector! Earlier OpenSSL versions relied on additional `CROSS_SYSROOT`
55*b077aed3SPierre Pronchery variable set to `$ANDROID_NDK_ROOT/platforms/android-<api>/arch-<arch>` to
56*b077aed3SPierre Pronchery appoint headers-n-libraries' location. It's still recognized in order
57*b077aed3SPierre Pronchery to facilitate migration from older projects. However, since API level
58*b077aed3SPierre Pronchery appears in `CROSS_SYSROOT` value, passing `-D__ANDROID_API__=N` can be in
59*b077aed3SPierre Pronchery conflict, and mixing the two is therefore not supported. Migration to
60*b077aed3SPierre Pronchery `CROSS_SYSROOT`-less setup is recommended.
61*b077aed3SPierre Pronchery
62*b077aed3SPierre Pronchery One can engage clang by adjusting PATH to cover same NDK's clang. Just
63*b077aed3SPierre Pronchery keep in mind that if you miss it, Configure will try to use gcc...
64*b077aed3SPierre Pronchery Also, PATH would need even further adjustment to cover unprefixed, yet
65*b077aed3SPierre Pronchery target-specific, ar and ranlib. It's possible that you don't need to
66*b077aed3SPierre Pronchery bother, if binutils-multiarch is installed on your Linux system.
67*b077aed3SPierre Pronchery
68*b077aed3SPierre Pronchery Another option is to create so called "standalone toolchain" tailored
69*b077aed3SPierre Pronchery for single specific platform including Android API level, and assign its
70*b077aed3SPierre Pronchery location to `ANDROID_NDK_ROOT`. In such case you have to pass matching
71*b077aed3SPierre Pronchery target name to Configure and shouldn't use `-D__ANDROID_API__=N`. `PATH`
72*b077aed3SPierre Pronchery adjustment becomes simpler, `$ANDROID_NDK_ROOT/bin:$PATH` suffices.
73*b077aed3SPierre Pronchery
74*b077aed3SPierre Pronchery Running tests (on Linux)
75*b077aed3SPierre Pronchery ------------------------
76*b077aed3SPierre Pronchery
77*b077aed3SPierre Pronchery This is not actually supported. Notes are meant rather as inspiration.
78*b077aed3SPierre Pronchery
79*b077aed3SPierre Pronchery Even though build output targets alien system, it's possible to execute
80*b077aed3SPierre Pronchery test suite on Linux system by employing qemu-user. The trick is static
81*b077aed3SPierre Pronchery linking. Pass -static to Configure, then edit generated Makefile and
82*b077aed3SPierre Pronchery remove occurrences of -ldl and -pie flags. You would also need to pick
83*b077aed3SPierre Pronchery API version that comes with usable static libraries, 42/2=21 used to
84*b077aed3SPierre Pronchery work. Once built, you should be able to
85*b077aed3SPierre Pronchery
86*b077aed3SPierre Pronchery    env EXE_SHELL=qemu-<arch> make test
87*b077aed3SPierre Pronchery
88*b077aed3SPierre Pronchery If you need to pass additional flag to qemu, quotes are your friend, e.g.
89*b077aed3SPierre Pronchery
90*b077aed3SPierre Pronchery    env EXE_SHELL="qemu-mips64el -cpu MIPS64R6-generic" make test
91