Browse Source

Merge topic 'fix-implicit-includes-fortran'

3dc81a48ff Fortran: Do not suppress explicit use of implicit include directories

Acked-by: Kitware Robot <[email protected]>
Acked-by: Michael Hirsch, Ph.D. <[email protected]>
Merge-request: !2994
Brad King 6 years ago
parent
commit
283b8c2ae6

+ 6 - 1
Help/variable/CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES.rst

@@ -6,4 +6,9 @@ Directories implicitly searched by the compiler for header files.
 CMake does not explicitly specify these directories on compiler
 command lines for language ``<LANG>``.  This prevents system include
 directories from being treated as user include directories on some
-compilers.
+compilers, which is important for ``C``, ``CXX``, and ``CUDA`` to
+avoid overriding standard library headers.
+
+This value is not used for ``Fortran`` because it has no standard
+library headers and some compilers do not search their implicit
+include directories for module ``.mod`` files.

+ 15 - 9
Source/cmLocalGenerator.cxx

@@ -944,15 +944,21 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
     std::vector<std::string> impDirVec = userStandardDirs;
 
     // 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)) {
-      size_t const impDirVecOldSize = impDirVec.size();
-      cmSystemTools::ExpandListArgument(value, impDirVec);
-      // FIXME: Use cmRange with 'advance()' when it supports non-const.
-      for (size_t i = impDirVecOldSize; i < impDirVec.size(); ++i) {
-        cmSystemTools::ConvertToUnixSlashes(impDirVec[i]);
+    // We ignore this for Fortran because:
+    // * There are no standard library headers to avoid overriding.
+    // * Compilers like gfortran do not search their own implicit include
+    //   directories for modules ('.mod' files).
+    if (lang != "Fortran") {
+      std::string key = "CMAKE_";
+      key += lang;
+      key += "_IMPLICIT_INCLUDE_DIRECTORIES";
+      if (const char* value = this->Makefile->GetDefinition(key)) {
+        size_t const impDirVecOldSize = impDirVec.size();
+        cmSystemTools::ExpandListArgument(value, impDirVec);
+        // FIXME: Use cmRange with 'advance()' when it supports non-const.
+        for (size_t i = impDirVecOldSize; i < impDirVec.size(); ++i) {
+          cmSystemTools::ConvertToUnixSlashes(impDirVec[i]);
+        }
       }
     }