common.cmake 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. enable_language(C)
  2. enable_language(CXX)
  3. if(NOT ANDROID)
  4. message(SEND_ERROR "CMake variable 'ANDROID' is not set to a true value.")
  5. endif()
  6. foreach(f
  7. "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}"
  8. "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}g++${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
  9. "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}cpp${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
  10. "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
  11. "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ld${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
  12. )
  13. if(NOT EXISTS "${f}")
  14. message(SEND_ERROR "Expected file does not exist:\n \"${f}\"")
  15. endif()
  16. endforeach()
  17. string(APPEND CMAKE_C_FLAGS " -Werror -Wno-attributes")
  18. string(APPEND CMAKE_CXX_FLAGS " -Werror -Wno-attributes")
  19. string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-no-undefined")
  20. if(CMAKE_ANDROID_NDK)
  21. if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION)
  22. message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is not set!")
  23. elseif(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "^clang")
  24. add_definitions(-DCOMPILER_IS_CLANG)
  25. elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "toolchains/[^/]+-${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}/prebuilt")
  26. message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is\n"
  27. " ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}\n"
  28. "which does not appear in CMAKE_C_COMPILER:\n"
  29. " ${CMAKE_C_COMPILER}")
  30. endif()
  31. if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG)
  32. message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is not set!")
  33. elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "prebuilt/${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}/bin")
  34. message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is\n"
  35. " ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}\n"
  36. "which does not appear in CMAKE_C_COMPILER:\n"
  37. " ${CMAKE_C_COMPILER}")
  38. endif()
  39. elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
  40. execute_process(
  41. COMMAND ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/clang --version
  42. OUTPUT_VARIABLE _out
  43. ERROR_VARIABLE _err
  44. RESULT_VARIABLE _res
  45. )
  46. if(_res EQUAL 0)
  47. add_definitions(-DCOMPILER_IS_CLANG)
  48. endif()
  49. endif()
  50. execute_process(
  51. COMMAND "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" -dumpmachine
  52. OUTPUT_VARIABLE _out OUTPUT_STRIP_TRAILING_WHITESPACE
  53. ERROR_VARIABLE _err
  54. RESULT_VARIABLE _res
  55. )
  56. if(NOT _res EQUAL 0)
  57. message(SEND_ERROR "Failed to run 'gcc -dumpmachine':\n ${_res}")
  58. endif()
  59. if(NOT _out STREQUAL "${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}")
  60. message(SEND_ERROR "'gcc -dumpmachine' produced:\n"
  61. " ${_out}\n"
  62. "which is not equal to CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n"
  63. " ${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}"
  64. )
  65. endif()
  66. if(CMAKE_ANDROID_STL_TYPE STREQUAL "none")
  67. add_definitions(-DSTL_NONE)
  68. elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "system")
  69. add_definitions(-DSTL_SYSTEM)
  70. elseif(CMAKE_ANDROID_STL_TYPE MATCHES [[^gabi\+\+]])
  71. add_definitions(-DSTL_GABI)
  72. elseif(CMAKE_ANDROID_STL_TYPE MATCHES [[^stlport]])
  73. add_definitions(-DSTL_STLPORT)
  74. endif()
  75. string(REPLACE "-" "_" abi "${CMAKE_ANDROID_ARCH_ABI}")
  76. add_definitions(-DABI_${abi})
  77. add_definitions(-DAPI_LEVEL=${CMAKE_SYSTEM_VERSION})
  78. if(CMAKE_ANDROID_ARCH_ABI MATCHES "^armeabi")
  79. add_definitions(-DARM_MODE=${CMAKE_ANDROID_ARM_MODE})
  80. message(STATUS "CMAKE_ANDROID_ARM_MODE=${CMAKE_ANDROID_ARM_MODE}")
  81. endif()
  82. if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a")
  83. add_definitions(-DARM_NEON=${CMAKE_ANDROID_ARM_NEON})
  84. message(STATUS "CMAKE_ANDROID_ARM_NEON=${CMAKE_ANDROID_ARM_NEON}")
  85. endif()
  86. add_executable(android_c android.c)
  87. add_executable(android_cxx android.cxx)
  88. # Test that an explicit /usr/include is ignored in favor of
  89. # appearing as a standard include directory at the end.
  90. set(sysinc_dirs)
  91. if(CMAKE_ANDROID_NDK)
  92. if(NOT CMAKE_ANDROID_NDK_DEPRECATED_HEADERS)
  93. list(APPEND sysinc_dirs ${CMAKE_SYSROOT_COMPILE}/usr/include)
  94. else()
  95. list(APPEND sysinc_dirs ${CMAKE_SYSROOT}/usr/include)
  96. endif()
  97. endif()
  98. list(APPEND sysinc_dirs ${CMAKE_CURRENT_SOURCE_DIR}/sysinc)
  99. add_executable(android_sysinc_c android_sysinc.c)
  100. target_include_directories(android_sysinc_c SYSTEM PRIVATE ${sysinc_dirs})
  101. add_executable(android_sysinc_cxx android_sysinc.cxx)
  102. target_include_directories(android_sysinc_cxx SYSTEM PRIVATE ${sysinc_dirs})