|
|
|
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})
|