Преглед изворни кода

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
Brad King пре 9 година
родитељ
комит
1ee0ffab81
1 измењених фајлова са 9 додато и 0 уклоњено
  1. 9 0
      Modules/Platform/Android-Common.cmake

+ 9 - 0
Modules/Platform/Android-Common.cmake

@@ -149,4 +149,13 @@ macro(__android_compiler_common lang)
   if("x${lang}" STREQUAL "xCXX")
     __android_stl(CXX)
   endif()
+
+  # <ndk>/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()