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