| # Copyright (C) 2016 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # Configurable variables. |
| # Modeled after the ndk-build system. |
| # For any variables defined in: |
| # https://developer.android.com/ndk/guides/android_mk.html |
| # https://developer.android.com/ndk/guides/application_mk.html |
| # if it makes sense for CMake, then replace LOCAL, APP, or NDK with ANDROID, and |
| # we have that variable below. |
| # The exception is ANDROID_TOOLCHAIN vs NDK_TOOLCHAIN_VERSION. |
| # Since we only have one version of each gcc and clang, specifying a version |
| # doesn't make much sense. |
| # |
| # ANDROID_NDK |
| # ANDROID_TOOLCHAIN |
| # ANDROID_ABI |
| # ANDROID_PLATFORM |
| # ANDROID_STL |
| # ANDROID_PIE |
| # ANDROID_CPP_FEATURES |
| # ANDROID_ALLOW_UNDEFINED_SYMBOLS |
| # ANDROID_ARM_MODE |
| # ANDROID_ARM_NEON |
| # ANDROID_DISABLE_NO_EXECUTE |
| # ANDROID_DISABLE_RELRO |
| # ANDROID_DISABLE_FORMAT_STRING_CHECKS |
| # ANDROID_CCACHE |
| |
| cmake_minimum_required(VERSION 3.6.0) |
| |
| set(ANDROID_NDK_REVISION 12) |
| |
| # Touch toolchain variable to suppress "unused variable" warning. |
| # This happens if CMake is invoked with the same command line the second time. |
| if(CMAKE_TOOLCHAIN_FILE) |
| endif() |
| |
| # Compatibility for configurable variables. |
| # Compatible with configurable variables from the other toolchain file: |
| # https://github.com/taka-no-me/android-cmake |
| # TODO: We should consider dropping compatibility to simplify things once most |
| # of our users have migrated to our standard set of configurable variables. |
| if(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_TOOLCHAIN) |
| if(ANDROID_TOOLCHAIN_NAME MATCHES "-clang([0-9].[0-9])?$") |
| set(ANDROID_TOOLCHAIN clang) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "-[0-9].[0-9]$") |
| set(ANDROID_TOOLCHAIN gcc) |
| endif() |
| endif() |
| if(ANDROID_ABI STREQUAL "armeabi-v7a with NEON") |
| set(ANDROID_ABI armeabi-v7a) |
| set(ANDROID_ARM_NEON TRUE) |
| elseif(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_ABI) |
| if(ANDROID_TOOLCHAIN_NAME MATCHES "^arm-linux-androideabi-") |
| set(ANDROID_ABI armeabi-v7a) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^aarch64-linux-android-") |
| set(ANDROID_ABI arm64-v8a) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^x86-") |
| set(ANDROID_ABI x86) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^x86_64-") |
| set(ANDROID_ABI x86_64) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^mipsel-linux-android-") |
| set(ANDROID_ABI mips) |
| elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^mips64el-linux-android-") |
| set(ANDROID_ABI mips64) |
| endif() |
| endif() |
| if(ANDROID_NATIVE_API_LEVEL AND NOT ANDROID_PLATFORM) |
| if(ANDROID_NATIVE_API_LEVEL MATCHES "^android-[0-9]+$") |
| set(ANDROID_PLATFORM ${ANDROID_NATIVE_API_LEVEL}) |
| elseif(ANDROID_NATIVE_API_LEVEL MATCHES "^[0-9]+$") |
| set(ANDROID_PLATFORM android-${ANDROID_NATIVE_API_LEVEL}) |
| endif() |
| endif() |
| if(DEFINED ANDROID_APP_PIE AND NOT DEFINED ANDROID_PIE) |
| set(ANDROID_PIE "${ANDROID_APP_PIE}") |
| endif() |
| if(ANDROID_STL_FORCE_FEATURES AND NOT DEFINED ANDROID_CPP_FEATURES) |
| set(ANDROID_CPP_FEATURES "rtti exceptions") |
| endif() |
| if(DEFINED ANDROID_NO_UNDEFINED AND NOT DEFINED ANDROID_ALLOW_UNDEFINED_SYMBOLS) |
| if(ANDROID_NO_UNDEFINED) |
| set(ANDROID_ALLOW_UNDEFINED_SYMBOLS FALSE) |
| else() |
| set(ANDROID_ALLOW_UNDEFINED_SYMBOLS TRUE) |
| endif() |
| endif() |
| if(DEFINED ANDROID_SO_UNDEFINED AND NOT DEFINED ANDROID_ALLOW_UNDEFINED_SYMBOLS) |
| set(ANDROID_ALLOW_UNDEFINED_SYMBOLS "${ANDROID_SO_UNDEFINED}") |
| endif() |
| if(DEFINED ANDROID_FORCE_ARM_BUILD AND NOT ANDROID_ARM_MODE) |
| if(ANDROID_FORCE_ARM_BUILD) |
| set(ANDROID_ARM_MODE arm) |
| else() |
| set(ANDROID_ARM_MODE thumb) |
| endif() |
| endif() |
| if(DEFINED ANDROID_NOEXECSTACK AND NOT DEFINED ANDROID_DISABLE_NO_EXECUTE) |
| if(ANDROID_NOEXECSTACK) |
| set(ANDROID_DISABLE_NO_EXECUTE FALSE) |
| else() |
| set(ANDROID_DISABLE_NO_EXECUTE TRUE) |
| endif() |
| endif() |
| if(DEFINED ANDROID_RELRO AND NOT DEFINED ANDROID_DISABLE_RELRO) |
| if(ANDROID_RELRO) |
| set(ANDROID_DISABLE_RELRO FALSE) |
| else() |
| set(ANDROID_DISABLE_RELRO TRUE) |
| endif() |
| endif() |
| if(NDK_CCACHE AND NOT ANDROID_CCACHE) |
| set(ANDROID_CCACHE "${NDK_CCACHE}") |
| endif() |
| |
| # Default values for configurable variables. |
| if(NOT ANDROID_NDK) |
| if(DEFINED ENV{ANDROID_NDK_HOME} |
| AND IS_DIRECTORY "$ENV{ANDROID_NDK_HOME}") |
| set(ANDROID_NDK "$ENV{ANDROID_NDK_HOME}") |
| elseif(DEFINED ENV{ANDROID_HOME} |
| AND IS_DIRECTORY "$ENV{ANDROID_HOME}/ndk-bundle") |
| set(ANDROID_NDK "$ENV{ANDROID_HOME}/ndk-bundle") |
| elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux |
| AND IS_DIRECTORY "$ENV{HOME}/Android/Sdk/ndk-bundle") |
| set(ANDROID_NDK "$ENV{HOME}/Android/Sdk/ndk-bundle") |
| elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin |
| AND IS_DIRECTORY "$ENV{HOME}/Library/Android/sdk/ndk-bundle") |
| set(ANDROID_NDK "$ENV{HOME}/Library/Android/sdk/ndk-bundle") |
| elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows |
| AND IS_DIRECTORY "$ENV{LOCALAPPDATA}/Android/Sdk/ndk-bundle") |
| set(ANDROID_NDK "$ENV{LOCALAPPDATA}/Android/Sdk/ndk-bundle") |
| else() |
| message(FATAL_ERROR "Android NDK unspecified.") |
| endif() |
| endif() |
| file(TO_CMAKE_PATH "${ANDROID_NDK}" ANDROID_NDK) |
| if(NOT ANDROID_TOOLCHAIN) |
| set(ANDROID_TOOLCHAIN clang) |
| endif() |
| if(NOT ANDROID_ABI) |
| set(ANDROID_ABI armeabi-v7a) |
| endif() |
| if(ANDROID_PLATFORM MATCHES "^android-([0-8]|10|11)$") |
| set(ANDROID_PLATFORM android-9) |
| elseif(ANDROID_PLATFORM STREQUAL android-20) |
| set(ANDROID_PLATFORM android-19) |
| elseif(NOT ANDROID_PLATFORM) |
| set(ANDROID_PLATFORM android-9) |
| endif() |
| string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM}) |
| if(ANDROID_ABI MATCHES "64(-v8a)?$" AND ANDROID_PLATFORM_LEVEL LESS 21) |
| set(ANDROID_PLATFORM android-21) |
| set(ANDROID_PLATFORM_LEVEL 21) |
| endif() |
| if(NOT ANDROID_STL) |
| set(ANDROID_STL gnustl_static) |
| endif() |
| if(NOT DEFINED ANDROID_PIE) |
| if(ANDROID_PLATFORM_LEVEL LESS 16) |
| set(ANDROID_PIE FALSE) |
| else() |
| set(ANDROID_PIE TRUE) |
| endif() |
| endif() |
| if(NOT ANDROID_ARM_MODE) |
| set(ANDROID_ARM_MODE thumb) |
| endif() |
| |
| # Export configurable variables for the try_compile() command. |
| set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES |
| ANDROID_NDK |
| ANDROID_TOOLCHAIN |
| ANDROID_ABI |
| ANDROID_PLATFORM |
| ANDROID_STL |
| ANDROID_PIE |
| ANDROID_CPP_FEATURES |
| ANDROID_ALLOW_UNDEFINED_SYMBOLS |
| ANDROID_ARM_MODE |
| ANDROID_ARM_NEON |
| ANDROID_DISABLE_NO_EXECUTE |
| ANDROID_DISABLE_RELRO |
| ANDROID_DISABLE_FORMAT_STRING_CHECKS |
| ANDROID_CCACHE) |
| |
| # Standard cross-compiling stuff. |
| set(ANDROID TRUE) |
| set(CMAKE_SYSTEM_NAME Android) |
| set(CMAKE_SYSTEM_VERSION ${ANDROID_PLATFORM_LEVEL}) |
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
| set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) |
| |
| # ABI. |
| set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI}) |
| if(ANDROID_ABI MATCHES "^armeabi(-v7a)?$") |
| set(ANDROID_SYSROOT_ABI arm) |
| set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME}) |
| if(ANDROID_ABI STREQUAL armeabi) |
| set(CMAKE_SYSTEM_PROCESSOR armv5te) |
| set(ANDROID_LLVM_TRIPLE armv5te-none-linux-androideabi) |
| elseif(ANDROID_ABI STREQUAL armeabi-v7a) |
| set(CMAKE_SYSTEM_PROCESSOR armv7-a) |
| set(ANDROID_LLVM_TRIPLE armv7-none-linux-androideabi) |
| endif() |
| elseif(ANDROID_ABI STREQUAL arm64-v8a) |
| set(ANDROID_SYSROOT_ABI arm64) |
| set(CMAKE_SYSTEM_PROCESSOR aarch64) |
| set(ANDROID_TOOLCHAIN_NAME aarch64-linux-android) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME}) |
| set(ANDROID_LLVM_TRIPLE aarch64-none-linux-android) |
| elseif(ANDROID_ABI STREQUAL x86) |
| set(ANDROID_SYSROOT_ABI x86) |
| set(CMAKE_SYSTEM_PROCESSOR i686) |
| set(ANDROID_TOOLCHAIN_NAME i686-linux-android) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_ABI}) |
| set(ANDROID_LLVM_TRIPLE i686-none-linux-android) |
| elseif(ANDROID_ABI STREQUAL x86_64) |
| set(ANDROID_SYSROOT_ABI x86_64) |
| set(CMAKE_SYSTEM_PROCESSOR x86_64) |
| set(ANDROID_TOOLCHAIN_NAME x86_64-linux-android) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_ABI}) |
| set(ANDROID_LLVM_TRIPLE x86_64-none-linux-android) |
| elseif(ANDROID_ABI STREQUAL mips) |
| set(ANDROID_SYSROOT_ABI mips) |
| set(CMAKE_SYSTEM_PROCESSOR mips) |
| set(ANDROID_TOOLCHAIN_NAME mipsel-linux-android) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME}) |
| set(ANDROID_LLVM_TRIPLE mipsel-none-linux-android) |
| elseif(ANDROID_ABI STREQUAL mips64) |
| set(ANDROID_SYSROOT_ABI mips64) |
| set(CMAKE_SYSTEM_PROCESSOR mips64) |
| set(ANDROID_TOOLCHAIN_NAME mips64el-linux-android) |
| set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME}) |
| set(ANDROID_LLVM_TRIPLE mips64el-none-linux-android) |
| else() |
| message(FATAL_ERROR "Invalid Android ABI: ${ANDROID_ABI}.") |
| endif() |
| |
| # STL. |
| set(ANDROID_STL_STATIC_LIBRARIES) |
| set(ANDROID_STL_SHARED_LIBRARIES) |
| if(ANDROID_STL STREQUAL system) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| supc++) |
| elseif(ANDROID_STL STREQUAL stlport_static) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| stlport_static) |
| elseif(ANDROID_STL STREQUAL stlport_shared) |
| set(ANDROID_STL_SHARED_LIBRARIES |
| stlport_shared) |
| elseif(ANDROID_STL STREQUAL gnustl_static) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| gnustl_static) |
| elseif(ANDROID_STL STREQUAL gnustl_shared) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| supc++) |
| set(ANDROID_STL_SHARED_LIBRARIES |
| gnustl_shared) |
| elseif(ANDROID_STL STREQUAL c++_static) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| c++_static |
| c++abi |
| unwind |
| android_support) |
| elseif(ANDROID_STL STREQUAL c++_shared) |
| set(ANDROID_STL_STATIC_LIBRARIES |
| unwind) |
| set(ANDROID_STL_SHARED_LIBRARIES |
| c++_shared) |
| elseif(ANDROID_STL STREQUAL none) |
| else() |
| message(FATAL_ERROR "Invalid Android STL: ${ANDROID_STL}.") |
| endif() |
| |
| # Sysroot. |
| set(CMAKE_SYSROOT "${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}/arch-${ANDROID_SYSROOT_ABI}") |
| |
| # Toolchain. |
| if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) |
| set(ANDROID_HOST_TAG linux-x86_64) |
| elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) |
| set(ANDROID_HOST_TAG darwin-x86_64) |
| elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) |
| set(ANDROID_HOST_TAG windows-x86_64) |
| endif() |
| set(ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_ROOT}-4.9/prebuilt/${ANDROID_HOST_TAG}") |
| set(ANDROID_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_NAME}-") |
| if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) |
| set(ANDROID_TOOLCHAIN_SUFFIX .exe) |
| endif() |
| if(ANDROID_TOOLCHAIN STREQUAL clang) |
| set(ANDROID_LLVM_TOOLCHAIN_PREFIX "${ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}/bin/") |
| set(ANDROID_C_COMPILER "${ANDROID_LLVM_TOOLCHAIN_PREFIX}clang${ANDROID_TOOLCHAIN_SUFFIX}") |
| set(ANDROID_CXX_COMPILER "${ANDROID_LLVM_TOOLCHAIN_PREFIX}clang++${ANDROID_TOOLCHAIN_SUFFIX}") |
| # Clang can fail to compile if CMake doesn't correctly supply the target and |
| # external toolchain, but to do so, CMake needs to already know that the |
| # compiler is clang. Tell CMake that the compiler is really clang, but don't |
| # use CMakeForceCompiler, since we still want compile checks. We only want |
| # to skip the compiler ID detection step. |
| set(CMAKE_C_COMPILER_ID_RUN TRUE) |
| set(CMAKE_CXX_COMPILER_ID_RUN TRUE) |
| set(CMAKE_C_COMPILER_ID Clang) |
| set(CMAKE_CXX_COMPILER_ID Clang) |
| set(CMAKE_C_COMPILER_TARGET ${ANDROID_LLVM_TRIPLE}) |
| set(CMAKE_CXX_COMPILER_TARGET ${ANDROID_LLVM_TRIPLE}) |
| set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${ANDROID_TOOLCHAIN_ROOT}") |
| set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${ANDROID_TOOLCHAIN_ROOT}") |
| elseif(ANDROID_TOOLCHAIN STREQUAL gcc) |
| set(ANDROID_C_COMPILER "${ANDROID_TOOLCHAIN_PREFIX}gcc${ANDROID_TOOLCHAIN_SUFFIX}") |
| set(ANDROID_CXX_COMPILER "${ANDROID_TOOLCHAIN_PREFIX}g++${ANDROID_TOOLCHAIN_SUFFIX}") |
| else() |
| message(FATAL_ERROR "Invalid Android toolchain: ${ANDROID_TOOLCHAIN}.") |
| endif() |
| |
| # Check that the NDK is valid. |
| if(NOT IS_DIRECTORY "${ANDROID_NDK}" |
| OR NOT IS_DIRECTORY "${ANDROID_NDK}/platforms" |
| OR NOT IS_DIRECTORY "${ANDROID_NDK}/prebuilt" |
| OR NOT IS_DIRECTORY "${ANDROID_NDK}/sources" |
| OR NOT IS_DIRECTORY "${ANDROID_NDK}/toolchains") |
| message(FATAL_ERROR "Invalid Android NDK: ${ANDROID_NDK}.") |
| elseif(NOT IS_DIRECTORY "${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}") |
| message(FATAL_ERROR "Invalid Android platform: ${ANDROID_PLATFORM}.") |
| elseif(NOT IS_DIRECTORY "${CMAKE_SYSROOT}") |
| message(FATAL_ERROR "Invalid Android sysroot: ${CMAKE_SYSROOT}.") |
| endif() |
| # Check if source.properties file exists. |
| if(NOT EXISTS "${ANDROID_NDK}/source.properties") |
| message(FATAL_ERROR "Missing file: ${ANDROID_NDK}/source.properties. Please use NDK r12+.") |
| endif() |
| file(READ "${ANDROID_NDK}/source.properties" ANDROID_NDK_SOURCE_PROPERTIES) |
| set(ANDROID_NDK_SOURCE_PROPERTIES_REGEX |
| "^Pkg\\.Desc = Android NDK\nPkg\\.Revision = ([0-9]+\\.[0-9]+\\.[0-9]+(-beta[0-9]+)?)\n$") |
| if(NOT ANDROID_NDK_SOURCE_PROPERTIES MATCHES "${ANDROID_NDK_SOURCE_PROPERTIES_REGEX}") |
| message(FATAL_ERROR "Failed to parse Android NDK revision: ${ANDROID_NDK}/source.properties.") |
| endif() |
| string(REGEX REPLACE "${ANDROID_NDK_SOURCE_PROPERTIES_REGEX}" "\\1" |
| ANDROID_NDK_PACKAGE_REVISION "${ANDROID_NDK_SOURCE_PROPERTIES}") |
| if(NOT ANDROID_NDK_PACKAGE_REVISION MATCHES "^${ANDROID_NDK_REVISION}\\.") |
| message(FATAL_ERROR "Invalid Android NDK revision (should be ${ANDROID_NDK_REVISION}): ${ANDROID_NDK_PACKAGE_REVISION}.") |
| endif() |
| |
| set(ANDROID_COMPILER_FLAGS) |
| set(ANDROID_COMPILER_FLAGS_CXX) |
| set(ANDROID_COMPILER_FLAGS_DEBUG) |
| set(ANDROID_COMPILER_FLAGS_RELEASE) |
| set(ANDROID_LINKER_FLAGS) |
| set(ANDROID_LINKER_FLAGS_EXE) |
| |
| # Generic flags. |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -g |
| -DANDROID |
| -ffunction-sections |
| -funwind-tables |
| -fstack-protector-strong |
| -no-canonical-prefixes) |
| list(APPEND ANDROID_COMPILER_FLAGS_CXX |
| -fno-exceptions |
| -fno-rtti) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,--build-id |
| -Wl,--warn-shared-textrel |
| -Wl,--fatal-warnings) |
| list(APPEND ANDROID_LINKER_FLAGS_EXE |
| -Wl,--gc-sections |
| -Wl,-z,nocopyreloc) |
| |
| # Debug and release flags. |
| list(APPEND ANDROID_COMPILER_FLAGS_DEBUG |
| -O0) |
| if(ANDROID_ABI MATCHES "^armeabi") |
| list(APPEND ANDROID_COMPILER_FLAGS_RELEASE |
| -Os) |
| else() |
| list(APPEND ANDROID_COMPILER_FLAGS_RELEASE |
| -O2) |
| endif() |
| list(APPEND ANDROID_COMPILER_FLAGS_RELEASE |
| -DNDEBUG) |
| if(ANDROID_TOOLCHAIN STREQUAL clang) |
| list(APPEND ANDROID_COMPILER_FLAGS_DEBUG |
| -fno-limit-debug-info) |
| endif() |
| |
| # Toolchain and ABI specific flags. |
| if(ANDROID_ABI STREQUAL armeabi) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -march=armv5te |
| -mtune=xscale |
| -msoft-float) |
| endif() |
| if(ANDROID_ABI STREQUAL armeabi-v7a) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -march=armv7-a |
| -mfloat-abi=softfp |
| -mfpu=vfpv3-d16) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,--fix-cortex-a8) |
| endif() |
| if(ANDROID_ABI MATCHES "^armeabi" AND ANDROID_TOOLCHAIN STREQUAL clang) |
| # Disable integrated-as for better compatibility. |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -fno-integrated-as) |
| endif() |
| if(ANDROID_ABI STREQUAL mips AND ANDROID_TOOLCHAIN STREQUAL clang) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -mips32) |
| endif() |
| |
| # STL specific flags. |
| if(ANDROID_STL STREQUAL system) |
| set(ANDROID_STL_PREFIX gnu-libstdc++/4.9) |
| set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES |
| "${ANDROID_NDK}/sources/cxx-stl/system/include") |
| elseif(ANDROID_STL MATCHES "^stlport_") |
| set(ANDROID_STL_PREFIX stlport) |
| set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/stlport" |
| "${ANDROID_NDK}/sources/cxx-stl/gabi++/include") |
| elseif(ANDROID_STL MATCHES "^gnustl_") |
| set(ANDROID_STL_PREFIX gnu-libstdc++/4.9) |
| set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/include" |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/include" |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/include/backward") |
| elseif(ANDROID_STL MATCHES "^c\\+\\+_") |
| set(ANDROID_STL_PREFIX llvm-libc++) |
| if(ANDROID_ABI MATCHES "^armeabi") |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,--exclude-libs,libunwind.a) |
| else() |
| list(REMOVE_ITEM ANDROID_STL_STATIC_LIBRARIES |
| unwind) |
| endif() |
| list(APPEND ANDROID_COMPILER_FLAGS_CXX |
| -std=c++11) |
| if(ANDROID_TOOLCHAIN STREQUAL gcc) |
| list(APPEND ANDROID_COMPILER_FLAGS_CXX |
| -fno-strict-aliasing) |
| endif() |
| set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libcxx/include" |
| "${ANDROID_NDK}/sources/android/support/include" |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}abi/libcxxabi/include") |
| endif() |
| set(ANDROID_CXX_STANDARD_LIBRARIES) |
| foreach(library ${ANDROID_STL_STATIC_LIBRARIES}) |
| list(APPEND ANDROID_CXX_STANDARD_LIBRARIES |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/lib${library}.a") |
| endforeach() |
| foreach(library ${ANDROID_STL_SHARED_LIBRARIES}) |
| list(APPEND ANDROID_CXX_STANDARD_LIBRARIES |
| "${ANDROID_NDK}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/lib${library}.so") |
| endforeach() |
| if(ANDROID_ABI STREQUAL armeabi AND NOT ANDROID_STL MATCHES "^(none|system)$") |
| list(APPEND ANDROID_CXX_STANDARD_LIBRARIES |
| -latomic) |
| endif() |
| set(CMAKE_C_STANDARD_LIBRARIES_INIT "-lm") |
| set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}") |
| if(ANDROID_CXX_STANDARD_LIBRARIES) |
| string(REPLACE ";" "\" \"" ANDROID_CXX_STANDARD_LIBRARIES "\"${ANDROID_CXX_STANDARD_LIBRARIES}\"") |
| set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_CXX_STANDARD_LIBRARIES_INIT} ${ANDROID_CXX_STANDARD_LIBRARIES}") |
| endif() |
| |
| # Configuration specific flags. |
| if(ANDROID_PIE) |
| set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) |
| list(APPEND ANDROID_LINKER_FLAGS_EXE |
| -pie |
| -fPIE) |
| endif() |
| if(ANDROID_CPP_FEATURES) |
| separate_arguments(ANDROID_CPP_FEATURES) |
| foreach(feature ${ANDROID_CPP_FEATURES}) |
| if(NOT ${feature} MATCHES "^(rtti|exceptions)$") |
| message(FATAL_ERROR "Invalid Android C++ feature: ${feature}.") |
| endif() |
| list(APPEND ANDROID_COMPILER_FLAGS_CXX |
| -f${feature}) |
| endforeach() |
| string(REPLACE ";" " " ANDROID_CPP_FEATURES "${ANDROID_CPP_FEATURES}") |
| endif() |
| if(NOT ANDROID_ALLOW_UNDEFINED_SYMBOLS) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,--no-undefined) |
| endif() |
| if(ANDROID_ABI MATCHES "armeabi") |
| if(ANDROID_ARM_MODE STREQUAL thumb) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -mthumb) |
| elseif(ANDROID_ARM_MODE STREQUAL arm) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -marm) |
| else() |
| message(FATAL_ERROR "Invalid Android ARM mode: ${ANDROID_ARM_MODE}.") |
| endif() |
| if(ANDROID_ABI STREQUAL armeabi-v7a AND ANDROID_ARM_NEON) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -mfpu=neon) |
| endif() |
| endif() |
| if(ANDROID_DISABLE_NO_EXECUTE) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -Wa,--execstack) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,-z,execstack) |
| else() |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -Wa,--noexecstack) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,-z,noexecstack) |
| endif() |
| if(ANDROID_TOOLCHAIN STREQUAL clang) |
| # CMake automatically forwards all compiler flags to the linker, |
| # and clang doesn't like having -Wa flags being used for linking. |
| # To prevent CMake from doing this would require meddling with |
| # the CMAKE_<LANG>_COMPILE_OBJECT rules, which would get quite messy. |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Qunused-arguments) |
| endif() |
| if(ANDROID_DISABLE_RELRO) |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,-z,norelro -Wl,-z,lazy) |
| else() |
| list(APPEND ANDROID_LINKER_FLAGS |
| -Wl,-z,relro -Wl,-z,now) |
| endif() |
| if(ANDROID_DISABLE_FORMAT_STRING_CHECKS) |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -Wno-error=format-security) |
| else() |
| list(APPEND ANDROID_COMPILER_FLAGS |
| -Wformat -Werror=format-security) |
| endif() |
| |
| # Convert these lists into strings. |
| string(REPLACE ";" " " ANDROID_COMPILER_FLAGS "${ANDROID_COMPILER_FLAGS}") |
| string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_CXX "${ANDROID_COMPILER_FLAGS_CXX}") |
| string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG}") |
| string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE}") |
| string(REPLACE ";" " " ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}") |
| string(REPLACE ";" " " ANDROID_LINKER_FLAGS_EXE "${ANDROID_LINKER_FLAGS_EXE}") |
| |
| if(ANDROID_CCACHE) |
| set(CMAKE_C_COMPILER_LAUNCHER "${ANDROID_CCACHE}") |
| set(CMAKE_CXX_COMPILER_LAUNCHER "${ANDROID_CCACHE}") |
| endif() |
| set(CMAKE_C_COMPILER "${ANDROID_C_COMPILER}") |
| set(CMAKE_CXX_COMPILER "${ANDROID_CXX_COMPILER}") |
| set(_CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_PREFIX}") |
| |
| # Set or retrieve the cached flags. |
| # This is necessary in case the user sets/changes flags in subsequent |
| # configures. If we included the Android flags in here, they would get |
| # overwritten. |
| set(CMAKE_C_FLAGS "" |
| CACHE STRING "Flags used by the compiler during all build types.") |
| set(CMAKE_CXX_FLAGS "" |
| CACHE STRING "Flags used by the compiler during all build types.") |
| set(CMAKE_C_FLAGS_DEBUG "" |
| CACHE STRING "Flags used by the compiler during debug builds.") |
| set(CMAKE_CXX_FLAGS_DEBUG "" |
| CACHE STRING "Flags used by the compiler during debug builds.") |
| set(CMAKE_C_FLAGS_RELEASE "" |
| CACHE STRING "Flags used by the compiler during release builds.") |
| set(CMAKE_CXX_FLAGS_RELEASE "" |
| CACHE STRING "Flags used by the compiler during release builds.") |
| set(CMAKE_MODULE_LINKER_FLAGS "" |
| CACHE STRING "Flags used by the linker during the creation of modules.") |
| set(CMAKE_SHARED_LINKER_FLAGS "" |
| CACHE STRING "Flags used by the linker during the creation of dll's.") |
| set(CMAKE_EXE_LINKER_FLAGS "" |
| CACHE STRING "Flags used by the linker.") |
| |
| set(CMAKE_C_FLAGS "${ANDROID_COMPILER_FLAGS} ${CMAKE_C_FLAGS}") |
| set(CMAKE_CXX_FLAGS "${ANDROID_COMPILER_FLAGS} ${ANDROID_COMPILER_FLAGS_CXX} ${CMAKE_CXX_FLAGS}") |
| set(CMAKE_C_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}") |
| set(CMAKE_CXX_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}") |
| set(CMAKE_C_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}") |
| set(CMAKE_CXX_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}") |
| set(CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}") |
| set(CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}") |
| set(CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${ANDROID_LINKER_FLAGS_EXE} ${CMAKE_EXE_LINKER_FLAGS}") |
| |
| # Compatibility for read-only variables. |
| # Read-only variables for compatibility with the other toolchain file. |
| # We'll keep these around for the existing projects that still use them. |
| # TODO: All of the variables here have equivalents in our standard set of |
| # configurable variables, so we can remove these once most of our users migrate |
| # to those variables. |
| set(ANDROID_NATIVE_API_LEVEL ${ANDROID_PLATFORM_LEVEL}) |
| if(ANDROID_ALLOW_UNDEFINED_SYMBOLS) |
| set(ANDROID_SO_UNDEFINED TRUE) |
| else() |
| set(ANDROID_NO_UNDEFINED TRUE) |
| endif() |
| set(ANDROID_FUNCTION_LEVEL_LINKING TRUE) |
| set(ANDROID_GOLD_LINKER TRUE) |
| if(NOT ANDROID_DISABLE_NO_EXECUTE) |
| set(ANDROID_NOEXECSTACK TRUE) |
| endif() |
| if(NOT ANDROID_DISABLE_RELRO) |
| set(ANDROID_RELRO TRUE) |
| endif() |
| if(ANDROID_ARM_MODE STREQUAL arm) |
| set(ANDROID_FORCE_ARM_BUILD TRUE) |
| endif() |
| if(ANDROID_CPP_FEATURES MATCHES "rtti" |
| AND ANDROID_CPP_FEATURES MATCHES "exceptions") |
| set(ANDROID_STL_FORCE_FEATURES TRUE) |
| endif() |
| if(ANDROID_CCACHE) |
| set(NDK_CCACHE "${ANDROID_CCACHE}") |
| endif() |
| if(ANDROID_TOOLCHAIN STREQUAL clang) |
| set(ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}-clang) |
| else() |
| set(ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}-4.9) |
| endif() |
| set(ANDROID_NDK_HOST_X64 TRUE) |
| set(ANDROID_NDK_LAYOUT RELEASE) |
| if(ANDROID_ABI STREQUAL armeabi) |
| set(ARMEABI TRUE) |
| elseif(ANDROID_ABI STREQUAL armeabi-v7a) |
| set(ARMEABI_V7A TRUE) |
| if(ANDROID_ARM_NEON) |
| set(NEON TRUE) |
| endif() |
| elseif(ANDROID_ABI STREQUAL arm64-v8a) |
| set(ARM64_V8A TRUE) |
| elseif(ANDROID_ABI STREQUAL x86) |
| set(X86 TRUE) |
| elseif(ANDROID_ABI STREQUAL x86_64) |
| set(X86_64 TRUE) |
| elseif(ANDROID_ABI STREQUAL mips) |
| set(MIPS TRUE) |
| elseif(ANDROID_ABI STREQUAL MIPS64) |
| set(MIPS64 TRUE) |
| endif() |
| set(ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_HOST_TAG}) |
| set(ANDROID_NDK_ABI_NAME ${ANDROID_ABI}) |
| set(ANDROID_NDK_RELEASE r${ANDROID_NDK_REVISION}) |
| set(ANDROID_ARCH_NAME ${ANDROID_SYSROOT_ABI}) |
| set(ANDROID_SYSROOT "${CMAKE_SYSROOT}") |
| set(TOOL_OS_SUFFIX ${ANDROID_TOOLCHAIN_SUFFIX}) |
| if(ANDROID_TOOLCHAIN STREQUAL clang) |
| set(ANDROID_COMPILER_IS_CLANG TRUE) |
| endif() |