| enable_language(C) |
| enable_language(CXX) |
| |
| if(NOT ANDROID) |
| message(SEND_ERROR "CMake variable 'ANDROID' is not set to a true value.") |
| endif() |
| |
| set(files |
| "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" |
| ) |
| if(NOT CMAKE_ANDROID_NDK_VERSION VERSION_GREATER_EQUAL 22) |
| list(APPEND files |
| "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ld${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" |
| ) |
| endif() |
| if(NOT CMAKE_ANDROID_NDK_VERSION VERSION_GREATER_EQUAL 19) |
| list(APPEND files |
| "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" |
| "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}g++${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" |
| ) |
| endif() |
| foreach(f IN LISTS files) |
| if(NOT EXISTS "${f}") |
| message(SEND_ERROR "Expected file does not exist:\n \"${f}\"") |
| endif() |
| endforeach() |
| |
| string(APPEND CMAKE_C_FLAGS " -Werror -Wno-attributes") |
| string(APPEND CMAKE_CXX_FLAGS " -Werror -Wno-attributes") |
| string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-no-undefined") |
| |
| if(CMAKE_ANDROID_NDK) |
| if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION) |
| message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is not set!") |
| elseif(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "^clang") |
| add_definitions(-DCOMPILER_IS_CLANG) |
| elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "toolchains/[^/]+-${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}/prebuilt") |
| message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is\n" |
| " ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}\n" |
| "which does not appear in CMAKE_C_COMPILER:\n" |
| " ${CMAKE_C_COMPILER}") |
| endif() |
| if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG) |
| message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is not set!") |
| elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "prebuilt/${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}/bin") |
| message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is\n" |
| " ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}\n" |
| "which does not appear in CMAKE_C_COMPILER:\n" |
| " ${CMAKE_C_COMPILER}") |
| endif() |
| elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN) |
| execute_process( |
| COMMAND ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/clang --version |
| OUTPUT_VARIABLE _out |
| ERROR_VARIABLE _err |
| RESULT_VARIABLE _res |
| ) |
| if(_res EQUAL 0) |
| add_definitions(-DCOMPILER_IS_CLANG) |
| endif() |
| endif() |
| |
| set(gcc ${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}) |
| if(EXISTS "${gcc}") |
| execute_process( |
| COMMAND "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" -dumpmachine |
| OUTPUT_VARIABLE _out OUTPUT_STRIP_TRAILING_WHITESPACE |
| ERROR_VARIABLE _err |
| RESULT_VARIABLE _res |
| ) |
| if(NOT _res EQUAL 0) |
| message(SEND_ERROR "Failed to run 'gcc -dumpmachine':\n ${_res}") |
| endif() |
| string(REPLACE "--" "-" _out_check "${_out}") |
| if(NOT _out_check STREQUAL "${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}" |
| AND NOT (_out STREQUAL "arm--linux-android" AND CMAKE_C_ANDROID_TOOLCHAIN_MACHINE STREQUAL "arm-linux-androideabi")) |
| message(SEND_ERROR "'gcc -dumpmachine' produced:\n" |
| " ${_out}\n" |
| "which does not match CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n" |
| " ${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}" |
| ) |
| endif() |
| endif() |
| |
| if(CMAKE_ANDROID_STL_TYPE STREQUAL "none") |
| add_definitions(-DSTL_NONE) |
| elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "system") |
| add_definitions(-DSTL_SYSTEM) |
| elseif(CMAKE_ANDROID_STL_TYPE MATCHES [[^gabi\+\+]]) |
| add_definitions(-DSTL_GABI) |
| elseif(CMAKE_ANDROID_STL_TYPE MATCHES [[^stlport]]) |
| add_definitions(-DSTL_STLPORT) |
| endif() |
| |
| string(REPLACE "-" "_" abi "${CMAKE_ANDROID_ARCH_ABI}") |
| add_definitions(-DABI_${abi}) |
| add_definitions(-DAPI_LEVEL=${CMAKE_SYSTEM_VERSION}) |
| if(CMAKE_ANDROID_ARCH_ABI MATCHES "^armeabi") |
| add_definitions(-DARM_MODE=${CMAKE_ANDROID_ARM_MODE}) |
| message(STATUS "CMAKE_ANDROID_ARM_MODE=${CMAKE_ANDROID_ARM_MODE}") |
| endif() |
| if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a") |
| add_definitions(-DARM_NEON=${CMAKE_ANDROID_ARM_NEON}) |
| message(STATUS "CMAKE_ANDROID_ARM_NEON=${CMAKE_ANDROID_ARM_NEON}") |
| endif() |
| add_executable(android_c android.c) |
| add_executable(android_cxx android.cxx) |
| add_library(android_cxx_lib SHARED android_lib.cxx) |
| |
| set(objdump "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}objdump${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}") |
| if(NOT EXISTS "${objdump}") |
| message(FATAL_ERROR "Expected tool missing:\n ${objdump}") |
| endif() |
| |
| if(NOT CMAKE_ANDROID_STL_TYPE MATCHES "^(system|stlport_static|stlport_shared)$") |
| foreach(tgt android_cxx android_cxx_lib) |
| add_custom_command(TARGET ${tgt} POST_BUILD |
| COMMAND ${CMAKE_COMMAND} |
| -Dobjdump=${objdump} |
| -Dfile=$<TARGET_FILE:${tgt}> |
| -P ${CMAKE_CURRENT_SOURCE_DIR}/check_binary.cmake |
| ) |
| endforeach() |
| endif() |
| |
| # Test that an explicit /usr/include is ignored in favor of |
| # appearing as a standard include directory at the end. |
| set(sysinc_dirs) |
| if(CMAKE_ANDROID_NDK) |
| if(NOT CMAKE_ANDROID_NDK_DEPRECATED_HEADERS) |
| list(APPEND sysinc_dirs ${CMAKE_SYSROOT_COMPILE}/usr/include) |
| else() |
| list(APPEND sysinc_dirs ${CMAKE_SYSROOT}/usr/include) |
| endif() |
| endif() |
| list(APPEND sysinc_dirs ${CMAKE_CURRENT_SOURCE_DIR}/sysinc) |
| add_executable(android_sysinc_c android_sysinc.c) |
| target_include_directories(android_sysinc_c SYSTEM PRIVATE ${sysinc_dirs}) |
| add_executable(android_sysinc_cxx android_sysinc.cxx) |
| target_include_directories(android_sysinc_cxx SYSTEM PRIVATE ${sysinc_dirs}) |