Blame cmake/AndroidToolchain.cmake

Packit Service bb5c11
# Copyright (c) 2010-2011, Ethan Rublee
Packit Service bb5c11
# Copyright (c) 2011-2014, Andrey Kamaev
Packit Service bb5c11
# All rights reserved.
Packit Service bb5c11
#
Packit Service bb5c11
# Redistribution and use in source and binary forms, with or without
Packit Service bb5c11
# modification, are permitted provided that the following conditions are met:
Packit Service bb5c11
#
Packit Service bb5c11
# 1.  Redistributions of source code must retain the above copyright notice,
Packit Service bb5c11
#     this list of conditions and the following disclaimer.
Packit Service bb5c11
#
Packit Service bb5c11
# 2.  Redistributions in binary form must reproduce the above copyright notice,
Packit Service bb5c11
#     this list of conditions and the following disclaimer in the documentation
Packit Service bb5c11
#     and/or other materials provided with the distribution.
Packit Service bb5c11
#
Packit Service bb5c11
# 3.  Neither the name of the copyright holder nor the names of its
Packit Service bb5c11
#     contributors may be used to endorse or promote products derived from this
Packit Service bb5c11
#     software without specific prior written permission.
Packit Service bb5c11
#
Packit Service bb5c11
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit Service bb5c11
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service bb5c11
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service bb5c11
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
Packit Service bb5c11
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit Service bb5c11
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit Service bb5c11
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit Service bb5c11
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Packit Service bb5c11
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit Service bb5c11
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit Service bb5c11
# POSSIBILITY OF SUCH DAMAGE.
Packit Service bb5c11
Packit Service bb5c11
# ------------------------------------------------------------------------------
Packit Service bb5c11
#  Android CMake toolchain file, for use with the Android NDK r5-r10d
Packit Service bb5c11
#  Requires cmake 2.6.3 or newer (2.8.9 or newer is recommended).
Packit Service bb5c11
#  See home page: https://github.com/taka-no-me/android-cmake
Packit Service bb5c11
#
Packit Service bb5c11
#  Usage Linux:
Packit Service bb5c11
#   $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
Packit Service bb5c11
#   $ mkdir build && cd build
Packit Service bb5c11
#   $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..
Packit Service bb5c11
#   $ make -j8
Packit Service bb5c11
#
Packit Service bb5c11
#  Usage Windows:
Packit Service bb5c11
#     You need native port of make to build your project.
Packit Service bb5c11
#     Android NDK r7 (and newer) already has make.exe on board.
Packit Service bb5c11
#     For older NDK you have to install it separately.
Packit Service bb5c11
#     For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm
Packit Service bb5c11
#
Packit Service bb5c11
#   $ SET ANDROID_NDK=C:\absolute\path\to\the\android-ndk
Packit Service bb5c11
#   $ mkdir build && cd build
Packit Service bb5c11
#   $ cmake.exe -G"MinGW Makefiles"
Packit Service bb5c11
#       -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake
Packit Service bb5c11
#       -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" ..
Packit Service bb5c11
#   $ cmake.exe --build .
Packit Service bb5c11
#
Packit Service bb5c11
#
Packit Service bb5c11
#  Options (can be set as cmake parameters: -D<option_name>=<value>):
Packit Service bb5c11
#    ANDROID_NDK=/opt/android-ndk - path to the NDK root.
Packit Service bb5c11
#      Can be set as environment variable. Can be set only at first cmake run.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_ABI=armeabi-v7a - specifies the target Application Binary
Packit Service bb5c11
#      Interface (ABI). This option nearly matches to the APP_ABI variable
Packit Service bb5c11
#      used by ndk-build tool from Android NDK.
Packit Service bb5c11
#
Packit Service bb5c11
#      Possible targets are:
Packit Service bb5c11
#        "armeabi" - ARMv5TE based CPU with software floating point operations
Packit Service bb5c11
#        "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions
Packit Service bb5c11
#            this ABI target is used by default
Packit Service bb5c11
#        "armeabi-v7a with NEON" - same as armeabi-v7a, but
Packit Service bb5c11
#            sets NEON as floating-point unit
Packit Service bb5c11
#        "armeabi-v7a with VFPV3" - same as armeabi-v7a, but
Packit Service bb5c11
#            sets VFPV3 as floating-point unit (has 32 registers instead of 16)
Packit Service bb5c11
#        "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP
Packit Service bb5c11
#        "x86" - IA-32 instruction set
Packit Service bb5c11
#        "mips" - MIPS32 instruction set
Packit Service bb5c11
#
Packit Service bb5c11
#      64-bit ABIs for NDK r10 and newer:
Packit Service bb5c11
#        "arm64-v8a" - ARMv8 AArch64 instruction set
Packit Service bb5c11
#        "x86_64" - Intel64 instruction set (r1)
Packit Service bb5c11
#        "mips64" - MIPS64 instruction set (r6)
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
Packit Service bb5c11
#      Option is read-only when standalone toolchain is used.
Packit Service bb5c11
#      Note: building for "android-L" requires explicit configuration.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 - the name of compiler
Packit Service bb5c11
#      toolchain to be used. The list of possible values depends on the NDK
Packit Service bb5c11
#      version. For NDK r10c the possible values are:
Packit Service bb5c11
#
Packit Service bb5c11
#        * aarch64-linux-android-4.9
Packit Service bb5c11
#        * aarch64-linux-android-clang3.4
Packit Service bb5c11
#        * aarch64-linux-android-clang3.5
Packit Service bb5c11
#        * arm-linux-androideabi-4.6
Packit Service bb5c11
#        * arm-linux-androideabi-4.8
Packit Service bb5c11
#        * arm-linux-androideabi-4.9 (default)
Packit Service bb5c11
#        * arm-linux-androideabi-clang3.4
Packit Service bb5c11
#        * arm-linux-androideabi-clang3.5
Packit Service bb5c11
#        * mips64el-linux-android-4.9
Packit Service bb5c11
#        * mips64el-linux-android-clang3.4
Packit Service bb5c11
#        * mips64el-linux-android-clang3.5
Packit Service bb5c11
#        * mipsel-linux-android-4.6
Packit Service bb5c11
#        * mipsel-linux-android-4.8
Packit Service bb5c11
#        * mipsel-linux-android-4.9
Packit Service bb5c11
#        * mipsel-linux-android-clang3.4
Packit Service bb5c11
#        * mipsel-linux-android-clang3.5
Packit Service bb5c11
#        * x86-4.6
Packit Service bb5c11
#        * x86-4.8
Packit Service bb5c11
#        * x86-4.9
Packit Service bb5c11
#        * x86-clang3.4
Packit Service bb5c11
#        * x86-clang3.5
Packit Service bb5c11
#        * x86_64-4.9
Packit Service bb5c11
#        * x86_64-clang3.4
Packit Service bb5c11
#        * x86_64-clang3.5
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions
Packit Service bb5c11
#      instead of Thumb. Is not available for "armeabi-v6 with VFP"
Packit Service bb5c11
#      (is forced to be ON) ABI.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker
Packit Service bb5c11
#      errors even if they are not used.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared
Packit Service bb5c11
#      libraries. Automatically turned for NDK r5x and r6x due to GLESv2
Packit Service bb5c11
#      problems.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_STL=gnustl_static - specify the runtime to use.
Packit Service bb5c11
#
Packit Service bb5c11
#      Possible values are:
Packit Service bb5c11
#        none           -> Do not configure the runtime.
Packit Service bb5c11
#        system         -> Use the default minimal system C++ runtime library.
Packit Service bb5c11
#                          Implies -fno-rtti -fno-exceptions.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        system_re      -> Use the default minimal system C++ runtime library.
Packit Service bb5c11
#                          Implies -frtti -fexceptions.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        gabi++_static  -> Use the GAbi++ runtime as a static library.
Packit Service bb5c11
#                          Implies -frtti -fno-exceptions.
Packit Service bb5c11
#                          Available for NDK r7 and newer.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        gabi++_shared  -> Use the GAbi++ runtime as a shared library.
Packit Service bb5c11
#                          Implies -frtti -fno-exceptions.
Packit Service bb5c11
#                          Available for NDK r7 and newer.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        stlport_static -> Use the STLport runtime as a static library.
Packit Service bb5c11
#                          Implies -fno-rtti -fno-exceptions for NDK before r7.
Packit Service bb5c11
#                          Implies -frtti -fno-exceptions for NDK r7 and newer.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        stlport_shared -> Use the STLport runtime as a shared library.
Packit Service bb5c11
#                          Implies -fno-rtti -fno-exceptions for NDK before r7.
Packit Service bb5c11
#                          Implies -frtti -fno-exceptions for NDK r7 and newer.
Packit Service bb5c11
#                          Is not available for standalone toolchain.
Packit Service bb5c11
#        gnustl_static  -> Use the GNU STL as a static library.
Packit Service bb5c11
#                          Implies -frtti -fexceptions.
Packit Service bb5c11
#        gnustl_shared  -> Use the GNU STL as a shared library.
Packit Service bb5c11
#                          Implies -frtti -fno-exceptions.
Packit Service bb5c11
#                          Available for NDK r7b and newer.
Packit Service bb5c11
#                          Silently degrades to gnustl_static if not available.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on
Packit Service bb5c11
#      chosen runtime. If disabled, then the user is responsible for settings
Packit Service bb5c11
#      these options.
Packit Service bb5c11
#
Packit Service bb5c11
#  What?:
Packit Service bb5c11
#    android-cmake toolchain searches for NDK/toolchain in the following order:
Packit Service bb5c11
#      ANDROID_NDK - cmake parameter
Packit Service bb5c11
#      ANDROID_NDK - environment variable
Packit Service bb5c11
#      ANDROID_STANDALONE_TOOLCHAIN - cmake parameter
Packit Service bb5c11
#      ANDROID_STANDALONE_TOOLCHAIN - environment variable
Packit Service bb5c11
#      ANDROID_NDK - default locations
Packit Service bb5c11
#      ANDROID_STANDALONE_TOOLCHAIN - default locations
Packit Service bb5c11
#
Packit Service bb5c11
#    Make sure to do the following in your scripts:
Packit Service bb5c11
#      SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" )
Packit Service bb5c11
#      SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" )
Packit Service bb5c11
#    The flags will be prepopulated with critical flags, so don't loose them.
Packit Service bb5c11
#    Also be aware that toolchain also sets configuration-specific compiler
Packit Service bb5c11
#    flags and linker flags.
Packit Service bb5c11
#
Packit Service bb5c11
#    ANDROID and BUILD_ANDROID will be set to true, you may test any of these
Packit Service bb5c11
#    variables to make necessary Android-specific configuration changes.
Packit Service bb5c11
#
Packit Service bb5c11
#    Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
Packit Service bb5c11
#    will be set true, mutually exclusive. NEON option will be set true
Packit Service bb5c11
#    if VFP is set to NEON.
Packit Service bb5c11
#
Packit Service bb5c11
# ------------------------------------------------------------------------------
Packit Service bb5c11
Packit Service bb5c11
cmake_minimum_required( VERSION 2.6.3 )
Packit Service bb5c11
Packit Service bb5c11
if( DEFINED CMAKE_CROSSCOMPILING )
Packit Service bb5c11
 # subsequent toolchain loading is not really needed
Packit Service bb5c11
 return()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( CMAKE_TOOLCHAIN_FILE )
Packit Service bb5c11
 # touch toolchain variable to suppress "unused variable" warning
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# inherit settings in recursive loads
Packit Service bb5c11
get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
Packit Service bb5c11
if( _CMAKE_IN_TRY_COMPILE )
Packit Service bb5c11
 include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# this one is important
Packit Service bb5c11
if( CMAKE_VERSION VERSION_GREATER "3.0.99" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_NAME Android )
Packit Service bb5c11
else()
Packit Service bb5c11
 set( CMAKE_SYSTEM_NAME Linux )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# this one not so much
Packit Service bb5c11
set( CMAKE_SYSTEM_VERSION 1 )
Packit Service bb5c11
Packit Service bb5c11
# rpath makes low sense for Android
Packit Service bb5c11
set( CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "" )
Packit Service bb5c11
set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
Packit Service bb5c11
Packit Service bb5c11
# NDK search paths
Packit Service bb5c11
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
Packit Service bb5c11
if( NOT DEFINED ANDROID_NDK_SEARCH_PATHS )
Packit Service bb5c11
 if( CMAKE_HOST_WIN32 )
Packit Service bb5c11
  file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
Packit Service bb5c11
  set( ANDROID_NDK_SEARCH_PATHS "${ANDROID_NDK_SEARCH_PATHS}" "$ENV{SystemDrive}/NVPACK" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  file( TO_CMAKE_PATH "$ENV{HOME}" ANDROID_NDK_SEARCH_PATHS )
Packit Service bb5c11
  set( ANDROID_NDK_SEARCH_PATHS /opt "${ANDROID_NDK_SEARCH_PATHS}/NVPACK" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
Packit Service bb5c11
 set( ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH /opt/android-toolchain )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# known ABIs
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" )
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" )
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_mips "mips" )
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS_mips64 "mips64" )
Packit Service bb5c11
Packit Service bb5c11
# API level defaults
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL 8 )
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 21 )
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 )
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 21 )
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 )
Packit Service bb5c11
set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 21 )
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
macro( __LIST_FILTER listvar regex )
Packit Service bb5c11
  if( ${listvar} )
Packit Service bb5c11
    foreach( __val ${${listvar}} )
Packit Service bb5c11
      if( __val MATCHES "${regex}" )
Packit Service bb5c11
        list( REMOVE_ITEM ${listvar} "${__val}" )
Packit Service bb5c11
      endif()
Packit Service bb5c11
    endforeach()
Packit Service bb5c11
  endif()
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
macro( __INIT_VARIABLE var_name )
Packit Service bb5c11
  set( __test_path 0 )
Packit Service bb5c11
  foreach( __var ${ARGN} )
Packit Service bb5c11
    if( __var STREQUAL "PATH" )
Packit Service bb5c11
      set( __test_path 1 )
Packit Service bb5c11
      break()
Packit Service bb5c11
    endif()
Packit Service bb5c11
  endforeach()
Packit Service bb5c11
Packit Service bb5c11
  if( __test_path AND NOT EXISTS "${${var_name}}" )
Packit Service bb5c11
    unset( ${var_name} CACHE )
Packit Service bb5c11
  endif()
Packit Service bb5c11
Packit Service bb5c11
  if( " ${${var_name}}" STREQUAL " " )
Packit Service bb5c11
    set( __values 0 )
Packit Service bb5c11
    foreach( __var ${ARGN} )
Packit Service bb5c11
      if( __var STREQUAL "VALUES" )
Packit Service bb5c11
        set( __values 1 )
Packit Service bb5c11
      elseif( NOT __var STREQUAL "PATH" )
Packit Service bb5c11
        if( __var MATCHES "^ENV_.*$" )
Packit Service bb5c11
          string( REPLACE "ENV_" "" __var "${__var}" )
Packit Service bb5c11
          set( __value "$ENV{${__var}}" )
Packit Service bb5c11
        elseif( DEFINED ${__var} )
Packit Service bb5c11
          set( __value "${${__var}}" )
Packit Service bb5c11
        elseif( __values )
Packit Service bb5c11
          set( __value "${__var}" )
Packit Service bb5c11
        else()
Packit Service bb5c11
          set( __value "" )
Packit Service bb5c11
        endif()
Packit Service bb5c11
Packit Service bb5c11
        if( NOT " ${__value}" STREQUAL " " AND (NOT __test_path OR EXISTS "${__value}") )
Packit Service bb5c11
          set( ${var_name} "${__value}" )
Packit Service bb5c11
          break()
Packit Service bb5c11
        endif()
Packit Service bb5c11
      endif()
Packit Service bb5c11
    endforeach()
Packit Service bb5c11
    unset( __value )
Packit Service bb5c11
    unset( __values )
Packit Service bb5c11
  endif()
Packit Service bb5c11
Packit Service bb5c11
  if( __test_path )
Packit Service bb5c11
    file( TO_CMAKE_PATH "${${var_name}}" ${var_name} )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __test_path )
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
macro( __DETECT_NATIVE_API_LEVEL _var _path )
Packit Service bb5c11
  set( __ndkApiLevelRegex "^[\t ]*#define[\t ]+__ANDROID_API__[\t ]+([0-9]+)[\t ]*.*$" )
Packit Service bb5c11
  file( STRINGS ${_path} __apiFileContent REGEX "${__ndkApiLevelRegex}" )
Packit Service bb5c11
  if( NOT __apiFileContent )
Packit Service bb5c11
    message( SEND_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken." )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  string( REGEX REPLACE "${__ndkApiLevelRegex}" "\\1" ${_var} "${__apiFileContent}" )
Packit Service bb5c11
  unset( __apiFileContent )
Packit Service bb5c11
  unset( __ndkApiLevelRegex )
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root )
Packit Service bb5c11
 if( EXISTS "${_root}" )
Packit Service bb5c11
    file( GLOB __gccExePath RELATIVE "${_root}/bin/" "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" )
Packit Service bb5c11
    __LIST_FILTER( __gccExePath "^[.].*" )
Packit Service bb5c11
    list( LENGTH __gccExePath __gccExePathsCount )
Packit Service bb5c11
    if( NOT __gccExePathsCount EQUAL 1  AND NOT _CMAKE_IN_TRY_COMPILE )
Packit Service bb5c11
      message( WARNING "Could not determine machine name for compiler from ${_root}" )
Packit Service bb5c11
      set( ${_var} "" )
Packit Service bb5c11
    else()
Packit Service bb5c11
      get_filename_component( __gccExeName "${__gccExePath}" NAME_WE )
Packit Service bb5c11
      string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" )
Packit Service bb5c11
    endif()
Packit Service bb5c11
    unset( __gccExePath )
Packit Service bb5c11
    unset( __gccExePathsCount )
Packit Service bb5c11
    unset( __gccExeName )
Packit Service bb5c11
  else()
Packit Service bb5c11
    set( ${_var} "" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# fight against cygwin
Packit Service bb5c11
set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools")
Packit Service bb5c11
mark_as_advanced( ANDROID_FORBID_SYGWIN )
Packit Service bb5c11
if( ANDROID_FORBID_SYGWIN )
Packit Service bb5c11
 if( CYGWIN )
Packit Service bb5c11
  message( FATAL_ERROR "Android NDK and android-cmake toolchain are not welcome Cygwin. It is unlikely that this cmake toolchain will work under cygwin. But if you want to try then you can set cmake variable ANDROID_FORBID_SYGWIN to FALSE and rerun cmake." )
Packit Service bb5c11
 endif()
Packit Service bb5c11
Packit Service bb5c11
 if( CMAKE_HOST_WIN32 )
Packit Service bb5c11
  # remove cygwin from PATH
Packit Service bb5c11
  set( __new_path "$ENV{PATH}")
Packit Service bb5c11
  __LIST_FILTER( __new_path "cygwin" )
Packit Service bb5c11
  set(ENV{PATH} "${__new_path}")
Packit Service bb5c11
  unset(__new_path)
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# detect current host platform
Packit Service bb5c11
if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" )
Packit Service bb5c11
 mark_as_advanced( ANDROID_NDK_HOST_X64 )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
set( TOOL_OS_SUFFIX "" )
Packit Service bb5c11
if( CMAKE_HOST_APPLE )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" )
Packit Service bb5c11
elseif( CMAKE_HOST_WIN32 )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" )
Packit Service bb5c11
 set( TOOL_OS_SUFFIX ".exe" )
Packit Service bb5c11
elseif( CMAKE_HOST_UNIX )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" )
Packit Service bb5c11
else()
Packit Service bb5c11
 message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( NOT ANDROID_NDK_HOST_X64 )
Packit Service bb5c11
 set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# see if we have path to Android NDK
Packit Service bb5c11
if( NOT ANDROID_NDK AND NOT ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
  __INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
Packit Service bb5c11
endif()
Packit Service bb5c11
if( NOT ANDROID_NDK )
Packit Service bb5c11
 # see if we have path to Android standalone toolchain
Packit Service bb5c11
 __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
Packit Service bb5c11
 if( NOT ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
  #try to find Android NDK in one of the the default locations
Packit Service bb5c11
  set( __ndkSearchPaths )
Packit Service bb5c11
  foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} )
Packit Service bb5c11
   foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} )
Packit Service bb5c11
    list( APPEND __ndkSearchPaths "${__ndkSearchPath}/android-ndk${suffix}" )
Packit Service bb5c11
   endforeach()
Packit Service bb5c11
  endforeach()
Packit Service bb5c11
  __INIT_VARIABLE( ANDROID_NDK PATH VALUES ${__ndkSearchPaths} )
Packit Service bb5c11
  unset( __ndkSearchPaths )
Packit Service bb5c11
Packit Service bb5c11
  if( ANDROID_NDK )
Packit Service bb5c11
   message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" )
Packit Service bb5c11
   message( STATUS "  If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" )
Packit Service bb5c11
  else()
Packit Service bb5c11
   #try to find Android standalone toolchain in one of the the default locations
Packit Service bb5c11
   __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
Packit Service bb5c11
Packit Service bb5c11
   if( ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
    message( STATUS "Using default path for standalone toolchain ${ANDROID_STANDALONE_TOOLCHAIN}" )
Packit Service bb5c11
    message( STATUS "  If you prefer to use a different location, please define the variable: ANDROID_STANDALONE_TOOLCHAIN" )
Packit Service bb5c11
   endif( ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
  endif( ANDROID_NDK )
Packit Service bb5c11
 endif( NOT ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
endif( NOT ANDROID_NDK )
Packit Service bb5c11
Packit Service bb5c11
# remember found paths
Packit Service bb5c11
if( ANDROID_NDK )
Packit Service bb5c11
 get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE )
Packit Service bb5c11
 set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
Packit Service bb5c11
 set( BUILD_WITH_ANDROID_NDK True )
Packit Service bb5c11
 if( EXISTS "${ANDROID_NDK}/RELEASE.TXT" )
Packit Service bb5c11
  file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX "r[0-9]+[a-z]?" )
Packit Service bb5c11
  string( REGEX MATCH "r([0-9]+)([a-z]?)" ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( ANDROID_NDK_RELEASE "r1x" )
Packit Service bb5c11
  set( ANDROID_NDK_RELEASE_FULL "unreleased" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 string( REGEX REPLACE "r([0-9]+)([a-z]?)" "\\1*1000" ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE}" )
Packit Service bb5c11
 string( FIND " abcdefghijklmnopqastuvwxyz" "${CMAKE_MATCH_2}" __ndkReleaseLetterNum )
Packit Service bb5c11
 math( EXPR ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE_NUM}+${__ndkReleaseLetterNum}" )
Packit Service bb5c11
elseif( ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
 get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
Packit Service bb5c11
 # try to detect change
Packit Service bb5c11
 if( CMAKE_AR )
Packit Service bb5c11
  string( LENGTH "${ANDROID_STANDALONE_TOOLCHAIN}" __length )
Packit Service bb5c11
  string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidStandaloneToolchainPreviousPath )
Packit Service bb5c11
  if( NOT __androidStandaloneToolchainPreviousPath STREQUAL ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
   message( FATAL_ERROR "It is not possible to change path to the Android standalone toolchain on subsequent run." )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __androidStandaloneToolchainPreviousPath )
Packit Service bb5c11
  unset( __length )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE )
Packit Service bb5c11
 set( BUILD_WITH_STANDALONE_TOOLCHAIN True )
Packit Service bb5c11
else()
Packit Service bb5c11
 list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH)
Packit Service bb5c11
 message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain.
Packit Service bb5c11
    You should either set an environment variable:
Packit Service bb5c11
      export ANDROID_NDK=~/my-android-ndk
Packit Service bb5c11
    or
Packit Service bb5c11
      export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain
Packit Service bb5c11
    or put the toolchain or NDK in the default path:
Packit Service bb5c11
      sudo ln -s ~/my-android-ndk ${ANDROID_NDK_SEARCH_PATH}/android-ndk
Packit Service bb5c11
      sudo ln -s ~/my-android-toolchain ${ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH}" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# android NDK layout
Packit Service bb5c11
if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
 if( NOT DEFINED ANDROID_NDK_LAYOUT )
Packit Service bb5c11
  # try to automatically detect the layout
Packit Service bb5c11
  if( EXISTS "${ANDROID_NDK}/RELEASE.TXT")
Packit Service bb5c11
   set( ANDROID_NDK_LAYOUT "RELEASE" )
Packit Service bb5c11
  elseif( EXISTS "${ANDROID_NDK}/../../linux-x86/toolchain/" )
Packit Service bb5c11
   set( ANDROID_NDK_LAYOUT "LINARO" )
Packit Service bb5c11
  elseif( EXISTS "${ANDROID_NDK}/../../gcc/" )
Packit Service bb5c11
   set( ANDROID_NDK_LAYOUT "ANDROID" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_NDK_LAYOUT "${ANDROID_NDK_LAYOUT}" CACHE STRING "The inner layout of NDK" )
Packit Service bb5c11
 mark_as_advanced( ANDROID_NDK_LAYOUT )
Packit Service bb5c11
 if( ANDROID_NDK_LAYOUT STREQUAL "LINARO" )
Packit Service bb5c11
  set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../${ANDROID_NDK_HOST_SYSTEM_NAME}/toolchain" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH  "" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
Packit Service bb5c11
 elseif( ANDROID_NDK_LAYOUT STREQUAL "ANDROID" )
Packit Service bb5c11
  set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../gcc/${ANDROID_NDK_HOST_SYSTEM_NAME}/arm" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH  "" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
Packit Service bb5c11
 else() # ANDROID_NDK_LAYOUT STREQUAL "RELEASE"
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/toolchains" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH  "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
Packit Service bb5c11
  set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME2}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 get_filename_component( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK_TOOLCHAINS_PATH}" ABSOLUTE )
Packit Service bb5c11
Packit Service bb5c11
 # try to detect change of NDK
Packit Service bb5c11
 if( CMAKE_AR )
Packit Service bb5c11
  string( LENGTH "${ANDROID_NDK_TOOLCHAINS_PATH}" __length )
Packit Service bb5c11
  string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath )
Packit Service bb5c11
  if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK_TOOLCHAINS_PATH )
Packit Service bb5c11
   message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first.
Packit Service bb5c11
   " )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __androidNdkPreviousPath )
Packit Service bb5c11
  unset( __length )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# get all the details about standalone toolchain
Packit Service bb5c11
if( BUILD_WITH_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
 __DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" )
Packit Service bb5c11
 set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
Packit Service bb5c11
 set( __availableToolchains "standalone" )
Packit Service bb5c11
 __DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" )
Packit Service bb5c11
 if( NOT __availableToolchainMachines )
Packit Service bb5c11
  message( FATAL_ERROR "Could not determine machine name of your toolchain. Probably your Android standalone toolchain is broken." )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 if( __availableToolchainMachines MATCHES x86_64 )
Packit Service bb5c11
  set( __availableToolchainArchs "x86_64" )
Packit Service bb5c11
 elseif( __availableToolchainMachines MATCHES i686 )
Packit Service bb5c11
  set( __availableToolchainArchs "x86" )
Packit Service bb5c11
 elseif( __availableToolchainMachines MATCHES aarch64 )
Packit Service bb5c11
  set( __availableToolchainArchs "arm64" )
Packit Service bb5c11
 elseif( __availableToolchainMachines MATCHES arm )
Packit Service bb5c11
  set( __availableToolchainArchs "arm" )
Packit Service bb5c11
 elseif( __availableToolchainMachines MATCHES mips64el )
Packit Service bb5c11
  set( __availableToolchainArchs "mips64" )
Packit Service bb5c11
 elseif( __availableToolchainMachines MATCHES mipsel )
Packit Service bb5c11
  set( __availableToolchainArchs "mips" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" -dumpversion
Packit Service bb5c11
                  OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE )
Packit Service bb5c11
 string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" )
Packit Service bb5c11
 if( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/bin/clang${TOOL_OS_SUFFIX}" )
Packit Service bb5c11
  list( APPEND __availableToolchains "standalone-clang" )
Packit Service bb5c11
  list( APPEND __availableToolchainMachines ${__availableToolchainMachines} )
Packit Service bb5c11
  list( APPEND __availableToolchainArchs ${__availableToolchainArchs} )
Packit Service bb5c11
  list( APPEND __availableToolchainCompilerVersions ${__availableToolchainCompilerVersions} )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath )
Packit Service bb5c11
 foreach( __toolchain ${${__availableToolchainsLst}} )
Packit Service bb5c11
  if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}${__toolchain_subpath}" )
Packit Service bb5c11
   SET( __toolchainVersionRegex "^TOOLCHAIN_VERSION[\t ]+:=[\t ]+(.*)$" )
Packit Service bb5c11
   FILE( STRINGS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}/setup.mk" __toolchainVersionStr REGEX "${__toolchainVersionRegex}" )
Packit Service bb5c11
   if( __toolchainVersionStr )
Packit Service bb5c11
    string( REGEX REPLACE "${__toolchainVersionRegex}" "\\1" __toolchainVersionStr "${__toolchainVersionStr}" )
Packit Service bb5c11
    string( REGEX REPLACE "-clang3[.][0-9]$" "-${__toolchainVersionStr}" __gcc_toolchain "${__toolchain}" )
Packit Service bb5c11
   else()
Packit Service bb5c11
    string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
   unset( __toolchainVersionStr )
Packit Service bb5c11
   unset( __toolchainVersionRegex )
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( __gcc_toolchain "${__toolchain}" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK_TOOLCHAINS_PATH}/${__gcc_toolchain}${__toolchain_subpath}" )
Packit Service bb5c11
  if( __machine )
Packit Service bb5c11
   string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9x]+)?$" __version "${__gcc_toolchain}" )
Packit Service bb5c11
   if( __machine MATCHES x86_64 )
Packit Service bb5c11
    set( __arch "x86_64" )
Packit Service bb5c11
   elseif( __machine MATCHES i686 )
Packit Service bb5c11
    set( __arch "x86" )
Packit Service bb5c11
   elseif( __machine MATCHES aarch64 )
Packit Service bb5c11
    set( __arch "arm64" )
Packit Service bb5c11
   elseif( __machine MATCHES arm )
Packit Service bb5c11
    set( __arch "arm" )
Packit Service bb5c11
   elseif( __machine MATCHES mips64el )
Packit Service bb5c11
    set( __arch "mips64" )
Packit Service bb5c11
   elseif( __machine MATCHES mipsel )
Packit Service bb5c11
    set( __arch "mips" )
Packit Service bb5c11
   else()
Packit Service bb5c11
    set( __arch "" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
   #message("machine: !${__machine}!\narch: !${__arch}!\nversion: !${__version}!\ntoolchain: !${__toolchain}!\n")
Packit Service bb5c11
   if (__arch)
Packit Service bb5c11
    list( APPEND __availableToolchainMachines "${__machine}" )
Packit Service bb5c11
    list( APPEND __availableToolchainArchs "${__arch}" )
Packit Service bb5c11
    list( APPEND __availableToolchainCompilerVersions "${__version}" )
Packit Service bb5c11
    list( APPEND ${__availableToolchainsVar} "${__toolchain}" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __gcc_toolchain )
Packit Service bb5c11
 endforeach()
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
# get all the details about NDK
Packit Service bb5c11
if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
 file( GLOB ANDROID_SUPPORTED_NATIVE_API_LEVELS RELATIVE "${ANDROID_NDK}/platforms" "${ANDROID_NDK}/platforms/android-*" )
Packit Service bb5c11
 string( REPLACE "android-" "" ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_SUPPORTED_NATIVE_API_LEVELS}" )
Packit Service bb5c11
 set( __availableToolchains "" )
Packit Service bb5c11
 set( __availableToolchainMachines "" )
Packit Service bb5c11
 set( __availableToolchainArchs "" )
Packit Service bb5c11
 set( __availableToolchainCompilerVersions "" )
Packit Service bb5c11
 if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_TOOLCHAIN_NAME}/" )
Packit Service bb5c11
  # do not go through all toolchains if we know the name
Packit Service bb5c11
  set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" )
Packit Service bb5c11
  __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
Packit Service bb5c11
  if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
Packit Service bb5c11
   __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
Packit Service bb5c11
   if( __availableToolchains )
Packit Service bb5c11
    set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
 if( NOT __availableToolchains )
Packit Service bb5c11
  file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK_TOOLCHAINS_PATH}" "${ANDROID_NDK_TOOLCHAINS_PATH}/*" )
Packit Service bb5c11
  if( __availableToolchainsLst )
Packit Service bb5c11
   list(SORT __availableToolchainsLst) # we need clang to go after gcc
Packit Service bb5c11
  endif()
Packit Service bb5c11
  __LIST_FILTER( __availableToolchainsLst "^[.]" )
Packit Service bb5c11
  __LIST_FILTER( __availableToolchainsLst "llvm" )
Packit Service bb5c11
  __LIST_FILTER( __availableToolchainsLst "renderscript" )
Packit Service bb5c11
  __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
Packit Service bb5c11
  if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
Packit Service bb5c11
   __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
Packit Service bb5c11
   if( __availableToolchains )
Packit Service bb5c11
    set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
 if( NOT __availableToolchains )
Packit Service bb5c11
  message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# build list of available ABIs
Packit Service bb5c11
set( ANDROID_SUPPORTED_ABIS "" )
Packit Service bb5c11
set( __uniqToolchainArchNames ${__availableToolchainArchs} )
Packit Service bb5c11
list( REMOVE_DUPLICATES __uniqToolchainArchNames )
Packit Service bb5c11
list( SORT __uniqToolchainArchNames )
Packit Service bb5c11
foreach( __arch ${__uniqToolchainArchNames} )
Packit Service bb5c11
 list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
Packit Service bb5c11
endforeach()
Packit Service bb5c11
unset( __uniqToolchainArchNames )
Packit Service bb5c11
if( NOT ANDROID_SUPPORTED_ABIS )
Packit Service bb5c11
 message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# choose target ABI
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} )
Packit Service bb5c11
# verify that target ABI is supported
Packit Service bb5c11
list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
Packit Service bb5c11
if( __androidAbiIdx EQUAL -1 )
Packit Service bb5c11
 string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS  "${ANDROID_SUPPORTED_ABIS}" )
Packit Service bb5c11
 message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
Packit Service bb5c11
   Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
Packit Service bb5c11
   " )
Packit Service bb5c11
endif()
Packit Service bb5c11
unset( __androidAbiIdx )
Packit Service bb5c11
Packit Service bb5c11
# set target ABI options
Packit Service bb5c11
if( ANDROID_ABI STREQUAL "x86" )
Packit Service bb5c11
 set( X86 true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "x86" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "x86" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "i686-none-linux-android" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "i686" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "x86_64" )
Packit Service bb5c11
 set( X86 true )
Packit Service bb5c11
 set( X86_64 true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "x86_64" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "x86_64" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "x86_64" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "x86_64-none-linux-android" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS true )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "mips64" )
Packit Service bb5c11
 set( MIPS64 true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "mips64" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "mips64" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "mips64el-none-linux-android" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "mips64" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS true )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "mips" )
Packit Service bb5c11
 set( MIPS true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "mips" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "mips" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "mipsel-none-linux-android" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "mips" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "arm64-v8a" )
Packit Service bb5c11
 set( ARM64_V8A true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "arm64-v8a" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm64" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "aarch64-none-linux-android" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "aarch64" )
Packit Service bb5c11
 set( VFPV3 true )
Packit Service bb5c11
 set( NEON true )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "armeabi" )
Packit Service bb5c11
 set( ARMEABI true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "armeabi" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "armv5te" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" )
Packit Service bb5c11
 set( ARMEABI_V6 true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "armeabi" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "armv6" )
Packit Service bb5c11
 # need always fallback to older platform
Packit Service bb5c11
 set( ARMEABI true )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
Packit Service bb5c11
 set( ARMEABI_V7A true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" )
Packit Service bb5c11
 set( ARMEABI_V7A true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
Packit Service bb5c11
 set( VFPV3 true )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
Packit Service bb5c11
 set( ARMEABI_V7A true )
Packit Service bb5c11
 set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
Packit Service bb5c11
 set( ANDROID_ARCH_NAME "arm" )
Packit Service bb5c11
 set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
Packit Service bb5c11
 set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
Packit Service bb5c11
 set( VFPV3 true )
Packit Service bb5c11
 set( NEON true )
Packit Service bb5c11
 set( ANDROID_LIBRARY_USE_LIB64_PATHS false )
Packit Service bb5c11
else()
Packit Service bb5c11
 message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" )
Packit Service bb5c11
 # really dirty hack
Packit Service bb5c11
 # it is not possible to change CMAKE_SYSTEM_PROCESSOR after the first run...
Packit Service bb5c11
 file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 )
Packit Service bb5c11
 __INIT_VARIABLE( ANDROID_FORCE_ARM_BUILD VALUES OFF )
Packit Service bb5c11
 set( ANDROID_FORCE_ARM_BUILD ${ANDROID_FORCE_ARM_BUILD} CACHE BOOL "Use 32-bit ARM instructions instead of Thumb-1" FORCE )
Packit Service bb5c11
 mark_as_advanced( ANDROID_FORCE_ARM_BUILD )
Packit Service bb5c11
else()
Packit Service bb5c11
 unset( ANDROID_FORCE_ARM_BUILD CACHE )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# choose toolchain
Packit Service bb5c11
if( ANDROID_TOOLCHAIN_NAME )
Packit Service bb5c11
 list( FIND __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" __toolchainIdx )
Packit Service bb5c11
 if( __toolchainIdx EQUAL -1 )
Packit Service bb5c11
  list( SORT __availableToolchains )
Packit Service bb5c11
  string( REPLACE ";" "\n  * " toolchains_list "${__availableToolchains}" )
Packit Service bb5c11
  set( toolchains_list "  * ${toolchains_list}")
Packit Service bb5c11
  message( FATAL_ERROR "Specified toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing in your NDK or broken. Please verify that your NDK is working or select another compiler toolchain.
Packit Service bb5c11
To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values:\n${toolchains_list}\n" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
Packit Service bb5c11
 if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
Packit Service bb5c11
  message( SEND_ERROR "Selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." )
Packit Service bb5c11
 endif()
Packit Service bb5c11
else()
Packit Service bb5c11
 set( __toolchainIdx -1 )
Packit Service bb5c11
 set( __applicableToolchains "" )
Packit Service bb5c11
 set( __toolchainMaxVersion "0.0.0" )
Packit Service bb5c11
 list( LENGTH __availableToolchains __availableToolchainsCount )
Packit Service bb5c11
 math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" )
Packit Service bb5c11
 foreach( __idx RANGE ${__availableToolchainsCount} )
Packit Service bb5c11
  list( GET __availableToolchainArchs ${__idx} __toolchainArch )
Packit Service bb5c11
  if( __toolchainArch STREQUAL ANDROID_ARCH_NAME )
Packit Service bb5c11
   list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion )
Packit Service bb5c11
   string( REPLACE "x" "99" __toolchainVersion "${__toolchainVersion}")
Packit Service bb5c11
   if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion )
Packit Service bb5c11
    set( __toolchainMaxVersion "${__toolchainVersion}" )
Packit Service bb5c11
    set( __toolchainIdx ${__idx} )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endforeach()
Packit Service bb5c11
 unset( __availableToolchainsCount )
Packit Service bb5c11
 unset( __toolchainMaxVersion )
Packit Service bb5c11
 unset( __toolchainVersion )
Packit Service bb5c11
endif()
Packit Service bb5c11
unset( __toolchainArch )
Packit Service bb5c11
if( __toolchainIdx EQUAL -1 )
Packit Service bb5c11
 message( FATAL_ERROR "No one of available compiler toolchains is able to compile for ${ANDROID_ARCH_NAME} platform." )
Packit Service bb5c11
endif()
Packit Service bb5c11
list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME )
Packit Service bb5c11
list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME )
Packit Service bb5c11
list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION )
Packit Service bb5c11
Packit Service bb5c11
unset( __toolchainIdx )
Packit Service bb5c11
unset( __availableToolchains )
Packit Service bb5c11
unset( __availableToolchainMachines )
Packit Service bb5c11
unset( __availableToolchainArchs )
Packit Service bb5c11
unset( __availableToolchainCompilerVersions )
Packit Service bb5c11
Packit Service bb5c11
# choose native API level
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
Packit Service bb5c11
string( REPLACE "android-" "" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
Packit Service bb5c11
string( STRIP "${ANDROID_NATIVE_API_LEVEL}" ANDROID_NATIVE_API_LEVEL )
Packit Service bb5c11
# adjust API level
Packit Service bb5c11
set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} )
Packit Service bb5c11
foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
Packit Service bb5c11
 if( (__level LESS ANDROID_NATIVE_API_LEVEL OR __level STREQUAL ANDROID_NATIVE_API_LEVEL) AND NOT __level LESS __real_api_level )
Packit Service bb5c11
  set( __real_api_level ${__level} )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endforeach()
Packit Service bb5c11
if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL STREQUAL __real_api_level )
Packit Service bb5c11
 message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'")
Packit Service bb5c11
 set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} )
Packit Service bb5c11
endif()
Packit Service bb5c11
unset(__real_api_level)
Packit Service bb5c11
# validate
Packit Service bb5c11
list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
Packit Service bb5c11
if( __levelIdx EQUAL -1 )
Packit Service bb5c11
 message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." )
Packit Service bb5c11
else()
Packit Service bb5c11
 if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
  __DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
Packit Service bb5c11
  if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL AND NOT __realApiLevel GREATER 9000 )
Packit Service bb5c11
   message( SEND_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken." )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __realApiLevel )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE )
Packit Service bb5c11
 set( CMAKE_ANDROID_API ${ANDROID_NATIVE_API_LEVEL} )
Packit Service bb5c11
 if( CMAKE_VERSION VERSION_GREATER "2.8" )
Packit Service bb5c11
  list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS )
Packit Service bb5c11
  set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
unset( __levelIdx )
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# remember target ABI
Packit Service bb5c11
set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE )
Packit Service bb5c11
if( CMAKE_VERSION VERSION_GREATER "2.8" )
Packit Service bb5c11
 list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} )
Packit Service bb5c11
 set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# runtime choice (STL, rtti, exceptions)
Packit Service bb5c11
if( NOT ANDROID_STL )
Packit Service bb5c11
  set( ANDROID_STL gnustl_static )
Packit Service bb5c11
endif()
Packit Service bb5c11
set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" )
Packit Service bb5c11
set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" )
Packit Service bb5c11
mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES )
Packit Service bb5c11
Packit Service bb5c11
if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
 if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$")
Packit Service bb5c11
  message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
Packit Service bb5c11
The possible values are:
Packit Service bb5c11
  none           -> Do not configure the runtime.
Packit Service bb5c11
  system         -> Use the default minimal system C++ runtime library.
Packit Service bb5c11
  system_re      -> Same as system but with rtti and exceptions.
Packit Service bb5c11
  gabi++_static  -> Use the GAbi++ runtime as a static library.
Packit Service bb5c11
  gabi++_shared  -> Use the GAbi++ runtime as a shared library.
Packit Service bb5c11
  stlport_static -> Use the STLport runtime as a static library.
Packit Service bb5c11
  stlport_shared -> Use the STLport runtime as a shared library.
Packit Service bb5c11
  gnustl_static  -> (default) Use the GNU STL as a static library.
Packit Service bb5c11
  gnustl_shared  -> Use the GNU STL as a shared library.
Packit Service bb5c11
" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
elseif( BUILD_WITH_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
 if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$")
Packit Service bb5c11
  message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
Packit Service bb5c11
The possible values are:
Packit Service bb5c11
  none           -> Do not configure the runtime.
Packit Service bb5c11
  gnustl_static  -> (default) Use the GNU STL as a static library.
Packit Service bb5c11
  gnustl_shared  -> Use the GNU STL as a shared library.
Packit Service bb5c11
" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
unset( ANDROID_RTTI )
Packit Service bb5c11
unset( ANDROID_EXCEPTIONS )
Packit Service bb5c11
unset( ANDROID_STL_INCLUDE_DIRS )
Packit Service bb5c11
unset( __libstl )
Packit Service bb5c11
unset( __libsupcxx )
Packit Service bb5c11
Packit Service bb5c11
if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" )
Packit Service bb5c11
 message( WARNING  "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf).
Packit Service bb5c11
You are strongly recommended to switch to another NDK release.
Packit Service bb5c11
" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
Packit Service bb5c11
  message( WARNING  "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
Packit Service bb5c11
See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
Packit Service bb5c11
  diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
Packit Service bb5c11
  index 5e28c64..65892a1 100644
Packit Service bb5c11
  --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
Packit Service bb5c11
  +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
Packit Service bb5c11
  @@ -51,7 +51,11 @@ typedef long int       ssize_t;
Packit Service bb5c11
   #endif
Packit Service bb5c11
   #ifndef _PTRDIFF_T
Packit Service bb5c11
   #define _PTRDIFF_T
Packit Service bb5c11
  -typedef long           ptrdiff_t;
Packit Service bb5c11
  +#  ifdef __ANDROID__
Packit Service bb5c11
  +     typedef int            ptrdiff_t;
Packit Service bb5c11
  +#  else
Packit Service bb5c11
  +     typedef long           ptrdiff_t;
Packit Service bb5c11
  +#  endif
Packit Service bb5c11
   #endif
Packit Service bb5c11
" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# setup paths and STL for standalone toolchain
Packit Service bb5c11
if( BUILD_WITH_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
 set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
Packit Service bb5c11
 set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
Packit Service bb5c11
 set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" )
Packit Service bb5c11
Packit Service bb5c11
 if( NOT ANDROID_STL STREQUAL "none" )
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/include/c++/${ANDROID_COMPILER_VERSION}" )
Packit Service bb5c11
  if( NOT EXISTS "${ANDROID_STL_INCLUDE_DIRS}" )
Packit Service bb5c11
   # old location ( pre r8c )
Packit Service bb5c11
   set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
Packit Service bb5c11
   list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" )
Packit Service bb5c11
  elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" )
Packit Service bb5c11
   list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" )
Packit Service bb5c11
  else()
Packit Service bb5c11
   list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  # always search static GNU STL to get the location of libsupc++.a
Packit Service bb5c11
  if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
Packit Service bb5c11
   set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" )
Packit Service bb5c11
  elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
Packit Service bb5c11
   set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" )
Packit Service bb5c11
  elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" )
Packit Service bb5c11
   set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" )
Packit Service bb5c11
  elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" )
Packit Service bb5c11
   set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( __libstl )
Packit Service bb5c11
   set( __libsupcxx "${__libstl}/libsupc++.a" )
Packit Service bb5c11
   set( __libstl    "${__libstl}/libstdc++.a" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( NOT EXISTS "${__libsupcxx}" )
Packit Service bb5c11
   message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain.
Packit Service bb5c11
 Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c.
Packit Service bb5c11
 You need to either upgrade to newer NDK or manually copy
Packit Service bb5c11
     $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a
Packit Service bb5c11
 to
Packit Service bb5c11
     ${__libsupcxx}
Packit Service bb5c11
   " )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( ANDROID_STL STREQUAL "gnustl_shared" )
Packit Service bb5c11
   if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
Packit Service bb5c11
    set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
Packit Service bb5c11
   elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
Packit Service bb5c11
    set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
Packit Service bb5c11
   elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
Packit Service bb5c11
    set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# clang
Packit Service bb5c11
if( "${ANDROID_TOOLCHAIN_NAME}" STREQUAL "standalone-clang" )
Packit Service bb5c11
 set( ANDROID_COMPILER_IS_CLANG 1 )
Packit Service bb5c11
 execute_process( COMMAND "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/clang${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE ANDROID_CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE )
Packit Service bb5c11
 string( REGEX MATCH "[0-9]+[.][0-9]+" ANDROID_CLANG_VERSION "${ANDROID_CLANG_VERSION}")
Packit Service bb5c11
elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" )
Packit Service bb5c11
 string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
Packit Service bb5c11
 string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-${ANDROID_COMPILER_VERSION}" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
Packit Service bb5c11
 if( NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}/bin/clang${TOOL_OS_SUFFIX}" )
Packit Service bb5c11
  message( FATAL_ERROR "Could not find the Clang compiler driver" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_COMPILER_IS_CLANG 1 )
Packit Service bb5c11
 set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
Packit Service bb5c11
else()
Packit Service bb5c11
 set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
Packit Service bb5c11
 unset( ANDROID_COMPILER_IS_CLANG CACHE )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
string( REPLACE "." "" _clang_name "clang${ANDROID_CLANG_VERSION}" )
Packit Service bb5c11
if( NOT EXISTS "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" )
Packit Service bb5c11
 set( _clang_name "clang" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# setup paths and STL for NDK
Packit Service bb5c11
if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
 set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
Packit Service bb5c11
 set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" )
Packit Service bb5c11
Packit Service bb5c11
 if( ANDROID_STL STREQUAL "none" )
Packit Service bb5c11
  # do nothing
Packit Service bb5c11
 elseif( ANDROID_STL STREQUAL "system" )
Packit Service bb5c11
  set( ANDROID_RTTI             OFF )
Packit Service bb5c11
  set( ANDROID_EXCEPTIONS       OFF )
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
Packit Service bb5c11
 elseif( ANDROID_STL STREQUAL "system_re" )
Packit Service bb5c11
  set( ANDROID_RTTI             ON )
Packit Service bb5c11
  set( ANDROID_EXCEPTIONS       ON )
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
Packit Service bb5c11
 elseif( ANDROID_STL MATCHES "gabi" )
Packit Service bb5c11
  if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
Packit Service bb5c11
   message( FATAL_ERROR "gabi++ is not available in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.")
Packit Service bb5c11
  endif()
Packit Service bb5c11
  set( ANDROID_RTTI             ON )
Packit Service bb5c11
  set( ANDROID_EXCEPTIONS       OFF )
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" )
Packit Service bb5c11
  set( __libstl                 "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" )
Packit Service bb5c11
 elseif( ANDROID_STL MATCHES "stlport" )
Packit Service bb5c11
  if( NOT ANDROID_NDK_RELEASE_NUM LESS 8004 ) # before r8d
Packit Service bb5c11
   set( ANDROID_EXCEPTIONS       ON )
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( ANDROID_EXCEPTIONS       OFF )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
Packit Service bb5c11
   set( ANDROID_RTTI            OFF )
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( ANDROID_RTTI            ON )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" )
Packit Service bb5c11
  set( __libstl                 "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
Packit Service bb5c11
 elseif( ANDROID_STL MATCHES "gnustl" )
Packit Service bb5c11
  set( ANDROID_EXCEPTIONS       ON )
Packit Service bb5c11
  set( ANDROID_RTTI             ON )
Packit Service bb5c11
  if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
Packit Service bb5c11
   if( ARMEABI_V7A AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.7" AND ANDROID_NDK_RELEASE STREQUAL "r8d" )
Packit Service bb5c11
    # gnustl binary for 4.7 compiler is buggy :(
Packit Service bb5c11
    # TODO: look for right fix
Packit Service bb5c11
    set( __libstl                "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.6" )
Packit Service bb5c11
   else()
Packit Service bb5c11
    set( __libstl                "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( __libstl                "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" "${__libstl}/include/backward" )
Packit Service bb5c11
  if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
Packit Service bb5c11
   set( __libstl                "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( __libstl                "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 else()
Packit Service bb5c11
  message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 # find libsupc++.a - rtti & exceptions
Packit Service bb5c11
 if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" )
Packit Service bb5c11
  set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r8b or newer
Packit Service bb5c11
  if( NOT EXISTS "${__libsupcxx}" )
Packit Service bb5c11
   set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r7-r8
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( NOT EXISTS "${__libsupcxx}" ) # before r7
Packit Service bb5c11
   if( ARMEABI_V7A )
Packit Service bb5c11
    if( ANDROID_FORCE_ARM_BUILD )
Packit Service bb5c11
     set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
Packit Service bb5c11
    else()
Packit Service bb5c11
     set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
Packit Service bb5c11
    endif()
Packit Service bb5c11
   elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD )
Packit Service bb5c11
    set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
Packit Service bb5c11
   else()
Packit Service bb5c11
    set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
  if( NOT EXISTS "${__libsupcxx}")
Packit Service bb5c11
   message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.")
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# case of shared STL linkage
Packit Service bb5c11
if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl )
Packit Service bb5c11
 string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" )
Packit Service bb5c11
 # TODO: check if .so file exists before the renaming
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# ccache support
Packit Service bb5c11
__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE )
Packit Service bb5c11
if( _ndk_ccache )
Packit Service bb5c11
 if( DEFINED NDK_CCACHE AND NOT EXISTS NDK_CCACHE )
Packit Service bb5c11
  unset( NDK_CCACHE CACHE )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary")
Packit Service bb5c11
else()
Packit Service bb5c11
 unset( NDK_CCACHE CACHE )
Packit Service bb5c11
endif()
Packit Service bb5c11
unset( _ndk_ccache )
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# setup the cross-compiler
Packit Service bb5c11
if( NOT CMAKE_C_COMPILER )
Packit Service bb5c11
 if( NDK_CCACHE AND NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
Packit Service bb5c11
  set( CMAKE_C_COMPILER   "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" )
Packit Service bb5c11
  set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" )
Packit Service bb5c11
  if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
   set( CMAKE_C_COMPILER_ARG1   "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}"   CACHE PATH "C compiler")
Packit Service bb5c11
   set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( CMAKE_C_COMPILER_ARG1   "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
Packit Service bb5c11
   set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
Packit Service bb5c11
  endif()
Packit Service bb5c11
 else()
Packit Service bb5c11
  if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
   set( CMAKE_C_COMPILER   "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}"   CACHE PATH "C compiler")
Packit Service bb5c11
   set( CMAKE_CXX_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
Packit Service bb5c11
  else()
Packit Service bb5c11
   set( CMAKE_C_COMPILER   "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}"    CACHE PATH "C compiler" )
Packit Service bb5c11
   set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}"    CACHE PATH "C++ compiler" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}"     CACHE PATH "assembler" )
Packit Service bb5c11
 set( CMAKE_STRIP        "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}"   CACHE PATH "strip" )
Packit Service bb5c11
 if( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" )
Packit Service bb5c11
  # Use gcc-ar if we have it for better LTO support.
Packit Service bb5c11
  set( CMAKE_AR           "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}"      CACHE PATH "archive" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( CMAKE_AR           "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}"      CACHE PATH "archive" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( CMAKE_LINKER       "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}"      CACHE PATH "linker" )
Packit Service bb5c11
 set( CMAKE_NM           "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}"      CACHE PATH "nm" )
Packit Service bb5c11
 set( CMAKE_OBJCOPY      "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" )
Packit Service bb5c11
 set( CMAKE_OBJDUMP      "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" )
Packit Service bb5c11
 set( CMAKE_RANLIB       "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}"  CACHE PATH "ranlib" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" )
Packit Service bb5c11
if( CMAKE_VERSION VERSION_LESS 2.8.5 )
Packit Service bb5c11
 set( CMAKE_ASM_COMPILER_ARG1 "-c" )
Packit Service bb5c11
endif()
Packit Service bb5c11
if( APPLE )
Packit Service bb5c11
 find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool )
Packit Service bb5c11
 if( NOT CMAKE_INSTALL_NAME_TOOL )
Packit Service bb5c11
  message( FATAL_ERROR "Could not find install_name_tool, please check your installation." )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 mark_as_advanced( CMAKE_INSTALL_NAME_TOOL )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# Force set compilers because standard identification works badly for us
Packit Service bb5c11
include( CMakeForceCompiler )
Packit Service bb5c11
CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU )
Packit Service bb5c11
if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
 set( CMAKE_C_COMPILER_ID Clang )
Packit Service bb5c11
endif()
Packit Service bb5c11
set( CMAKE_C_PLATFORM_ID Linux )
Packit Service bb5c11
if( X86_64 OR MIPS64 OR ARM64_V8A )
Packit Service bb5c11
 set( CMAKE_C_SIZEOF_DATA_PTR 8 )
Packit Service bb5c11
else()
Packit Service bb5c11
 set( CMAKE_C_SIZEOF_DATA_PTR 4 )
Packit Service bb5c11
endif()
Packit Service bb5c11
set( CMAKE_C_HAS_ISYSROOT 1 )
Packit Service bb5c11
set( CMAKE_C_COMPILER_ABI ELF )
Packit Service bb5c11
CMAKE_FORCE_CXX_COMPILER( "${CMAKE_CXX_COMPILER}" GNU )
Packit Service bb5c11
if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
 set( CMAKE_CXX_COMPILER_ID Clang)
Packit Service bb5c11
endif()
Packit Service bb5c11
set( CMAKE_CXX_PLATFORM_ID Linux )
Packit Service bb5c11
set( CMAKE_CXX_SIZEOF_DATA_PTR ${CMAKE_C_SIZEOF_DATA_PTR} )
Packit Service bb5c11
set( CMAKE_CXX_HAS_ISYSROOT 1 )
Packit Service bb5c11
set( CMAKE_CXX_COMPILER_ABI ELF )
Packit Service bb5c11
set( CMAKE_CXX_SOURCE_FILE_EXTENSIONS cc cp cxx cpp CPP c++ C )
Packit Service bb5c11
# force ASM compiler (required for CMake < 2.8.5)
Packit Service bb5c11
set( CMAKE_ASM_COMPILER_ID_RUN TRUE )
Packit Service bb5c11
set( CMAKE_ASM_COMPILER_ID GNU )
Packit Service bb5c11
set( CMAKE_ASM_COMPILER_WORKS TRUE )
Packit Service bb5c11
set( CMAKE_ASM_COMPILER_FORCED TRUE )
Packit Service bb5c11
set( CMAKE_COMPILER_IS_GNUASM 1)
Packit Service bb5c11
set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm )
Packit Service bb5c11
Packit Service bb5c11
foreach( lang C CXX ASM )
Packit Service bb5c11
 if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
  set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_CLANG_VERSION} )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_COMPILER_VERSION} )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endforeach()
Packit Service bb5c11
Packit Service bb5c11
# flags and definitions
Packit Service bb5c11
remove_definitions( -DANDROID )
Packit Service bb5c11
add_definitions( -DANDROID )
Packit Service bb5c11
Packit Service bb5c11
set (CMAKE_SYSROOT "${ANDROID_SYSROOT}")
Packit Service bb5c11
Packit Service bb5c11
# NDK flags
Packit Service bb5c11
if (ARM64_V8A )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS         "${ANDROID_CXX_FLAGS} -funwind-tables" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_DEBUG   "-fno-omit-frame-pointer -fno-strict-aliasing" )
Packit Service bb5c11
 if( NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
elseif( ARMEABI OR ARMEABI_V7A)
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
Packit Service bb5c11
 if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_DEBUG   "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
Packit Service bb5c11
  if( NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
   set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 else()
Packit Service bb5c11
  # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_DEBUG   "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
Packit Service bb5c11
  if( NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
   set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endif()
Packit Service bb5c11
elseif( X86 OR X86_64 )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
Packit Service bb5c11
 if( NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_DEBUG   "-fno-omit-frame-pointer -fno-strict-aliasing" )
Packit Service bb5c11
elseif( MIPS OR MIPS64 )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS         "${ANDROID_CXX_FLAGS} -fno-strict-aliasing -finline-functions -funwind-tables -fmessage-length=0" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_DEBUG   "-fno-omit-frame-pointer" )
Packit Service bb5c11
 if( NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
elseif()
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_RELEASE "" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS_DEBUG   "" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
Packit Service bb5c11
Packit Service bb5c11
if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# ABI-specific flags
Packit Service bb5c11
if( ARMEABI_V7A )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" )
Packit Service bb5c11
 if( NEON )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
Packit Service bb5c11
 elseif( VFPV3 )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
elseif( ARMEABI_V6 )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2
Packit Service bb5c11
elseif( ARMEABI )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_STL MATCHES "gnustl" AND (EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}") )
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_MODULE  "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
 set( CMAKE_CXX_LINK_EXECUTABLE       "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
Packit Service bb5c11
else()
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_MODULE  "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
 set( CMAKE_CXX_LINK_EXECUTABLE       "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# STL
Packit Service bb5c11
if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
Packit Service bb5c11
 if( EXISTS "${__libstl}" )
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" )
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_MODULE  "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" )
Packit Service bb5c11
  set( CMAKE_CXX_LINK_EXECUTABLE       "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 if( EXISTS "${__libsupcxx}" )
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_MODULE  "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
Packit Service bb5c11
  set( CMAKE_CXX_LINK_EXECUTABLE       "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
Packit Service bb5c11
  # C objects:
Packit Service bb5c11
  set( CMAKE_C_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
  set( CMAKE_C_CREATE_SHARED_MODULE  "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
Packit Service bb5c11
  set( CMAKE_C_LINK_EXECUTABLE       "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
Packit Service bb5c11
  set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
Packit Service bb5c11
  set( CMAKE_C_CREATE_SHARED_MODULE  "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
Packit Service bb5c11
  set( CMAKE_C_LINK_EXECUTABLE       "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 if( ANDROID_STL MATCHES "gnustl" )
Packit Service bb5c11
  if( NOT EXISTS "${ANDROID_LIBM_PATH}" )
Packit Service bb5c11
   set( ANDROID_LIBM_PATH -lm )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} ${ANDROID_LIBM_PATH}" )
Packit Service bb5c11
  set( CMAKE_CXX_CREATE_SHARED_MODULE  "${CMAKE_CXX_CREATE_SHARED_MODULE} ${ANDROID_LIBM_PATH}" )
Packit Service bb5c11
  set( CMAKE_CXX_LINK_EXECUTABLE       "${CMAKE_CXX_LINK_EXECUTABLE} ${ANDROID_LIBM_PATH}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# variables controlling optional build flags
Packit Service bb5c11
if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
Packit Service bb5c11
 # libGLESv2.so in NDK's prior to r7 refers to missing external symbols.
Packit Service bb5c11
 # So this flag option is required for all projects using OpenGL from native.
Packit Service bb5c11
 __INIT_VARIABLE( ANDROID_SO_UNDEFINED                      VALUES ON )
Packit Service bb5c11
else()
Packit Service bb5c11
 __INIT_VARIABLE( ANDROID_SO_UNDEFINED                      VALUES OFF )
Packit Service bb5c11
endif()
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_NO_UNDEFINED                       VALUES ON )
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING             VALUES ON )
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_GOLD_LINKER                        VALUES ON )
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_NOEXECSTACK                        VALUES ON )
Packit Service bb5c11
__INIT_VARIABLE( ANDROID_RELRO                              VALUES ON )
Packit Service bb5c11
Packit Service bb5c11
set( ANDROID_NO_UNDEFINED           ${ANDROID_NO_UNDEFINED}           CACHE BOOL "Show all undefined symbols as linker errors" )
Packit Service bb5c11
set( ANDROID_SO_UNDEFINED           ${ANDROID_SO_UNDEFINED}           CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
Packit Service bb5c11
set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Put each function in separate section and enable garbage collection of unused input sections at link time" )
Packit Service bb5c11
set( ANDROID_GOLD_LINKER            ${ANDROID_GOLD_LINKER}            CACHE BOOL "Enables gold linker" )
Packit Service bb5c11
set( ANDROID_NOEXECSTACK            ${ANDROID_NOEXECSTACK}            CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
Packit Service bb5c11
set( ANDROID_RELRO                  ${ANDROID_RELRO}                  CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" )
Packit Service bb5c11
mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO )
Packit Service bb5c11
Packit Service bb5c11
# linker flags
Packit Service bb5c11
set( ANDROID_LINKER_FLAGS "" )
Packit Service bb5c11
Packit Service bb5c11
if( ARMEABI_V7A )
Packit Service bb5c11
 # this is *required* to use the following linker flags that routes around
Packit Service bb5c11
 # a CPU bug in some Cortex-A8 implementations:
Packit Service bb5c11
 set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_NO_UNDEFINED )
Packit Service bb5c11
 if( MIPS )
Packit Service bb5c11
  # there is some sysroot-related problem in mips linker...
Packit Service bb5c11
  if( NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
Packit Service bb5c11
   set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined -Wl,-rpath-link,${ANDROID_SYSROOT}/usr/lib" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_SO_UNDEFINED )
Packit Service bb5c11
 set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_FUNCTION_LEVEL_LINKING )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS    "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" )
Packit Service bb5c11
 set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
Packit Service bb5c11
 if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) )
Packit Service bb5c11
  set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
Packit Service bb5c11
 elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b
Packit Service bb5c11
  set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" )
Packit Service bb5c11
 elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND NOT _CMAKE_IN_TRY_COMPILE )
Packit Service bb5c11
  message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
Packit Service bb5c11
  On Linux and OS X host platform you can workaround this problem using gold linker (default).
Packit Service bb5c11
  Rerun cmake with -DANDROID_GOLD_LINKER=ON option in case of problems.
Packit Service bb5c11
" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif() # version 4.6
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_NOEXECSTACK )
Packit Service bb5c11
 if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS    "${ANDROID_CXX_FLAGS} -Xclang -mnoexecstack" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS    "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_RELRO )
Packit Service bb5c11
 set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_COMPILER_IS_CLANG )
Packit Service bb5c11
 set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} -Qunused-arguments ${ANDROID_CXX_FLAGS}" )
Packit Service bb5c11
 if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
  set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
else()
Packit Service bb5c11
  if( BUILD_WITH_ANDROID_NDK )
Packit Service bb5c11
    set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} --sysroot=${ANDROID_SYSROOT}" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# cache flags
Packit Service bb5c11
set( CMAKE_CXX_FLAGS           ""                        CACHE STRING "c++ flags" )
Packit Service bb5c11
set( CMAKE_C_FLAGS             ""                        CACHE STRING "c flags" )
Packit Service bb5c11
set( CMAKE_CXX_FLAGS_RELEASE   "-O3 -DNDEBUG"            CACHE STRING "c++ Release flags" )
Packit Service bb5c11
set( CMAKE_C_FLAGS_RELEASE     "-O3 -DNDEBUG"            CACHE STRING "c Release flags" )
Packit Service bb5c11
set( CMAKE_CXX_FLAGS_DEBUG     "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" )
Packit Service bb5c11
set( CMAKE_C_FLAGS_DEBUG       "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" )
Packit Service bb5c11
set( CMAKE_SHARED_LINKER_FLAGS ""                        CACHE STRING "shared linker flags" )
Packit Service bb5c11
set( CMAKE_MODULE_LINKER_FLAGS ""                        CACHE STRING "module linker flags" )
Packit Service bb5c11
set( CMAKE_EXE_LINKER_FLAGS    "-Wl,-z,nocopyreloc"      CACHE STRING "executable linker flags" )
Packit Service bb5c11
Packit Service bb5c11
# put flags to cache (for debug purpose only)
Packit Service bb5c11
set( ANDROID_CXX_FLAGS         "${ANDROID_CXX_FLAGS}"         CACHE INTERNAL "Android specific c/c++ flags" )
Packit Service bb5c11
set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" )
Packit Service bb5c11
set( ANDROID_CXX_FLAGS_DEBUG   "${ANDROID_CXX_FLAGS_DEBUG}"   CACHE INTERNAL "Android specific c/c++ Debug flags" )
Packit Service bb5c11
set( ANDROID_LINKER_FLAGS      "${ANDROID_LINKER_FLAGS}"      CACHE INTERNAL "Android specific c/c++ linker flags" )
Packit Service bb5c11
Packit Service bb5c11
# finish flags
Packit Service bb5c11
set( CMAKE_CXX_FLAGS           "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
set( CMAKE_C_FLAGS             "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
Packit Service bb5c11
set( CMAKE_CXX_FLAGS_RELEASE   "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" )
Packit Service bb5c11
set( CMAKE_C_FLAGS_RELEASE     "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" )
Packit Service bb5c11
set( CMAKE_CXX_FLAGS_DEBUG     "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" )
Packit Service bb5c11
set( CMAKE_C_FLAGS_DEBUG       "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" )
Packit Service bb5c11
set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
Packit Service bb5c11
set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
Packit Service bb5c11
set( CMAKE_EXE_LINKER_FLAGS    "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
Packit Service bb5c11
Packit Service bb5c11
if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" )
Packit Service bb5c11
 set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" )
Packit Service bb5c11
 set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" )
Packit Service bb5c11
 set( CMAKE_EXE_LINKER_FLAGS    "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# pie/pic
Packit Service bb5c11
if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE) AND (CMAKE_VERSION VERSION_GREATER 2.8.8) )
Packit Service bb5c11
 set( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
Packit Service bb5c11
 set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
Packit Service bb5c11
else()
Packit Service bb5c11
 set( CMAKE_POSITION_INDEPENDENT_CODE FALSE )
Packit Service bb5c11
 set( CMAKE_CXX_FLAGS "-fpic ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
 set( CMAKE_C_FLAGS   "-fpic ${CMAKE_C_FLAGS}" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# configure rtti
Packit Service bb5c11
if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES )
Packit Service bb5c11
 if( ANDROID_RTTI )
Packit Service bb5c11
  set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# configure exceptios
Packit Service bb5c11
if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES )
Packit Service bb5c11
 if( ANDROID_EXCEPTIONS )
Packit Service bb5c11
  set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
  set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" )
Packit Service bb5c11
  set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# global includes and link directories
Packit Service bb5c11
include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} )
Packit Service bb5c11
get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning
Packit Service bb5c11
link_directories( "${__android_install_path}" )
Packit Service bb5c11
Packit Service bb5c11
# detect if need link crtbegin_so.o explicitly
Packit Service bb5c11
if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK )
Packit Service bb5c11
 set( __cmd "${CMAKE_CXX_CREATE_SHARED_LIBRARY}" )
Packit Service bb5c11
 string( REPLACE "<CMAKE_CXX_COMPILER>" "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<CMAKE_C_COMPILER>"   "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"   __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<CMAKE_SHARED_LIBRARY_CXX_FLAGS>" "${CMAKE_CXX_FLAGS}" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<LANGUAGE_COMPILE_FLAGS>" "" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<LINK_FLAGS>" "${CMAKE_SHARED_LINKER_FLAGS}" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS>" "-shared" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG>" "" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<TARGET_SONAME>" "" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<TARGET>" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain_crtlink_test.so" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<OBJECTS>" "\"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "<LINK_LIBRARIES>" "" __cmd "${__cmd}" )
Packit Service bb5c11
 separate_arguments( __cmd )
Packit Service bb5c11
 foreach( __var ANDROID_NDK ANDROID_NDK_TOOLCHAINS_PATH ANDROID_STANDALONE_TOOLCHAIN )
Packit Service bb5c11
  if( ${__var} )
Packit Service bb5c11
   set( __tmp "${${__var}}" )
Packit Service bb5c11
   separate_arguments( __tmp )
Packit Service bb5c11
   string( REPLACE "${__tmp}" "${${__var}}" __cmd "${__cmd}")
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endforeach()
Packit Service bb5c11
 string( REPLACE "'" "" __cmd "${__cmd}" )
Packit Service bb5c11
 string( REPLACE "\"" "" __cmd "${__cmd}" )
Packit Service bb5c11
 execute_process( COMMAND ${__cmd} RESULT_VARIABLE __cmd_result OUTPUT_QUIET ERROR_QUIET )
Packit Service bb5c11
 if( __cmd_result EQUAL 0 )
Packit Service bb5c11
  set( ANDROID_EXPLICIT_CRT_LINK ON )
Packit Service bb5c11
 else()
Packit Service bb5c11
  set( ANDROID_EXPLICIT_CRT_LINK OFF )
Packit Service bb5c11
 endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
if( ANDROID_EXPLICIT_CRT_LINK )
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
Packit Service bb5c11
 set( CMAKE_CXX_CREATE_SHARED_MODULE  "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# setup output directories
Packit Service bb5c11
set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" )
Packit Service bb5c11
Packit Service bb5c11
if( DEFINED LIBRARY_OUTPUT_PATH_ROOT
Packit Service bb5c11
      OR EXISTS "${CMAKE_SOURCE_DIR}/AndroidManifest.xml"
Packit Service bb5c11
      OR (EXISTS "${CMAKE_SOURCE_DIR}/../AndroidManifest.xml" AND EXISTS "${CMAKE_SOURCE_DIR}/../jni/") )
Packit Service bb5c11
  set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Root for binaries output, set this to change where Android libs are installed to" )
Packit Service bb5c11
  if( NOT _CMAKE_IN_TRY_COMPILE )
Packit Service bb5c11
    if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
Packit Service bb5c11
      set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
Packit Service bb5c11
    else()
Packit Service bb5c11
      set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
Packit Service bb5c11
    endif()
Packit Service bb5c11
    set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for Android libs" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
# copy shaed stl library to build directory
Packit Service bb5c11
if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" AND DEFINED LIBRARY_OUTPUT_PATH )
Packit Service bb5c11
  get_filename_component( __libstlname "${__libstl}" NAME )
Packit Service bb5c11
  execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess )
Packit Service bb5c11
  if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}")
Packit Service bb5c11
    message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" )
Packit Service bb5c11
  endif()
Packit Service bb5c11
  unset( __fileCopyProcess )
Packit Service bb5c11
  unset( __libstlname )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# set these global flags for cmake client scripts to change behavior
Packit Service bb5c11
set( ANDROID True )
Packit Service bb5c11
set( BUILD_ANDROID True )
Packit Service bb5c11
Packit Service bb5c11
# where is the target environment
Packit Service bb5c11
set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" "${CMAKE_PREFIX_PATH}" )
Packit Service bb5c11
Packit Service bb5c11
# only search for libraries and includes in the ndk toolchain
Packit Service bb5c11
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
Packit Service bb5c11
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
Packit Service bb5c11
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# macro to find packages on the host OS
Packit Service bb5c11
macro( find_host_package )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
Packit Service bb5c11
 if( CMAKE_HOST_WIN32 )
Packit Service bb5c11
  SET( WIN32 1 )
Packit Service bb5c11
  SET( UNIX )
Packit Service bb5c11
 elseif( CMAKE_HOST_APPLE )
Packit Service bb5c11
  SET( APPLE 1 )
Packit Service bb5c11
  SET( UNIX )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 find_package( ${ARGN} )
Packit Service bb5c11
 SET( WIN32 )
Packit Service bb5c11
 SET( APPLE )
Packit Service bb5c11
 SET( UNIX 1 )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# macro to find programs on the host OS
Packit Service bb5c11
macro( find_host_program )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
Packit Service bb5c11
 if( CMAKE_HOST_WIN32 )
Packit Service bb5c11
  SET( WIN32 1 )
Packit Service bb5c11
  SET( UNIX )
Packit Service bb5c11
 elseif( CMAKE_HOST_APPLE )
Packit Service bb5c11
  SET( APPLE 1 )
Packit Service bb5c11
  SET( UNIX )
Packit Service bb5c11
 endif()
Packit Service bb5c11
 find_program( ${ARGN} )
Packit Service bb5c11
 SET( WIN32 )
Packit Service bb5c11
 SET( APPLE )
Packit Service bb5c11
 SET( UNIX 1 )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
Packit Service bb5c11
 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
Packit Service bb5c11
endmacro()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# export toolchain settings for the try_compile() command
Packit Service bb5c11
if( NOT _CMAKE_IN_TRY_COMPILE )
Packit Service bb5c11
 set( __toolchain_config "")
Packit Service bb5c11
 foreach( __var NDK_CCACHE  LIBRARY_OUTPUT_PATH_ROOT  ANDROID_FORBID_SYGWIN
Packit Service bb5c11
                ANDROID_NDK_HOST_X64
Packit Service bb5c11
                ANDROID_NDK
Packit Service bb5c11
                ANDROID_NDK_LAYOUT
Packit Service bb5c11
                ANDROID_STANDALONE_TOOLCHAIN
Packit Service bb5c11
                ANDROID_TOOLCHAIN_NAME
Packit Service bb5c11
                ANDROID_ABI
Packit Service bb5c11
                ANDROID_NATIVE_API_LEVEL
Packit Service bb5c11
                ANDROID_STL
Packit Service bb5c11
                ANDROID_STL_FORCE_FEATURES
Packit Service bb5c11
                ANDROID_FORCE_ARM_BUILD
Packit Service bb5c11
                ANDROID_NO_UNDEFINED
Packit Service bb5c11
                ANDROID_SO_UNDEFINED
Packit Service bb5c11
                ANDROID_FUNCTION_LEVEL_LINKING
Packit Service bb5c11
                ANDROID_GOLD_LINKER
Packit Service bb5c11
                ANDROID_NOEXECSTACK
Packit Service bb5c11
                ANDROID_RELRO
Packit Service bb5c11
                ANDROID_LIBM_PATH
Packit Service bb5c11
                ANDROID_EXPLICIT_CRT_LINK
Packit Service bb5c11
                ANDROID_APP_PIE
Packit Service bb5c11
                )
Packit Service bb5c11
  if( DEFINED ${__var} )
Packit Service bb5c11
   if( ${__var} MATCHES " ")
Packit Service bb5c11
    set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" )
Packit Service bb5c11
   else()
Packit Service bb5c11
    set( __toolchain_config "${__toolchain_config}set( ${__var} ${${__var}} CACHE INTERNAL \"\" )\n" )
Packit Service bb5c11
   endif()
Packit Service bb5c11
  endif()
Packit Service bb5c11
 endforeach()
Packit Service bb5c11
 file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" )
Packit Service bb5c11
 unset( __toolchain_config )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# force cmake to produce / instead of \ in build commands for Ninja generator
Packit Service bb5c11
if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 )
Packit Service bb5c11
 # it is a bad hack after all
Packit Service bb5c11
 # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW
Packit Service bb5c11
 set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW
Packit Service bb5c11
 set( CMAKE_CROSSCOMPILING TRUE )    # stop recursion
Packit Service bb5c11
 enable_language( C )
Packit Service bb5c11
 enable_language( CXX )
Packit Service bb5c11
 # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it
Packit Service bb5c11
 unset( MINGW )
Packit Service bb5c11
endif()
Packit Service bb5c11
Packit Service bb5c11
Packit Service bb5c11
# Variables controlling behavior or set by cmake toolchain:
Packit Service bb5c11
#   ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
Packit Service bb5c11
#   ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version)
Packit Service bb5c11
#   ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none
Packit Service bb5c11
#   ANDROID_FORBID_SYGWIN : ON/OFF
Packit Service bb5c11
#   ANDROID_NO_UNDEFINED : ON/OFF
Packit Service bb5c11
#   ANDROID_SO_UNDEFINED : OFF/ON  (default depends on NDK version)
Packit Service bb5c11
#   ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF
Packit Service bb5c11
#   ANDROID_GOLD_LINKER : ON/OFF
Packit Service bb5c11
#   ANDROID_NOEXECSTACK : ON/OFF
Packit Service bb5c11
#   ANDROID_RELRO : ON/OFF
Packit Service bb5c11
#   ANDROID_FORCE_ARM_BUILD : ON/OFF
Packit Service bb5c11
#   ANDROID_STL_FORCE_FEATURES : ON/OFF
Packit Service bb5c11
#   ANDROID_LIBM_PATH : path to libm.so (set to something like $(TOP)/out/target/product/<product_name>/obj/lib/libm.so) to workaround unresolved `sincos`
Packit Service bb5c11
# Can be set only at the first run:
Packit Service bb5c11
#   ANDROID_NDK : path to your NDK install
Packit Service bb5c11
#   NDK_CCACHE : path to your ccache executable
Packit Service bb5c11
#   ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
Packit Service bb5c11
#   ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems)
Packit Service bb5c11
#   ANDROID_NDK_LAYOUT : the inner NDK structure (RELEASE, LINARO, ANDROID)
Packit Service bb5c11
#   LIBRARY_OUTPUT_PATH_ROOT : <any valid path>
Packit Service bb5c11
#   ANDROID_STANDALONE_TOOLCHAIN
Packit Service bb5c11
#
Packit Service bb5c11
# Primary read-only variables:
Packit Service bb5c11
#   ANDROID : always TRUE
Packit Service bb5c11
#   ARMEABI : TRUE for arm v6 and older devices
Packit Service bb5c11
#   ARMEABI_V6 : TRUE for arm v6
Packit Service bb5c11
#   ARMEABI_V7A : TRUE for arm v7a
Packit Service bb5c11
#   ARM64_V8A : TRUE for arm64-v8a
Packit Service bb5c11
#   NEON : TRUE if NEON unit is enabled
Packit Service bb5c11
#   VFPV3 : TRUE if VFP version 3 is enabled
Packit Service bb5c11
#   X86 : TRUE if configured for x86
Packit Service bb5c11
#   X86_64 : TRUE if configured for x86_64
Packit Service bb5c11
#   MIPS : TRUE if configured for mips
Packit Service bb5c11
#   MIPS64 : TRUE if configured for mips64
Packit Service bb5c11
#   BUILD_WITH_ANDROID_NDK : TRUE if NDK is used
Packit Service bb5c11
#   BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
Packit Service bb5c11
#   ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
Packit Service bb5c11
#   ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
Packit Service bb5c11
#   ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK
Packit Service bb5c11
#   ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor)
Packit Service bb5c11
#   ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI
Packit Service bb5c11
#   ANDROID_SYSROOT : path to the compiler sysroot
Packit Service bb5c11
#   TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
Packit Service bb5c11
#   ANDROID_COMPILER_IS_CLANG : TRUE if clang compiler is used
Packit Service bb5c11
#
Packit Service bb5c11
# Secondary (less stable) read-only variables:
Packit Service bb5c11
#   ANDROID_COMPILER_VERSION : GCC version used (not Clang version)
Packit Service bb5c11
#   ANDROID_CLANG_VERSION : version of clang compiler if clang is used
Packit Service bb5c11
#   ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
Packit Service bb5c11
#   ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
Packit Service bb5c11
#   ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
Packit Service bb5c11
#   ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
Packit Service bb5c11
#   ANDROID_CLANG_TOOLCHAIN_ROOT : path to clang tools
Packit Service bb5c11
#   ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
Packit Service bb5c11
#   ANDROID_STL_INCLUDE_DIRS : stl include paths
Packit Service bb5c11
#   ANDROID_RTTI : if rtti is enabled by the runtime
Packit Service bb5c11
#   ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime
Packit Service bb5c11
#   ANDROID_GCC_TOOLCHAIN_NAME : read-only, differs from ANDROID_TOOLCHAIN_NAME only if clang is used
Packit Service bb5c11
#
Packit Service bb5c11
# Defaults:
Packit Service bb5c11
#   ANDROID_DEFAULT_NDK_API_LEVEL
Packit Service bb5c11
#   ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH}
Packit Service bb5c11
#   ANDROID_NDK_SEARCH_PATHS
Packit Service bb5c11
#   ANDROID_SUPPORTED_ABIS_${ARCH}
Packit Service bb5c11
#   ANDROID_SUPPORTED_NDK_VERSIONS