Hi there, Apologies in advance if this is not the correct mailing list.
I'm working on a C++ project which has existing CMake files and works on Linux and Mac. I was attempting to build it on the Android NDK cross-compiling to ARM64, and ran into an issue. In particular, the toolchain determination for test compilation fails as follows: $HOME/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android --gcc-toolchain=$HOME/Android/Sdk/ndk-bundle/toolchains//prebuilt/linux-x86_64 --sysroot=$HOME/Android/Sdk/ndk-bundle/platforms/android-28/arch-arm64 -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=28 -fexceptions -g -fPIE -pie -Wl,--gc-sections CMakeFiles/cmTC_34db0.dir/testCCompiler.c.o -o cmTC_34db0 /usr/bin/ld: unrecognised emulation mode: aarch64linux The problem seems to be where --gcc-toolchain is set to: $HOME/Android/Sdk/ndk-bundle/toolchains//prebuilt/linux-x86_64 (note the double slash). On my installation of the NDK (r19c, Linux), the toolchain seems to be in: $HOME/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/ My android.toolchain.cmake file is as follows: set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_NDK $ENV{HOME}/Android/Sdk/ndk-bundle) set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang) set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) set(CMAKE_ANDROID_STL_TYPE c++_shared) I was able to get it to work by applying the small patch below: diff --git a/Modules/Platform/Android/Determine-Compiler-NDK.cmake b/Modules/Platform/Android/Determine-Compiler-NDK.cmake index 5f2cc524e5..c211bbceee 100644 --- a/Modules/Platform/Android/Determine-Compiler-NDK.cmake +++ b/Modules/Platform/Android/Determine-Compiler-NDK.cmake @@ -239,7 +239,7 @@ set(_ANDROID_TOOL_CXX_TOOLCHAIN_SUFFIX "${_ANDROID_TOOL_C_TOOLCHAIN_SUFFIX}") if(_ANDROID_TOOL_CLANG_NAME) message(STATUS "Android: Selected Clang toolchain '${_ANDROID_TOOL_CLANG_NAME}' with GCC toolchain '${_ANDROID_TOOL_NAME}'") set(_ANDROID_TOOL_C_COMPILER "${CMAKE_ANDROID_NDK}/toolchains/${_ANDROID_TOOL_LLVM_NAME}/prebuilt/${_ANDROID_HOST_DIR}/bin/clang${_ANDROID_HOST_EXT}") - set(_ANDROID_TOOL_C_COMPILER_EXTERNAL_TOOLCHAIN ${CMAKE_ANDROID_NDK}/toolchains/${_ANDROID_TOOL_NAME}/prebuilt/${_ANDROID_HOST_DIR}) + set(_ANDROID_TOOL_C_COMPILER_EXTERNAL_TOOLCHAIN ${CMAKE_ANDROID_NDK}/toolchains/${_ANDROID_TOOL_LLVM_NAME}/prebuilt/${_ANDROID_HOST_DIR}) set(_ANDROID_TOOL_CXX_COMPILER "${CMAKE_ANDROID_NDK}/toolchains/${_ANDROID_TOOL_LLVM_NAME}/prebuilt/${_ANDROID_HOST_DIR}/bin/clang++${_ANDROID_HOST_EXT}") set(_ANDROID_TOOL_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${_ANDROID_TOOL_C_COMPILER_EXTERNAL_TOOLCHAIN}") else() The reason seems to be that if ANDROID_TOOL_NAME contains -clang, it is set to the empty string on line 120 (CMake 10.13), so the external toolchain path contains an empty directory element (//). ANDROID_TOOL_LLVM_NAME contains "llvm", which is the correct string to make the above path correct on my installation. If I'm doing something wrong and there's a better way to do this which doesn't require patching CMake, please let me know. Thanks, Stephen
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake