Additional

Advertising

android-cmake

CMake is great, and so is Android. This is a collection of CMake scripts that may be useful to the Android NDK community. It is based on experience from porting OpenCV library to Android: http://opencv.org/platforms/android.html

Main goal is to share these scripts so that devs that use CMake as their build system may easily compile native code for Android.

-fsigned-char is added to compiler flags to make char signed by default as it is on x86/x86_64;

GCC's stack protector is not used neither in Debug nor Release configurations;

No builds for multiple platforms (e.g. building for both arm and x86 require to run cmake twice with different parameters);

No file level Neon via .neon suffix;

The following features of ndk-build are not supported by the android-cmake yet:

armeabi-v7a-hard ABI

libc++_static/libc++_shared STL runtime

Basic options

Similarly to the NDK build system android-cmake allows to select between several compiler toolchains and target platforms. Most of the options can be set either as cmake arguments: -D<NAME>=<VALUE> or as environment variables:

ANDROID_NDK - path to the Android NDK. If not set then android-cmake will search for the most recent version of supported NDK in commonly used locations;

ANDROID_ABI - specifies the target Application Binary Interface (ABI). This option nearly matches to the APP_ABI variable used by ndk-build tool from Android NDK. If not specified then set to armeabi-v7a. Possible target names are:

armeabi-v7a with NEON - same as armeabi-v7a, but sets NEON as floating-point unit;

armeabi-v7a with VFPV3 - same as armeabi-v7a, but sets VFPv3_D32 as floating-point unit;

armeabi-v6 with VFP - tuned for ARMv6 processors having VFP;

x86 - IA-32 instruction set

mips - MIPS32 instruction set

arm64-v8a - ARMv8 AArch64 instruction set - only for NDK r10 and newer

x86_64 - Intel64 instruction set (r1) - only for NDK r10 and newer

mips64 - MIPS64 instruction set (r6) - only for NDK r10 and newer

ANDROID_NATIVE_API_LEVEL - level of android API to build for. Can be set either to full name (example: android-8) or a numeric value (example: 17). The default API level depends on the target ABI:

android-8 for ARM;

android-9 for x86 and MIPS;

android-21 for 64-bit ABIs.

Building for android-L is possible only when it is explicitly selected.

ANDROID_TOOLCHAIN_NAME - the name of compiler toolchain to be used. This option allows to select between different GCC and Clang versions. The list of possible values depends on the NDK version and will be printed by toolchain file if an invalid value is set. By default android-cmake selects the most recent version of GCC which can build for specified ANDROID_ABI.

Example values are:

aarch64-linux-android-4.9

aarch64-linux-android-clang3.5

arm-linux-androideabi-4.8

arm-linux-androideabi-4.9

arm-linux-androideabi-clang3.5

mips64el-linux-android-4.9

mipsel-linux-android-4.8

x86-4.9

x86_64-4.9

etc.

ANDROID_STL - the name of C++ runtime to use. The default is gnustl_static.

none - do not configure the runtime.

system - use the default minimal system C++ runtime library.

Implies -fno-rtti -fno-exceptions.

system_re - use the default minimal system C++ runtime library.

Implies -frtti -fexceptions.

gabi++_static - use the GAbi++ runtime as a static library.

Implies -frtti -fno-exceptions.

Available for NDK r7 and newer.

gabi++_shared - use the GAbi++ runtime as a shared library.

Implies -frtti -fno-exceptions.

Available for NDK r7 and newer.

stlport_static - use the STLport runtime as a static library.

Implies -fno-rtti -fno-exceptions for NDK before r7.

Implies -frtti -fno-exceptions for NDK r7 and newer.

stlport_shared - use the STLport runtime as a shared library.

Implies -fno-rtti -fno-exceptions for NDK before r7.

Implies -frtti -fno-exceptions for NDK r7 and newer.

gnustl_static - use the GNU STL as a static library.

Implies -frtti -fexceptions.

gnustl_shared - use the GNU STL as a shared library.

Implies -frtti -fno-exceptions.

Available for NDK r7b and newer.

Silently degrades to gnustl_static if not available.

NDK_CCACHE - path to ccache executable. If not set then initialized from NDK_CCACHE environment variable.

Advanced android-cmake options

Normally android-cmake users are not supposed to touch these variables but they might be useful to workaround some build issues:

ANDROID_FORCE_ARM_BUILD = OFF - generate 32-bit ARM instructions instead of Thumb. Applicable only for arm ABIs and is forced to be ON for armeabi-v6 with VFP;

ANDROID_NO_UNDEFINED = ON - show all undefined symbols as linker errors;

Finding packages

When crosscompiling CMake find_* commands are normally expected to find libraries and packages belonging to the same build target. So android-cmake configures CMake to search in Android-specific paths only and ignore your host system locations. So

find_package(ZLIB)

will surely find libz.so within the Android NDK.

However sometimes you need to locate a host package even when cross-compiling. For example you can be searching for your documentation generator. The android-cmake recommends you to use find_host_package and find_host_program macro defined in the android.toolchain.cmake:

find_host_package(Doxygen)
find_host_program(PDFLATEX pdflatex)

However this will break regular builds so instead of wrapping package search into platform-specific logic you can copy the following snippet into your project (put it after your top-level project() command):