summaryrefslogtreecommitdiff
path: root/Tests/RunCMake/Android/common.cmake
blob: f931be1f86afb3560d1d708c09c7c1fae5d399e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
enable_language(C)
enable_language(CXX)

if(NOT ANDROID)
  message(SEND_ERROR "CMake variable 'ANDROID' is not set to a true value.")
endif()

foreach(f
    "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}"
    "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}g++${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
    "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}cpp${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
    "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
    "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ld${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
    )
  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()

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()
if(NOT _out STREQUAL "${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}")
  message(SEND_ERROR "'gcc -dumpmachine' produced:\n"
    " ${_out}\n"
    "which is not equal to CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n"
    " ${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}"
    )
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")
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})