blob: eb19c8a963b0857ec820e033949a8b0dd08bacc4 [file] [log] [blame]
# 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.
# Common android settings
set(ANDROID_COMPILER_VERSION "4.9")
set(ANDROID_NDK_VERSION 21)
# Detect the NDK root directory
if(NOT ANDROID_NDK_ROOT)
if(PREBUILTS)
# Need to pick a compilers from the prebuilt's directory
set(ANDROID_NDK_ROOT "${PREBUILTS}/ndk/current")
else()
# Using the installed NDK for the android compilers
set(ANDROID_NDK_ROOT "$ENV{ANDROID_NDK_ROOT}")
if(NOT ANDROID_NDK_ROOT)
# TODO: search well known locations for an NDK?
message(FATAL_ERROR "You must have ANDROID_NDK_ROOT set")
endif()
string(REPLACE "\\" "/" ANDROID_NDK_ROOT "${ANDROID_NDK_ROOT}")
endif()
endif()
# Define and document the set of variables each android abi must declare
set(ANDROID_ABI_VARS
ANDROID_ABI_NAME # The normal name of the abi
ANDROID_ABI_PATH # The path used in the installed package for this abi
ANDROID_BUILD_PATH # The path used by the build system for this abi
ANDROID_PROCESSOR # The processor name this abi targets
ANDROID_C_FLAGS # The extra c flags to use when compiling for this abi
ANDROID_SYSTEM_ARCH # The ndk system architecture to use to compile for this abi
ANDROID_TOOLCHAIN_PREFIX # The prefix to the specific host to android abi compiler tools
# Constructed variables
ANDROID_GCC_PATH # The path to the gcc tool for this abi
ANDROID_GXX_PATH # The path to the g++ tool for this abi
ANDROID_RANLIB_PATH # The path to the ranlib tool for this abi
ANDROID_AR_PATH # The path to the ar tool for this abi
ANDROID_LD_PATH # The path to the ld tool for this abi
)
set(ANDROID_ABI_NAME_armeabi "armeabi")
set(ANDROID_ABI_PATH_armeabi "armeabi-v7a")
set(ANDROID_BUILD_PATH_armeabi "android-armv7a")
set(ANDROID_PROCESSOR_armeabi "armv5te")
set(ANDROID_C_FLAGS_armeabi "-mthumb -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp")
set(ANDROID_SYSTEM_ARCH_armeabi "arm")
set(ANDROID_ABI_NAME_aarch64 "arm64-v8a")
set(ANDROID_ABI_PATH_aarch64 "arm64-v8a")
set(ANDROID_BUILD_PATH_aarch64 "android-armv8a")
set(ANDROID_PROCESSOR_aarch64 "aarch64")
set(ANDROID_C_FLAGS_aarch64 "")
set(ANDROID_SYSTEM_ARCH_aarch64 "arm64")
set(ANDROID_ABI_NAME_x86 "x86")
set(ANDROID_ABI_PATH_x86 "x86")
set(ANDROID_BUILD_PATH_x86 "android-x86")
set(ANDROID_PROCESSOR_x86 "x86")
set(ANDROID_C_FLAGS_x86 "-m32")
set(ANDROID_SYSTEM_ARCH_x86 "x86")
# Now declare the specific host to abi combinations
if(PREBUILTS AND NOT ANDROID_NDK_ROOT)
# Use host specific gcc from the prebuilts
set(toolchains "${PREBUILTS}/gcc")
if(ToolchainHost STREQUAL "Linux")
set(toolchains "${toolchains}/linux-x86")
endif()
if(ToolchainHost STREQUAL "Darwin")
set(toolchains "${toolchains}/darwin-x86")
endif()
if(ToolchainHost STREQUAL "Windows")
set(toolchains "${toolchains}/windows-x86")
endif()
set(ANDROID_TOOLCHAIN_PREFIX_armeabi "${toolchains}/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-")
set(ANDROID_TOOLCHAIN_PREFIX_aarch64 "${toolchains}/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-")
set(ANDROID_TOOLCHAIN_PREFIX_x86 "${toolchains}/x86/x86_64-linux-android-4.9/bin/x86_64-linux-android-")
else()
# Using the installed NDK for the android compilers
set(toolchains "${ANDROID_NDK_ROOT}/toolchains")
if(ToolchainHost STREQUAL "Linux")
set(compiler_host "linux-x86_64")
endif()
if(ToolchainHost STREQUAL "Darwin")
set(compiler_host "darwin-x86_64")
endif()
if(ToolchainHost STREQUAL "Windows")
set(compiler_host "darwin-x86_64")
endif()
set(ANDROID_TOOLCHAIN_PREFIX_armeabi "${toolchains}/arm-linux-androideabi-4.9/prebuilt/${compiler_host}/bin/arm-linux-androideabi-")
set(ANDROID_TOOLCHAIN_PREFIX_aarch64 "${toolchains}/aarch64-linux-android-4.9/prebuilt/${compiler_host}/bin/aarch64-linux-android-")
set(ANDROID_TOOLCHAIN_PREFIX_x86 "${toolchains}/x86-4.9/prebuilt/${compiler_host}/bin/i686-linux-android-")
endif()
set(host_suffix "")
if(ToolchainHost STREQUAL "Windows")
set(host_suffix ".exe")
endif()
# Look up the set of android ABI's by detecting the ANDROID_ABI_NAME_{$abi} variables
set(ANDROID_ABI_LIST)
get_cmake_property(vars VARIABLES)
foreach (var ${vars})
if(var MATCHES "^ANDROID_ABI_NAME_(.*)")
list(APPEND ANDROID_ABI_LIST ${CMAKE_MATCH_1})
endif()
endforeach()
foreach(abi ${ANDROID_ABI_LIST})
# Build any constructed variables
set(ANDROID_GCC_PATH_${abi} "${ANDROID_TOOLCHAIN_PREFIX_${abi}}gcc${host_suffix}")
set(ANDROID_GXX_PATH_${abi} "${ANDROID_TOOLCHAIN_PREFIX_${abi}}g++${host_suffix}")
set(ANDROID_RANLIB_PATH_${abi} "${ANDROID_TOOLCHAIN_PREFIX_${abi}}ranlib${host_suffix}")
set(ANDROID_AR_PATH_${abi} "${ANDROID_TOOLCHAIN_PREFIX_${abi}}ar${host_suffix}")
set(ANDROID_LD_PATH_${abi} "${ANDROID_TOOLCHAIN_PREFIX_${abi}}ld${host_suffix}")
# Verify that all required variables are set
foreach(var ${ANDROID_ABI_VARS})
if(NOT DEFINED ${var}_${abi})
message(FATAL_ERROR "ABI ${abi} does not define ${var}_${abi}")
endif()
endforeach()
endforeach()
if(NOT ANDROID_VALID_ABI_LIST)
# Build the active abi list by detecting wether the configured compiler path is valid
set(ANDROID_VALID_ABI_LIST)
foreach(abi ${ANDROID_ABI_LIST})
if(EXISTS ${ANDROID_GCC_PATH_${abi}})
message(STATUS "Found ${abi} using ${ANDROID_GCC_PATH_${abi}}")
list(APPEND ANDROID_VALID_ABI_LIST ${abi})
else()
message(STATUS "Disable ${abi}, missing ${ANDROID_GCC_PATH_${abi}}")
endif()
endforeach()
set(ANDROID_VALID_ABI_LIST "${ANDROID_VALID_ABI_LIST}" CACHE STRING "The set of android abi's to compile" FORCE)
endif()
# If we are actually compiling for android
if(ANDROID_ABI)
# Check it's a valid host->abi toolchain
list (FIND ANDROID_VALID_ABI_LIST ${ANDROID_ABI} is_valid)
if (${is_valid} EQUAL -1)
message(FATAL_ERROR "Android abi ${ANDROID_ABI} is not valid on this host")
endif()
# Set the default values of all the variables from the abi ones
foreach(var ${ANDROID_ABI_VARS})
set(${var} ${${var}_${ANDROID_ABI}})
endforeach()
else()
set(ANDROID_ACTIVE_ABI_LIST ${ANDROID_VALID_ABI_LIST})
endif()