From 15ad8300621eaf9fe23cda30368f90b420505d43 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Mon, 21 Jan 2019 11:09:32 -0500
Subject: Refactor exclusion of -I/usr/include to avoid per-language values

Add a `CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES` to contain the
hard-coded list of paths to be excluded from `-I` arguments so that the
values remain excluded even if the per-language
`CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES` variants change.

This is needed to preserve our historical exclusion of `-I/usr/include`
even when it is not a real implicit include directory.  A policy may be
needed to remove it later.
---
 Modules/Platform/UnixPaths.cmake |  7 +++++++
 Source/cmLocalGenerator.cxx      | 24 ++++++++++++++++--------
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/Modules/Platform/UnixPaths.cmake b/Modules/Platform/UnixPaths.cmake
index 328d3c6..fc22fce 100644
--- a/Modules/Platform/UnixPaths.cmake
+++ b/Modules/Platform/UnixPaths.cmake
@@ -63,6 +63,13 @@ list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
   /lib /lib32 /lib64 /usr/lib /usr/lib32 /usr/lib64
   )
 
+# Platform-wide directories to avoid adding via -I<dir>.
+list(APPEND CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES
+  /usr/include
+  )
+
+# Default per-language values.  These may be later replaced after
+# parsing the implicit link directories from compiler output.
 list(APPEND CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES
   /usr/include
   )
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 797add9..54f1c7f 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -947,21 +947,29 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectories(
       rootPath = this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
     }
 
+    std::vector<std::string> impDirVec;
+
+    // Get platform-wide implicit directories.
+    if (const char* implicitIncludes = (this->Makefile->GetDefinition(
+          "CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES"))) {
+      cmSystemTools::ExpandListArgument(implicitIncludes, impDirVec);
+    }
+
     // Load implicit include directories for this language.
     std::string key = "CMAKE_";
     key += lang;
     key += "_IMPLICIT_INCLUDE_DIRECTORIES";
     if (const char* value = this->Makefile->GetDefinition(key)) {
-      std::vector<std::string> impDirVec;
       cmSystemTools::ExpandListArgument(value, impDirVec);
-      for (std::string const& i : impDirVec) {
-        {
-          std::string d = rootPath + i;
-          cmSystemTools::ConvertToUnixSlashes(d);
-          emitted.insert(std::move(d));
-        }
-        implicitDirs.push_back(i);
+    }
+
+    for (std::string const& i : impDirVec) {
+      {
+        std::string d = rootPath + i;
+        cmSystemTools::ConvertToUnixSlashes(d);
+        emitted.insert(std::move(d));
       }
+      implicitDirs.push_back(i);
     }
   }
 
-- 
cgit v0.12