Browse Source

Merge topic 'android-info-variables'

f7c5e970 Android: Add CMAKE_<LANG>_ANDROID_TOOLCHAIN_MACHINE
d95e6dff Android: Add CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG variable
3d42a72b Android: Always set CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION
Brad King 9 years ago
parent
commit
0e9634d2c9

+ 1 - 1
Help/manual/cmake-toolchains.7.rst

@@ -387,7 +387,7 @@ Configure use of an Android NDK with the following variables:
 
 :variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION`
   Set to the version of the NDK toolchain to be selected as the compiler.
-  If not specified, the latest available GCC toolchain will be used.
+  If not specified, the default will be the latest available GCC toolchain.
 
 :variable:`CMAKE_ANDROID_STL_TYPE`
   Set to specify which C++ standard library to use.  If not specified,

+ 2 - 0
Help/manual/cmake-variables.7.rst

@@ -244,6 +244,7 @@ Variables that Control the Build
    /variable/CMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES
    /variable/CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES
    /variable/CMAKE_ANDROID_NDK
+   /variable/CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG
    /variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION
    /variable/CMAKE_ANDROID_PROCESS_MAX
    /variable/CMAKE_ANDROID_PROGUARD
@@ -354,6 +355,7 @@ Variables for Languages
    /variable/CMAKE_Fortran_MODDIR_FLAG
    /variable/CMAKE_Fortran_MODOUT_FLAG
    /variable/CMAKE_INTERNAL_PLATFORM_ABI
+   /variable/CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE
    /variable/CMAKE_LANG_ANDROID_TOOLCHAIN_PREFIX
    /variable/CMAKE_LANG_ANDROID_TOOLCHAIN_SUFFIX
    /variable/CMAKE_LANG_ARCHIVE_APPEND

+ 15 - 0
Help/release/dev/android-info-variables.rst

@@ -0,0 +1,15 @@
+android-info-variables
+----------------------
+
+* When :ref:`Cross Compiling for Android`, a new
+  :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_MACHINE` variable is
+  now set to indicate the binutils' machine name.
+
+* When :ref:`Cross Compiling for Android with the NDK`, the
+  :variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION` variable is
+  now set by CMake if it is not set by the user or toolchain file.
+
+* When :ref:`Cross Compiling for Android with the NDK`, a new
+  :variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG` variable is
+  now set by CMake to expose the host directory component of the
+  path to the NDK prebuilt toolchains.

+ 6 - 0
Help/variable/CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG.rst

@@ -0,0 +1,6 @@
+CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG
+------------------------------------
+
+When :ref:`Cross Compiling for Android with the NDK`, this variable
+provides the NDK's "host tag" used to construct the path to prebuilt
+toolchains that run on the host.

+ 3 - 0
Help/variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION.rst

@@ -11,3 +11,6 @@ as the compiler.  The variable must be set to one of these forms:
 
 A toolchain of the requested version will be selected automatically to
 match the ABI named in the :variable:`CMAKE_ANDROID_ARCH_ABI` variable.
+
+If not specified, the default will be a value that selects the latest
+available GCC toolchain.

+ 9 - 0
Help/variable/CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE.rst

@@ -0,0 +1,9 @@
+CMAKE_<LANG>_ANDROID_TOOLCHAIN_MACHINE
+--------------------------------------
+
+When :ref:`Cross Compiling for Android` this variable contains the
+toolchain binutils machine name (e.g. ``gcc -dumpmachine``).  The
+binutils typically have a ``<machine>-`` prefix on their name.
+
+See also :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX`
+and :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX`.

+ 2 - 1
Help/variable/CMAKE_LANG_ANDROID_TOOLCHAIN_PREFIX.rst

@@ -4,7 +4,8 @@ CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX
 When :ref:`Cross Compiling for Android` this variable contains the absolute
 path prefixing the toolchain GNU compiler and its binutils.
 
-See also :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX`.
+See also :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX`
+and :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_MACHINE`.
 
 For example, the path to the linker is::
 

+ 2 - 1
Help/variable/CMAKE_LANG_ANDROID_TOOLCHAIN_SUFFIX.rst

@@ -4,4 +4,5 @@ CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX
 When :ref:`Cross Compiling for Android` this variable contains the
 host platform suffix of the toolchain GNU compiler and its binutils.
 
-See also :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX`.
+See also :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX`
+and :variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_MACHINE`.

+ 15 - 2
Modules/Platform/Android/Determine-Compiler-NDK.cmake

@@ -52,6 +52,7 @@ unset(_ANDROID_CONFIG_MK_PATTERNS)
 # Find the newest toolchain version matching the ABI.
 set(_ANDROID_TOOL_NAME "")
 set(_ANDROID_TOOL_VERS 0)
+set(_ANDROID_TOOL_VERS_NDK "")
 set(_ANDROID_TOOL_SETUP_MK "")
 foreach(config_mk IN LISTS _ANDROID_CONFIG_MKS)
   # Check that the toolchain matches the ABI.
@@ -62,18 +63,21 @@ foreach(config_mk IN LISTS _ANDROID_CONFIG_MKS)
   unset(_ANDROID_TOOL_ABIS)
 
   # Check the version.
-  if("${config_mk}" MATCHES [[/([^/]+-(clang)?([0-9]\.[0-9]|))/config.mk$]])
+  if("${config_mk}" MATCHES [[/([^/]+-((clang)?([0-9]\.[0-9]|)))/config.mk$]])
     set(_ANDROID_CUR_NAME "${CMAKE_MATCH_1}")
-    set(_ANDROID_CUR_VERS "${CMAKE_MATCH_3}")
+    set(_ANDROID_CUR_VERS "${CMAKE_MATCH_4}")
+    set(_ANDROID_CUR_VERS_NDK "${CMAKE_MATCH_2}")
     if(_ANDROID_TOOL_VERS STREQUAL "")
       # already the latest possible
     elseif(_ANDROID_CUR_VERS STREQUAL "" OR _ANDROID_CUR_VERS VERSION_GREATER _ANDROID_TOOL_VERS)
       set(_ANDROID_TOOL_NAME "${_ANDROID_CUR_NAME}")
       set(_ANDROID_TOOL_VERS "${_ANDROID_CUR_VERS}")
+      set(_ANDROID_TOOL_VERS_NDK "${_ANDROID_CUR_VERS_NDK}")
       string(REPLACE "/config.mk" "/setup.mk" _ANDROID_TOOL_SETUP_MK "${config_mk}")
     endif()
     unset(_ANDROID_CUR_TOOL)
     unset(_ANDROID_CUR_VERS)
+    unset(_ANDROID_CUR_VERS_NDK)
   endif()
 endforeach()
 
@@ -206,10 +210,17 @@ endif()
 # Help CMakeFindBinUtils locate things.
 set(_CMAKE_TOOLCHAIN_PREFIX "${_ANDROID_TOOL_PREFIX}")
 
+set(_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG "${_ANDROID_HOST_DIR}")
+set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "${_ANDROID_TOOL_VERS_NDK}")
+
+# _ANDROID_TOOL_PREFIX should now match `gcc -dumpmachine`.
+string(REGEX REPLACE "-$" "" _ANDROID_TOOL_C_TOOLCHAIN_MACHINE "${_ANDROID_TOOL_PREFIX}")
+
 set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "${_ANDROID_TOOL_VERS}")
 set(_ANDROID_TOOL_C_TOOLCHAIN_PREFIX "${CMAKE_ANDROID_NDK}/toolchains/${_ANDROID_TOOL_NAME}/prebuilt/${_ANDROID_HOST_DIR}/bin/${_ANDROID_TOOL_PREFIX}")
 set(_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX "${_ANDROID_HOST_EXT}")
 
+set(_ANDROID_TOOL_CXX_TOOLCHAIN_MACHINE "${_ANDROID_TOOL_C_TOOLCHAIN_MACHINE}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_VERSION "${_ANDROID_TOOL_C_TOOLCHAIN_VERSION}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_PREFIX "${_ANDROID_TOOL_C_TOOLCHAIN_PREFIX}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_SUFFIX "${_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX}")
@@ -231,6 +242,7 @@ endif()
 if(CMAKE_ANDROID_NDK_TOOLCHAIN_DEBUG)
   message(STATUS "_ANDROID_TOOL_NAME=${_ANDROID_TOOL_NAME}")
   message(STATUS "_ANDROID_TOOL_VERS=${_ANDROID_TOOL_VERS}")
+  message(STATUS "_ANDROID_TOOL_VERS_NDK=${_ANDROID_TOOL_VERS_NDK}")
   message(STATUS "_ANDROID_TOOL_PREFIX=${_ANDROID_TOOL_PREFIX}")
   message(STATUS "_ANDROID_TOOL_CLANG_NAME=${_ANDROID_TOOL_CLANG_NAME}")
   message(STATUS "_ANDROID_TOOL_CLANG_VERS=${_ANDROID_TOOL_CLANG_VERS}")
@@ -239,6 +251,7 @@ endif()
 
 unset(_ANDROID_TOOL_NAME)
 unset(_ANDROID_TOOL_VERS)
+unset(_ANDROID_TOOL_VERS_NDK)
 unset(_ANDROID_TOOL_PREFIX)
 unset(_ANDROID_TOOL_CLANG_NAME)
 unset(_ANDROID_TOOL_CLANG_VERS)

+ 7 - 0
Modules/Platform/Android/Determine-Compiler-Standalone.cmake

@@ -22,6 +22,9 @@ endif()
 # Help CMakeFindBinUtils locate things.
 set(_CMAKE_TOOLCHAIN_PREFIX "${_ANDROID_TOOL_PREFIX}")
 
+# _ANDROID_TOOL_PREFIX should now match `gcc -dumpmachine`.
+string(REGEX REPLACE "-$" "" _ANDROID_TOOL_C_TOOLCHAIN_MACHINE "${_ANDROID_TOOL_PREFIX}")
+
 execute_process(
   COMMAND "${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/${_ANDROID_TOOL_PREFIX}gcc${_ANDROID_HOST_EXT}" -dumpversion
   OUTPUT_VARIABLE _gcc_version
@@ -42,6 +45,7 @@ endif()
 set(_ANDROID_TOOL_C_TOOLCHAIN_PREFIX "${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/${_ANDROID_TOOL_PREFIX}")
 set(_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX "${_ANDROID_HOST_EXT}")
 
+set(_ANDROID_TOOL_CXX_TOOLCHAIN_MACHINE "${_ANDROID_TOOL_C_TOOLCHAIN_MACHINE}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_VERSION "${_ANDROID_TOOL_C_TOOLCHAIN_VERSION}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_PREFIX "${_ANDROID_TOOL_C_TOOLCHAIN_PREFIX}")
 set(_ANDROID_TOOL_CXX_TOOLCHAIN_SUFFIX "${_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX}")
@@ -57,3 +61,6 @@ else()
   set(_ANDROID_TOOL_CXX_COMPILER "${_ANDROID_TOOL_CXX_TOOLCHAIN_PREFIX}g++${_ANDROID_TOOL_CXX_TOOLCHAIN_SUFFIX}")
   set(_ANDROID_TOOL_CXX_COMPILER_EXTERNAL_TOOLCHAIN "")
 endif()
+
+set(_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG "")
+set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")

+ 7 - 0
Modules/Platform/Android/Determine-Compiler.cmake

@@ -40,12 +40,16 @@ if(CMAKE_ANDROID_NDK)
 elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
   include(Platform/Android/Determine-Compiler-Standalone)
 else()
+  set(_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG "")
+  set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_C_COMPILER "")
+  set(_ANDROID_TOOL_C_TOOLCHAIN_MACHINE "")
   set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_C_COMPILER_EXTERNAL_TOOLCHAIN "")
   set(_ANDROID_TOOL_C_TOOLCHAIN_PREFIX "")
   set(_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX "")
   set(_ANDROID_TOOL_CXX_COMPILER "")
+  set(_ANDROID_TOOL_CXX_TOOLCHAIN_MACHINE "")
   set(_ANDROID_TOOL_CXX_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_CXX_COMPILER_EXTERNAL_TOOLCHAIN "")
   set(_ANDROID_TOOL_CXX_TOOLCHAIN_PREFIX "")
@@ -61,6 +65,9 @@ macro(__android_determine_compiler lang)
 
     # Save the Android-specific information in CMake${lang}Compiler.cmake.
     set(CMAKE_${lang}_COMPILER_CUSTOM_CODE "
+set(CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG \"${_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG}\")
+set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION \"${_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION}\")
+set(CMAKE_${lang}_ANDROID_TOOLCHAIN_MACHINE \"${_ANDROID_TOOL_${lang}_TOOLCHAIN_MACHINE}\")
 set(CMAKE_${lang}_ANDROID_TOOLCHAIN_VERSION \"${_ANDROID_TOOL_${lang}_TOOLCHAIN_VERSION}\")
 set(CMAKE_${lang}_COMPILER_EXTERNAL_TOOLCHAIN \"${_ANDROID_TOOL_${lang}_COMPILER_EXTERNAL_TOOLCHAIN}\")
 set(CMAKE_${lang}_ANDROID_TOOLCHAIN_PREFIX \"${_ANDROID_TOOL_${lang}_TOOLCHAIN_PREFIX}\")

+ 33 - 1
Tests/RunCMake/Android/common.cmake

@@ -22,8 +22,23 @@ string(APPEND CMAKE_CXX_FLAGS " -Werror -Wno-attributes")
 string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-no-undefined")
 
 if(CMAKE_ANDROID_NDK)
-  if(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "clang")
+  if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION)
+    message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is not set!")
+  elseif(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "^clang")
     add_definitions(-DCOMPILER_IS_CLANG)
+  elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "toolchains/[^/]+-${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}/prebuilt")
+    message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION is\n"
+      "  ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}\n"
+      "which does not appear in CMAKE_C_COMPILER:\n"
+      "  ${CMAKE_C_COMPILER}")
+  endif()
+  if(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG)
+    message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is not set!")
+  elseif(NOT "${CMAKE_C_COMPILER}" MATCHES "prebuilt/${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}/bin")
+    message(SEND_ERROR "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG is\n"
+      "  ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}\n"
+      "which does not appear in CMAKE_C_COMPILER:\n"
+      "  ${CMAKE_C_COMPILER}")
   endif()
 elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
   execute_process(
@@ -37,6 +52,23 @@ elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
   endif()
 endif()
 
+execute_process(
+  COMMAND "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" -dumpmachine
+  OUTPUT_VARIABLE _out OUTPUT_STRIP_TRAILING_WHITESPACE
+  ERROR_VARIABLE _err
+  RESULT_VARIABLE _res
+  )
+if(NOT _res EQUAL 0)
+  message(SEND_ERROR "Failed to run 'gcc -dumpmachine':\n ${_res}")
+endif()
+if(NOT _out STREQUAL "${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}")
+  message(SEND_ERROR "'gcc -dumpmachine' produced:\n"
+    " ${_out}\n"
+    "which is not equal to CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n"
+    " ${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}"
+    )
+endif()
+
 if(CMAKE_ANDROID_STL_TYPE STREQUAL "none")
   add_definitions(-DSTL_NONE)
 elseif(CMAKE_ANDROID_STL_TYPE STREQUAL "system")