Android: Add support for NDK r17

The `armeabi` ABI is no longer available, so we can no longer use it by
default unconditionally.  Instead detect all available ABIs and choose
the oldest arm ABI that is available.

Also update the test suite to account for the lack of `armeabi` support
and pass as of Android NDK r17-beta2.
This commit is contained in:
Brad King
2018-04-17 10:42:19 -04:00
parent 12139ad009
commit da294a039d
3 changed files with 43 additions and 8 deletions

View File

@@ -261,7 +261,40 @@ if(NOT CMAKE_ANDROID_ARCH_ABI)
else()
# https://developer.android.com/ndk/guides/application_mk.html
# Default is the oldest ARM ABI.
set(CMAKE_ANDROID_ARCH_ABI "armeabi")
# Lookup the available ABIs among all toolchains.
set(_ANDROID_ABIS "")
file(GLOB _ANDROID_CONFIG_MKS
"${CMAKE_ANDROID_NDK}/build/core/toolchains/*/config.mk"
"${CMAKE_ANDROID_NDK}/toolchains/*/config.mk"
)
foreach(config_mk IN LISTS _ANDROID_CONFIG_MKS)
file(STRINGS "${config_mk}" _ANDROID_TOOL_ABIS REGEX "^TOOLCHAIN_ABIS :=")
string(REPLACE "TOOLCHAIN_ABIS :=" "" _ANDROID_TOOL_ABIS "${_ANDROID_TOOL_ABIS}")
separate_arguments(_ANDROID_TOOL_ABIS UNIX_COMMAND "${_ANDROID_TOOL_ABIS}")
list(APPEND _ANDROID_ABIS ${_ANDROID_TOOL_ABIS})
unset(_ANDROID_TOOL_ABIS)
endforeach()
unset(_ANDROID_CONFIG_MKS)
# Choose the oldest among the available arm ABIs.
if(_ANDROID_ABIS)
list(REMOVE_DUPLICATES _ANDROID_ABIS)
cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW)
foreach(abi armeabi armeabi-v7a arm64-v8a)
if("${abi}" IN_LIST _ANDROID_ABIS)
set(CMAKE_ANDROID_ARCH_ABI "${abi}")
break()
endif()
endforeach()
cmake_policy(POP)
endif()
unset(_ANDROID_ABIS)
if(NOT CMAKE_ANDROID_ARCH_ABI)
set(CMAKE_ANDROID_ARCH_ABI "armeabi")
endif()
endif()
endif()
set(CMAKE_ANDROID_ARCH "${_ANDROID_ABI_${CMAKE_ANDROID_ARCH_ABI}_ARCH}")

View File

@@ -88,12 +88,14 @@ foreach(ndk IN LISTS TEST_ANDROID_NDK)
-DCMAKE_ANDROID_ARM_MODE=0
)
run_cmake(ndk-badarm)
set(RunCMake_TEST_OPTIONS
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_NDK=${ndk}
-DCMAKE_ANDROID_ARM_NEON=0
)
run_cmake(ndk-badneon)
if("armeabi" IN_LIST _abis_)
set(RunCMake_TEST_OPTIONS
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_NDK=${ndk}
-DCMAKE_ANDROID_ARM_NEON=0
)
run_cmake(ndk-badneon)
endif()
set(RunCMake_TEST_OPTIONS
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_NDK=${ndk}

View File

@@ -1,5 +1,5 @@
^CMake Error at .*/Modules/Platform/Android/Determine-Compiler-NDK.cmake:[0-9]+ \(message\):
Android: No toolchain for ABI 'armeabi' found in the NDK:
Android: No toolchain for ABI 'armeabi(-v7a)?' found in the NDK:
.*