# 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()
