From 1806e011cb2608c7ef62f345661dd35a899eb81c Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 20 Jan 2017 15:39:27 -0500 Subject: Android: Fix c++_{static,shared} support include directory order The NDK's own build files: /build/tools/build-cxx-stl.sh /build/cmake/android.toolchain.cmake for the `c++_static` and `c++_shared` build types add the `/sources/android/support/include` include directory between the two `/sources/cxx-stl/llvm-libc++*` directories. Re-order our own include directory generation to match. Issue: #16536 --- Modules/Platform/Android/ndk-stl-c++.cmake | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/Platform/Android/ndk-stl-c++.cmake b/Modules/Platform/Android/ndk-stl-c++.cmake index b27015d..a12411c 100644 --- a/Modules/Platform/Android/ndk-stl-c++.cmake +++ b/Modules/Platform/Android/ndk-stl-c++.cmake @@ -6,16 +6,15 @@ macro(__android_stl_cxx lang filename) if(EXISTS "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef") # r12 and below __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libcxx/include" 1) + __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/android/support/include" 0) __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++abi/libcxxabi/include" 1) else() # r13 and above __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/include" 1) + __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/android/support/include" 0) __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++abi/include" 1) endif() - # Add a secondary include directory if it exists. - __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/android/support/include" 0) - # Add the library file. __android_stl_lib(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/${CMAKE_ANDROID_ARCH_ABI}/${filename}" 1) endmacro() -- cgit v0.12 From 1ee0ffab819d632d7570bee23a83807facbb45a2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 20 Jan 2017 15:45:09 -0500 Subject: Android: Pass sysroot include directory explicitly The NDK's `build/core/definitions.mk` file adds compiler flags: -isystem $$(call host-path,$$(SYSROOT_INC)/usr/include) This passes the system include directory explicitly even though it is implied by `--sysroot=`. The explicit flag places the directory earlier in the include path than the sysroot-default one would be. Teach CMake to add this include directory at the end of the standard include path for Android. Otherwise the toolchain's `include-fixed/` directory may replace system headers with "fixed" copies that are not from the same API version. Closes: #16536 --- Modules/Platform/Android-Common.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Modules/Platform/Android-Common.cmake b/Modules/Platform/Android-Common.cmake index 8755d4f..cf2785a 100644 --- a/Modules/Platform/Android-Common.cmake +++ b/Modules/Platform/Android-Common.cmake @@ -149,4 +149,13 @@ macro(__android_compiler_common lang) if("x${lang}" STREQUAL "xCXX") __android_stl(CXX) endif() + + # /build/core/definitions.mk appends the sysroot's include directory + # explicitly at the end of the command-line include path so that it + # precedes the toolchain's builtin include directories. This is + # necessary so that Android API-version-specific headers are preferred + # over those in the toolchain's `include-fixed` directory (which cannot + # possibly match all versions). + list(APPEND CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES "${CMAKE_SYSROOT}/usr/include") + list(REMOVE_ITEM CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include") endmacro() -- cgit v0.12