Browse Source

Merge branch 'android-ndk-r18' into release-3.12

Merge-request: !2319
Brad King 7 years ago
parent
commit
0e764082fe

+ 2 - 1
Help/variable/CMAKE_ANDROID_STL_TYPE.rst

@@ -30,7 +30,8 @@ set to specify the STL variant to be used.  The value may be one of:
 ``stlport_shared``
   STLport Shared
 
-The default value is ``gnustl_static``.  Note that this default differs from
+The default value is ``gnustl_static`` on NDK versions that provide it
+and otherwise ``c++_static``.  Note that this default differs from
 the native NDK build system because CMake may be used to build projects for
 Android that are not natively implemented for it and use the C++ standard
 library.

+ 3 - 1
Modules/Platform/Android-Common.cmake

@@ -32,8 +32,10 @@ if(CMAKE_ANDROID_NDK)
         )
     endif()
     unset(_ANDROID_STL_TYPE_FOUND)
-  else()
+  elseif(IS_DIRECTORY ${CMAKE_ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++)
     set(CMAKE_ANDROID_STL_TYPE "gnustl_static")
+  else()
+    set(CMAKE_ANDROID_STL_TYPE "c++_static")
   endif()
 
   unset(_ANDROID_STL_TYPES)

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

@@ -35,7 +35,18 @@ elseif(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION)
   endif()
   set(_ANDROID_TOOL_PATTERNS "*-${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}")
 else()
-  set(_ANDROID_TOOL_PATTERNS "*-[0-9].[0-9]")
+  # If we can find any gcc toolchains then use one by default.
+  # Otherwise we look for clang toolchains (e.g. NDK r18+).
+  file(GLOB _ANDROID_CONFIG_MKS_FOR_GCC
+    "${CMAKE_ANDROID_NDK}/build/core/toolchains/*-[0-9].[0-9]/config.mk"
+    "${CMAKE_ANDROID_NDK}/toolchains/*-[0-9].[0-9]/config.mk"
+    )
+  if(_ANDROID_CONFIG_MKS_FOR_GCC)
+    set(_ANDROID_TOOL_PATTERNS "*-[0-9].[0-9]")
+  else()
+    set(_ANDROID_TOOL_PATTERNS "*-clang")
+  endif()
+  unset(_ANDROID_CONFIG_MKS_FOR_GCC)
 endif()
 set(_ANDROID_CONFIG_MK_PATTERNS)
 foreach(base "build/core/toolchains" "toolchains")

+ 8 - 3
Tests/RunCMake/Android/RunCMakeTest.cmake

@@ -61,8 +61,12 @@ foreach(ndk IN LISTS TEST_ANDROID_NDK)
       list(APPEND _abis_${_version} ${_abis})
     endif()
   endforeach()
-  set(_abis_ ${_abis_${_latest_gcc}})
   set(_abis_clang ${_abis_${_latest_clang}})
+  if(_latest_gcc)
+    set(_abis_ ${_abis_${_latest_gcc}})
+  else()
+    set(_abis_ ${_abis_clang})
+  endif()
   if(_versions MATCHES "clang")
     set(_versions "clang" ${_versions})
   endif()
@@ -132,10 +136,11 @@ foreach(ndk IN LISTS TEST_ANDROID_NDK)
   set(stl_types
     none
     system
-    gnustl_static
-    gnustl_shared
     )
 
+  if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gnu-libstdc++")
+    list(APPEND stl_types gnustl_static gnustl_shared)
+  endif()
   if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gabi++/libs")
     list(APPEND stl_types gabi++_static gabi++_shared)
   endif()

+ 4 - 3
Tests/RunCMake/Android/common.cmake

@@ -8,7 +8,6 @@ endif()
 foreach(f
     "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}"
     "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}g++${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
-    "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}cpp${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
     "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
     "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ld${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}"
     )
@@ -61,10 +60,12 @@ execute_process(
 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}")
+string(REPLACE "--" "-" _out_check "${_out}")
+if(NOT _out_check STREQUAL "${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}"
+    AND NOT (_out STREQUAL "arm--linux-android" AND CMAKE_C_ANDROID_TOOLCHAIN_MACHINE STREQUAL "arm-linux-androideabi"))
   message(SEND_ERROR "'gcc -dumpmachine' produced:\n"
     " ${_out}\n"
-    "which is not equal to CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n"
+    "which does not match CMAKE_C_ANDROID_TOOLCHAIN_MACHINE:\n"
     " ${CMAKE_C_ANDROID_TOOLCHAIN_MACHINE}"
     )
 endif()