# Android CMake toolchain file, for use with the ndk r5,r6
# Android CMake toolchain file, for use with the ndk r5,r6,r7
# See home page: http://code.google.com/p/android-cmake/
#
# Usage Linux:
...
...
@@ -8,56 +8,63 @@
# $ make
#
# Usage Linux (using standalone toolchain):
# $ export ANDROID_NDK_TOOLCHAIN_ROOT=/<absolute path to standalone toolchain>
# $ export ANDROID_STANDALONE_TOOLCHAIN=/<absolute path to standalone toolchain>
# $ cmake -DCMAKE_TOOLCHAIN_FILE=<path to this file>/android.toolchain.cmake ..
# $ make
#
# Usage Windows:
# You need native port of make to build your project.
# NDK r7 already has make.exe on board. For older versions you need to intall it seperately.
# For example this one: http://gnuwin32.sourceforge.net/packages/make.htm
#
# $ SET ANDROID_NDK=C:\<absolute path to NDK>\android-ndk-r6b
# $ cmake.exe -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=<path to this file>\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=C:\<absolute path to make>\make.exe ..
# $ C:\<absolute path to make>\make.exe
# $ SET ANDROID_NDK=C:\<absolute path to NDK>\android-ndk-r7
# $ cmake.exe -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=<path to this file>\android.toolchain.cmake -DCMAKE_BUILD_TOOL="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" ..
# $ "%ANDROID_NDK%\prebuilt\windows\bin\make.exe"
#
#
# Toolchain options (can be set as cmake parameters: -D<option_name>=<value>):
# ANDROID_NDK=/opt/android-ndk-r6b - path to NDK root.
# Can be set as environment variable.
# ANDROID_NDK=/opt/android-ndk-r7 - path to NDK root.
# Can be set as environment variable. Can be set only at first cmake run.
#
# ANDROID_NDK_TOOLCHAIN_ROOT=/opt/android-toolchain - path to standalone toolchain.
# ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain - path to standalone toolchain.
# Option is not used if full NDK is found. Can be set as environment variable.
# Can be set only at first cmake run.
#
# ANDROID_API_LEVEL=android-8 - level of android API to use.
# Option is ignored when build uses stanalone toolchain.
# ANDROID_ABI=armeabi-v7a - type of floating point support.
# Other possible values are: "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86"
#
# ARM_TARGET=armeabi-v7a - type of floating point support.
# Other possible values are: "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3"
# ANDROID_NATIVE_API_LEVEL=android-8 - level of android API to use.
# Option is read-only when build uses stanalone toolchain.
#
# FORCE_ARM=false - set true to generate 32-bit ARM instructions instead of Thumb-1.
# ANDROID_FORCE_ARM_BUILD=OFF - set true to generate 32-bit ARM instructions instead of Thumb-1.
# Is not available for "x86" (missing) and "armeabi-v6 with VFP" (forced) ABIs.
#
# NO_UNDEFINED=true - set true to show all undefined symbols will as linker errors even if they are not used.
# ANDROID_NO_UNDEFINED=ON - set true to show all undefined symbols as linker errors even if they are not used.
#
# LIBRARY_OUTPUT_PATH_ROOT=${CMAKE_SOURCE_DIR} - where to output binary files. See details below.
#
# Toolcahin will search for NDK/toolchain in following order:
# ANDROID_SET_OBSOLETE_VARIABLES=ON - it set, then toolchain define some obsolete variables which
# was set by previous versions of this file for backward compatibility.
#
# android-cmake toolcahain will search for NDK/toolchain in the following order:
if( NOT ${ANDROID_LEVEL_FOUND} EQUAL ${_expected})
message( FATAL_ERROR "Specified Android API level does not match level found. Probably your copy of NDK/toolchain is broken.")
if("${${var_name}}" STREQUAL "")
set( __values 0 )
foreach( __var ${ARGN})
if( __var STREQUAL "VALUES")
set( __values 1 )
elseif( NOT __var STREQUAL "PATH")
set( __obsolete 0 )
if( __var MATCHES "^OBSOLETE_.*$")
string( REPLACE "OBSOLETE_""" __var "${__var}")
set( __obsolete 1 )
endif()
if( __var MATCHES "^ENV_.*$")
string( REPLACE "ENV_""" __var "${__var}")
set( __value "$ENV{${__var}}")
elseif( DEFINED ${__var})
set( __value "${${__var}}")
else()
if( __values )
set( __value "${__var}")
else()
set( __value "")
endif()
endif()
if( NOT "${__value}" STREQUAL "")
if( __test_path )
if( EXISTS "${__value}")
set(${var_name}"${__value}")
if( __obsolete )
message( WARNING "Using value of obsolete variable ${__var} as initial value for ${var_name}. Please note, that ${__var} can be completely removed in future versions of the toolchain.")
endif()
set( ANDROID_API_LEVEL ${ANDROID_LEVEL_FOUND} CACHE STRING "android API level" FORCE )
message( STATUS "Using default path for android NDK ${ANDROID_NDK}")
message( STATUS " If you prefer to use a different location, please define the variable: ANDROID_NDK")
break()
endif()
endforeach()
endif()
if( EXISTS "${ANDROID_NDK}")
set( ANDROID_NDK "${ANDROID_NDK}" CACHE PATH "root of the android ndk" FORCE )
if( APPLE )
set( NDKSYSTEM "darwin-x86")
elseif( WIN32 )
set( NDKSYSTEM "windows")
set( TOOL_OS_SUFFIX ".exe")
elseif( UNIX )
set( NDKSYSTEM "linux-x86")
else()
message( FATAL_ERROR "Your platform is not supported")
set(${var_name}"${__value}")
if( __obsolete )
message( WARNING "Using value of obsolete variable ${__var} as initial value for ${var_name}. Please note, that ${__var} can be completely removed in future versions of the toolchain.")
message( FATAL_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken.")
set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE )
#set target ABI options
if( ANDROID_ABI STREQUAL "x86")
set( X86 true )
set( ANDROID_NDK_ABI_NAME "x86")
set( ANDROID_ARCH_NAME "x86")
set( CMAKE_SYSTEM_PROCESSOR "i686")
elseif( ANDROID_ABI STREQUAL "armeabi")
set( ARMEABI true )
set( ARMEABI_NDK_NAME "armeabi")
set(NEON false)
set( ANDROID_NDK_ABI_NAME "armeabi")
set(ANDROID_ARCH_NAME "arm")
set( CMAKE_SYSTEM_PROCESSOR "armv5te")
else()
if( ARM_TARGET STREQUAL "armeabi-v7a with NEON")
set( NEON true )
set( VFPV3 true )
elseif( ARM_TARGET STREQUAL "armeabi-v7a with VFPV3")
elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP")
set( ARMEABI_V6 true )
set( ANDROID_NDK_ABI_NAME "armeabi")
set( ANDROID_ARCH_NAME "arm")
set( CMAKE_SYSTEM_PROCESSOR "armv6")
#need always fallback to older platform
set( ARMEABI true )
elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
set( ARMEABI_V7A true )
set( ANDROID_NDK_ABI_NAME "armeabi-v7a")
set( ANDROID_ARCH_NAME "arm")
set( CMAKE_SYSTEM_PROCESSOR "armv7-a")
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3")
set( ARMEABI_V7A true )
set( ANDROID_NDK_ABI_NAME "armeabi-v7a")
set( ANDROID_ARCH_NAME "arm")
set( CMAKE_SYSTEM_PROCESSOR "armv7-a")
set( VFPV3 true )
elseif( NOT ARM_TARGET STREQUAL "armeabi-v7a")
message( FATAL_ERROR "Unsupported ARM_TARGET=${ARM_TARGET} is specified.
Supported values are: \"armeabi\", \"armeabi-v7a\", \"armeabi-v7a with NEON\", \"armeabi-v7a with VFPV3\"
")
endif()
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON")
set( ARMEABI_V7A true )
set( ARMEABI_NDK_NAME "armeabi-v7a")
set( ANDROID_NDK_ABI_NAME "armeabi-v7a")
set( ANDROID_ARCH_NAME "arm")
set( CMAKE_SYSTEM_PROCESSOR "armv7-a")
set( VFPV3 true )
set( NEON true )
else()
message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified.")
endif()
set( ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} CACHE INTERNAL "ANDROID_ABI can be changed only to one of these ABIs. Changing to any other ABI requires to reset cmake cache.")
message( FATAL_ERROR "Previously selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing. You need to remove CMakeCache.txt and rerun cmake manually to change the toolchain")
endif()
list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
message( FATAL_ERROR "Previously selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform.")
if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL )
message( FATAL_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken.")
endif()
unset( __realApiLevel )
endif()
set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE )
if( __stlLibPath AND EXISTS "${__stlLibPath}/include")
include_directories( SYSTEM "${__stlLibPath}/include")
endif()
if( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/thumb/bits")
include_directories( SYSTEM "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/thumb")
include_directories( SYSTEM "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}")
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits")
include_directories( SYSTEM "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb")
include_directories( SYSTEM "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}")
endif()
# only search for libraries and includes in the ndk toolchain