From 746906242d6e5aca50df621f12cfa0ad71816647 Mon Sep 17 00:00:00 2001 From: Haibo Huang Date: Fri, 26 Feb 2021 13:23:10 -0800 Subject: Android: Detect NDK version number Report it in `CMAKE_ANDROID_NDK_VERSION`. --- Modules/Platform/Android-Determine.cmake | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Modules/Platform/Android-Determine.cmake b/Modules/Platform/Android-Determine.cmake index c279086a5f..2d2cd5c72b 100644 --- a/Modules/Platform/Android-Determine.cmake +++ b/Modules/Platform/Android-Determine.cmake @@ -226,6 +226,44 @@ if(CMAKE_ANDROID_NDK) include("${CMAKE_ANDROID_NDK}/build/cmake/abis.cmake" OPTIONAL RESULT_VARIABLE _INCLUDED_ABIS) endif() +if(CMAKE_ANDROID_NDK AND EXISTS "${CMAKE_ANDROID_NDK}/source.properties") + # Android NDK revision + # Possible formats: + # * r16, build 1234: 16.0.1234 + # * r16b, build 1234: 16.1.1234 + # * r16 beta 1, build 1234: 16.0.1234-beta1 + # + # Canary builds are not specially marked. + file(READ "${CMAKE_ANDROID_NDK}/source.properties" _ANDROID_NDK_SOURCE_PROPERTIES) + + set(_ANDROID_NDK_REVISION_REGEX + "^Pkg\\.Desc = Android NDK\nPkg\\.Revision = ([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta([0-9]+))?") + if(NOT _ANDROID_NDK_SOURCE_PROPERTIES MATCHES "${_ANDROID_NDK_REVISION_REGEX}") + string(REPLACE "\n" "\n " _ANDROID_NDK_SOURCE_PROPERTIES "${_ANDROID_NDK_SOURCE_PROPERTIES}") + message(FATAL_ERROR + "Android: Failed to parse NDK revision from:\n" + " ${CMAKE_ANDROID_NDK}/source.properties\n" + "with content:\n" + " ${_ANDROID_NDK_SOURCE_PROPERTIES}") + endif() + + set(_ANDROID_NDK_MAJOR "${CMAKE_MATCH_1}") + set(_ANDROID_NDK_MINOR "${CMAKE_MATCH_2}") + set(_ANDROID_NDK_BUILD "${CMAKE_MATCH_3}") + set(_ANDROID_NDK_BETA "${CMAKE_MATCH_5}") + if(_ANDROID_NDK_BETA STREQUAL "") + set(_ANDROID_NDK_BETA "0") + endif() + set(CMAKE_ANDROID_NDK_VERSION "${_ANDROID_NDK_MAJOR}.${_ANDROID_NDK_MINOR}") + + unset(_ANDROID_NDK_SOURCE_PROPERTIES) + unset(_ANDROID_NDK_REVISION_REGEX) + unset(_ANDROID_NDK_MAJOR) + unset(_ANDROID_NDK_MINOR) + unset(_ANDROID_NDK_BUILD) + unset(_ANDROID_NDK_BETA) +endif() + if(CMAKE_ANDROID_NDK) # Identify the host platform. if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") @@ -523,6 +561,7 @@ if(CMAKE_ANDROID_NDK) string(APPEND CMAKE_SYSTEM_CUSTOM_CODE "set(CMAKE_ANDROID_ARCH_TRIPLE \"${CMAKE_ANDROID_ARCH_TRIPLE}\")\n" "set(CMAKE_ANDROID_ARCH_LLVM_TRIPLE \"${CMAKE_ANDROID_ARCH_LLVM_TRIPLE}\")\n" + "set(CMAKE_ANDROID_NDK_VERSION \"${CMAKE_ANDROID_NDK_VERSION}\")\n" "set(CMAKE_ANDROID_NDK_DEPRECATED_HEADERS \"${CMAKE_ANDROID_NDK_DEPRECATED_HEADERS}\")\n" "set(CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG \"${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}\")\n" "set(CMAKE_ANDROID_NDK_TOOLCHAIN_UNIFIED \"${CMAKE_ANDROID_NDK_TOOLCHAIN_UNIFIED}\")\n" -- cgit v1.2.1 From 4950d3573331678b58fef36524723579edaa7172 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Mar 2021 09:24:03 -0500 Subject: Help: Document CMAKE_ANDROID_NDK_VERSION variable --- Help/manual/cmake-toolchains.7.rst | 4 ++++ Help/manual/cmake-variables.7.rst | 1 + Help/release/3.20.rst | 3 +++ Help/variable/CMAKE_ANDROID_NDK_VERSION.rst | 8 ++++++++ 4 files changed, 16 insertions(+) create mode 100644 Help/variable/CMAKE_ANDROID_NDK_VERSION.rst diff --git a/Help/manual/cmake-toolchains.7.rst b/Help/manual/cmake-toolchains.7.rst index 0267ca3803..1ededee189 100644 --- a/Help/manual/cmake-toolchains.7.rst +++ b/Help/manual/cmake-toolchains.7.rst @@ -359,6 +359,10 @@ CMake uses the following steps to select one of the environments: * Else, an error diagnostic will be issued that neither the NDK or Standalone Toolchain can be found. +.. versionadded:: 3.20 + If an Android NDK is selected, its version number is reported + in the :variable:`CMAKE_ANDROID_NDK_VERSION` variable. + .. _`Cross Compiling for Android with the NDK`: Cross Compiling for Android with the NDK diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index b6764acdba..4317dd4071 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -278,6 +278,7 @@ Variables that Describe the System /variable/ANDROID /variable/APPLE /variable/BORLAND + /variable/CMAKE_ANDROID_NDK_VERSION /variable/CMAKE_CL_64 /variable/CMAKE_COMPILER_2005 /variable/CMAKE_HOST_APPLE diff --git a/Help/release/3.20.rst b/Help/release/3.20.rst index b36d1c2ae7..eede36278b 100644 --- a/Help/release/3.20.rst +++ b/Help/release/3.20.rst @@ -73,6 +73,9 @@ Platforms - The default :variable:`CMAKE_BUILD_TYPE` for Android is now ``RelWithDebInfo``. + - The :variable:`CMAKE_ANDROID_NDK_VERSION` variable was added to + report the version of the NDK. + File-Based API -------------- diff --git a/Help/variable/CMAKE_ANDROID_NDK_VERSION.rst b/Help/variable/CMAKE_ANDROID_NDK_VERSION.rst new file mode 100644 index 0000000000..5428d52bce --- /dev/null +++ b/Help/variable/CMAKE_ANDROID_NDK_VERSION.rst @@ -0,0 +1,8 @@ +CMAKE_ANDROID_NDK_VERSION +------------------------- + +.. versionadded:: 3.20 + +When :ref:`Cross Compiling for Android with the NDK` and using an +Android NDK version 11 or higher, this variable is provided by +CMake to report the NDK version number. -- cgit v1.2.1 From ed7a87f27055bd196d3f4af2468b935301fce727 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Mar 2021 10:20:29 -0500 Subject: Tests: Update RunCMake.Android for NDK r22 Use `CMAKE_ANDROID_NDK_VERSION` to check for files expected based on the version of the NDK. --- Tests/RunCMake/Android/common.cmake | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Tests/RunCMake/Android/common.cmake b/Tests/RunCMake/Android/common.cmake index 32412aa84b..7c80a0490f 100644 --- a/Tests/RunCMake/Android/common.cmake +++ b/Tests/RunCMake/Android/common.cmake @@ -5,10 +5,21 @@ if(NOT ANDROID) message(SEND_ERROR "CMake variable 'ANDROID' is not set to a true value.") endif() -foreach(f - "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" +set(files + "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ar${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" + ) +if(NOT CMAKE_ANDROID_NDK_VERSION VERSION_GREATER_EQUAL 22) + list(APPEND files "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}ld${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" ) +endif() +if(NOT CMAKE_ANDROID_NDK_VERSION VERSION_GREATER_EQUAL 19) + list(APPEND files + "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}gcc${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" + "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}g++${CMAKE_CXX_ANDROID_TOOLCHAIN_SUFFIX}" + ) +endif() +foreach(f IN LISTS files) if(NOT EXISTS "${f}") message(SEND_ERROR "Expected file does not exist:\n \"${f}\"") endif() -- cgit v1.2.1 From 005e2cdfb05d92e1b24df2d35ea10ac557b3d831 Mon Sep 17 00:00:00 2001 From: Haibo Huang Date: Fri, 26 Feb 2021 13:23:10 -0800 Subject: Android: Do not use gold for ndk >= r22 Fixes: #21772 --- Modules/Compiler/Clang.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake index 5862521cfc..9f93d4188b 100644 --- a/Modules/Compiler/Clang.cmake +++ b/Modules/Compiler/Clang.cmake @@ -77,7 +77,7 @@ else() set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto") endif() - if(ANDROID) + if(ANDROID AND NOT CMAKE_ANDROID_NDK_VERSION VERSION_GREATER_EQUAL "22") # https://github.com/android-ndk/ndk/issues/242 set(CMAKE_${lang}_LINK_OPTIONS_IPO "-fuse-ld=gold") endif() -- cgit v1.2.1