浏览代码

Android: Add CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG variable

The NDK provides prebuilt toolchain files in directories named for the
host architecture.  The NDK build system calls this `HOST_TAG`.
Expose the value publicly for use by clients that need to pass it
to external tools.

Suggested-by: Ruslan Baratov <[email protected]>
Brad King 9 年之前
父节点
当前提交
d95e6dff3c

+ 1 - 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_DEPENDENCIES
    /variable/CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES
    /variable/CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES
    /variable/CMAKE_ANDROID_NDK
    /variable/CMAKE_ANDROID_NDK
+   /variable/CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG
    /variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION
    /variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION
    /variable/CMAKE_ANDROID_PROCESS_MAX
    /variable/CMAKE_ANDROID_PROCESS_MAX
    /variable/CMAKE_ANDROID_PROGUARD
    /variable/CMAKE_ANDROID_PROGUARD

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

@@ -4,3 +4,8 @@ android-info-variables
 * When :ref:`Cross Compiling for Android with the NDK`, the
 * When :ref:`Cross Compiling for Android with the NDK`, the
   :variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION` variable is
   :variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION` variable is
   now set by CMake if it is not set by the user or toolchain file.
   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.

+ 1 - 0
Modules/Platform/Android/Determine-Compiler-NDK.cmake

@@ -210,6 +210,7 @@ endif()
 # Help CMakeFindBinUtils locate things.
 # Help CMakeFindBinUtils locate things.
 set(_CMAKE_TOOLCHAIN_PREFIX "${_ANDROID_TOOL_PREFIX}")
 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}")
 set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "${_ANDROID_TOOL_VERS_NDK}")
 
 
 set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "${_ANDROID_TOOL_VERS}")
 set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "${_ANDROID_TOOL_VERS}")

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

@@ -58,4 +58,5 @@ else()
   set(_ANDROID_TOOL_CXX_COMPILER_EXTERNAL_TOOLCHAIN "")
   set(_ANDROID_TOOL_CXX_COMPILER_EXTERNAL_TOOLCHAIN "")
 endif()
 endif()
 
 
+set(_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG "")
 set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")
 set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")

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

@@ -40,6 +40,7 @@ if(CMAKE_ANDROID_NDK)
 elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
 elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
   include(Platform/Android/Determine-Compiler-Standalone)
   include(Platform/Android/Determine-Compiler-Standalone)
 else()
 else()
+  set(_ANDROID_TOOL_NDK_TOOLCHAIN_HOST_TAG "")
   set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_C_COMPILER "")
   set(_ANDROID_TOOL_C_COMPILER "")
   set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "")
   set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "")
@@ -62,6 +63,7 @@ macro(__android_determine_compiler lang)
 
 
     # Save the Android-specific information in CMake${lang}Compiler.cmake.
     # Save the Android-specific information in CMake${lang}Compiler.cmake.
     set(CMAKE_${lang}_COMPILER_CUSTOM_CODE "
     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_ANDROID_NDK_TOOLCHAIN_VERSION \"${_ANDROID_TOOL_NDK_TOOLCHAIN_VERSION}\")
 set(CMAKE_${lang}_ANDROID_TOOLCHAIN_VERSION \"${_ANDROID_TOOL_${lang}_TOOLCHAIN_VERSION}\")
 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}_COMPILER_EXTERNAL_TOOLCHAIN \"${_ANDROID_TOOL_${lang}_COMPILER_EXTERNAL_TOOLCHAIN}\")

+ 8 - 0
Tests/RunCMake/Android/common.cmake

@@ -32,6 +32,14 @@ if(CMAKE_ANDROID_NDK)
       "which does not appear in CMAKE_C_COMPILER:\n"
       "which does not appear in CMAKE_C_COMPILER:\n"
       "  ${CMAKE_C_COMPILER}")
       "  ${CMAKE_C_COMPILER}")
   endif()
   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)
 elseif(CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
   execute_process(
   execute_process(
     COMMAND ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/clang --version
     COMMAND ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/clang --version