From 1ee0ffab819d632d7570bee23a83807facbb45a2 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Fri, 20 Jan 2017 15:45:09 -0500
Subject: [PATCH] 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 8755d4f5e9..cf2785a97d 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()
+
+  # <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()
-- 
GitLab