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