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