| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| # file Copyright.txt or https://cmake.org/licensing for details. | |
| # This module is shared by multiple languages; use include blocker. | |
| if(__ANDROID_COMPILER_COMMON) | |
| return() | |
| endif() | |
| set(__ANDROID_COMPILER_COMMON 1) | |
| if(CMAKE_ANDROID_NDK) | |
| # <ndk>/build/core/definitions.mk | |
| set(_ANDROID_STL_TYPES | |
| none | |
| system | |
| c++_static | |
| c++_shared | |
| gabi++_static | |
| gabi++_shared | |
| gnustl_static | |
| gnustl_shared | |
| stlport_static | |
| stlport_shared | |
| ) | |
| if(CMAKE_ANDROID_STL_TYPE) | |
| list(FIND _ANDROID_STL_TYPES "${CMAKE_ANDROID_STL_TYPE}" _ANDROID_STL_TYPE_FOUND) | |
| if(_ANDROID_STL_TYPE_FOUND EQUAL -1) | |
| string(REPLACE ";" "\n " _msg ";${_ANDROID_STL_TYPES}") | |
| message(FATAL_ERROR | |
| "The CMAKE_ANDROID_STL_TYPE '${CMAKE_ANDROID_STL_TYPE}' is not one of the allowed values:${_msg}\n" | |
| ) | |
| endif() | |
| unset(_ANDROID_STL_TYPE_FOUND) | |
| elseif(IS_DIRECTORY ${CMAKE_ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++) | |
| set(CMAKE_ANDROID_STL_TYPE "gnustl_static") | |
| else() | |
| set(CMAKE_ANDROID_STL_TYPE "c++_static") | |
| endif() | |
| unset(_ANDROID_STL_TYPES) | |
| # Forward Android-specific platform variables to try_compile projects. | |
| list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES | |
| CMAKE_ANDROID_STL_TYPE | |
| ) | |
| endif() | |
| if(CMAKE_ANDROID_STL_TYPE) | |
| if(CMAKE_ANDROID_NDK_TOOLCHAIN_UNIFIED) | |
| if(CMAKE_ANDROID_STL_TYPE STREQUAL "system") | |
| set(_ANDROID_STL_EXCEPTIONS 0) | |
| set(_ANDROID_STL_RTTI 0) | |
| macro(__android_stl lang) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -stdlib=libstdc++") | |
| if(_ANDROID_STL_EXCEPTIONS OR _ANDROID_STL_RTTI) | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " -lc++abi") | |
| if(CMAKE_SYSTEM_VERSION LESS 21) | |
| list(APPEND CMAKE_${lang}_STANDARD_LIBRARIES "-landroid_support") | |
| endif() | |
| endif() | |
| endmacro() | |
| elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "c++_static") | |
| set(_ANDROID_STL_EXCEPTIONS 1) | |
| set(_ANDROID_STL_RTTI 1) | |
| macro(__android_stl lang) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -stdlib=libc++") | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " -static-libstdc++") | |
| endmacro() | |
| elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "c++_shared") | |
| set(_ANDROID_STL_EXCEPTIONS 1) | |
| set(_ANDROID_STL_RTTI 1) | |
| macro(__android_stl lang) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -stdlib=libc++") | |
| endmacro() | |
| elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "none") | |
| set(_ANDROID_STL_RTTI 0) | |
| set(_ANDROID_STL_EXCEPTIONS 0) | |
| macro(__android_stl lang) | |
| # FIXME: Add a way to add project-wide language-specific compile-only flags. | |
| set(CMAKE_CXX_COMPILE_OBJECT | |
| "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE> -nostdinc++") | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " -nostdlib++") | |
| endmacro() | |
| else() | |
| message(FATAL_ERROR | |
| "Android: STL '${CMAKE_ANDROID_STL_TYPE}' not supported by this NDK." | |
| ) | |
| endif() | |
| if(DEFINED CMAKE_ANDROID_RTTI) | |
| set(_ANDROID_STL_RTTI ${CMAKE_ANDROID_RTTI}) | |
| endif() | |
| if(DEFINED CMAKE_ANDROID_EXCEPTIONS) | |
| set(_ANDROID_STL_EXCEPTIONS ${CMAKE_ANDROID_EXCEPTIONS}) | |
| endif() | |
| elseif(CMAKE_ANDROID_NDK) | |
| macro(__android_stl_inc lang dir req) | |
| if(EXISTS "${dir}") | |
| list(APPEND CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES "${dir}") | |
| elseif(${req}) | |
| message(FATAL_ERROR | |
| "Android: STL '${CMAKE_ANDROID_STL_TYPE}' include directory not found:\n" | |
| " ${dir}" | |
| ) | |
| endif() | |
| endmacro() | |
| macro(__android_stl_lib lang lib req) | |
| if(CMAKE_ANDROID_ARCH_ABI MATCHES "^armeabi" AND NOT CMAKE_ANDROID_ARM_MODE) | |
| get_filename_component(_ANDROID_STL_LIBDIR "${lib}" DIRECTORY) | |
| get_filename_component(_ANDROID_STL_LIBNAME "${lib}" NAME) | |
| set(_ANDROID_STL_LIBTHUMB "${_ANDROID_STL_LIBDIR}/thumb/${_ANDROID_STL_LIBNAME}") | |
| unset(_ANDROID_STL_LIBDIR) | |
| unset(_ANDROID_STL_LIBNAME) | |
| else() | |
| set(_ANDROID_STL_LIBTHUMB "") | |
| endif() | |
| if(_ANDROID_STL_LIBTHUMB AND EXISTS "${_ANDROID_STL_LIBTHUMB}") | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " \"${_ANDROID_STL_LIBTHUMB}\"") | |
| elseif(EXISTS "${lib}") | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " \"${lib}\"") | |
| elseif(${req}) | |
| message(FATAL_ERROR | |
| "Android: STL '${CMAKE_ANDROID_STL_TYPE}' library file not found:\n" | |
| " ${lib}" | |
| ) | |
| endif() | |
| unset(_ANDROID_STL_LIBTHUMB) | |
| endmacro() | |
| include(Platform/Android/ndk-stl-${CMAKE_ANDROID_STL_TYPE}) | |
| else() | |
| macro(__android_stl lang) | |
| endmacro() | |
| endif() | |
| else() | |
| macro(__android_stl lang) | |
| endmacro() | |
| endif() | |
| # The NDK toolchain configuration files at: | |
| # | |
| # <ndk>/[build/core/]toolchains/*/setup.mk | |
| # | |
| # contain logic to set TARGET_CFLAGS and TARGET_LDFLAGS (and debug/release | |
| # variants) to tell their build system what flags to pass for each ABI. | |
| # We need to produce the same flags here to produce compatible binaries. | |
| # We initialize these variables here and set them in the compiler-specific | |
| # modules that include this one. Then we use them in the macro below when | |
| # it is called. | |
| set(_ANDROID_ABI_INIT_CFLAGS "") | |
| set(_ANDROID_ABI_INIT_CFLAGS_DEBUG "") | |
| set(_ANDROID_ABI_INIT_CFLAGS_RELEASE "") | |
| set(_ANDROID_ABI_INIT_LDFLAGS "") | |
| set(_ANDROID_ABI_INIT_EXE_LDFLAGS "") | |
| macro(__android_compiler_common lang) | |
| if(_ANDROID_ABI_INIT_CFLAGS) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " ${_ANDROID_ABI_INIT_CFLAGS}") | |
| endif() | |
| if(_ANDROID_ABI_INIT_CFLAGS_DEBUG) | |
| string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " ${_ANDROID_ABI_INIT_CFLAGS_DEBUG}") | |
| endif() | |
| if(_ANDROID_ABI_INIT_CFLAGS_RELEASE) | |
| string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " ${_ANDROID_ABI_INIT_CFLAGS_RELEASE}") | |
| string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " ${_ANDROID_ABI_INIT_CFLAGS_RELEASE}") | |
| string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT " ${_ANDROID_ABI_INIT_CFLAGS_RELEASE}") | |
| endif() | |
| if(_ANDROID_ABI_INIT_LDFLAGS) | |
| foreach(t EXE SHARED MODULE) | |
| string(APPEND CMAKE_${t}_LINKER_FLAGS_INIT " ${_ANDROID_ABI_INIT_LDFLAGS}") | |
| endforeach() | |
| endif() | |
| if(_ANDROID_ABI_INIT_EXE_LDFLAGS) | |
| string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ${_ANDROID_ABI_INIT_EXE_LDFLAGS}") | |
| endif() | |
| if(DEFINED _ANDROID_STL_EXCEPTIONS) | |
| if(_ANDROID_STL_EXCEPTIONS) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -fexceptions") | |
| else() | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -fno-exceptions") | |
| endif() | |
| endif() | |
| if("x${lang}" STREQUAL "xCXX" AND DEFINED _ANDROID_STL_RTTI) | |
| if(_ANDROID_STL_RTTI) | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -frtti") | |
| else() | |
| string(APPEND CMAKE_${lang}_FLAGS_INIT " -fno-rtti") | |
| endif() | |
| endif() | |
| if("x${lang}" STREQUAL "xCXX") | |
| __android_stl(CXX) | |
| endif() | |
| if(CMAKE_ANDROID_NDK_TOOLCHAIN_UNIFIED) | |
| string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " -latomic -lm") | |
| endif() | |
| # <ndk>/build/core/definitions.mk appends the sysroot's include directory | |
| # explicitly at the end of the command-line include path so that it | |
| # precedes the toolchain's builtin include directories. This is | |
| # necessary so that Android API-version-specific headers are preferred | |
| # over those in the toolchain's `include-fixed` directory (which cannot | |
| # possibly match all versions). | |
| # | |
| # Do not do this for a standalone toolchain because it is already | |
| # tied to a specific API version. | |
| if(CMAKE_ANDROID_NDK AND NOT CMAKE_ANDROID_NDK_TOOLCHAIN_UNIFIED) | |
| if(CMAKE_SYSROOT_COMPILE) | |
| set(_cmake_sysroot_compile "${CMAKE_SYSROOT_COMPILE}") | |
| else() | |
| set(_cmake_sysroot_compile "${CMAKE_SYSROOT}") | |
| endif() | |
| if(NOT CMAKE_ANDROID_NDK_DEPRECATED_HEADERS) | |
| list(APPEND CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES | |
| "${_cmake_sysroot_compile}/usr/include" | |
| "${_cmake_sysroot_compile}/usr/include/${CMAKE_ANDROID_ARCH_TRIPLE}" | |
| ) | |
| else() | |
| list(APPEND CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES "${_cmake_sysroot_compile}/usr/include") | |
| endif() | |
| unset(_cmake_sysroot_compile) | |
| endif() | |
| endmacro() |