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

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 година
родитељ
комит
283b8c2ae6
2 измењених фајлова са 21 додато и 10 уклоњено
  1. 6 1
      Help/variable/CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES.rst
  2. 15 9
      Source/cmLocalGenerator.cxx

+ 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
 CMake does not explicitly specify these directories on compiler
 command lines for language ``<LANG>``.  This prevents system include
 command lines for language ``<LANG>``.  This prevents system include
 directories from being treated as user include directories on some
 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;
     std::vector<std::string> impDirVec = userStandardDirs;
 
 
     // Load implicit include directories for this language.
     // 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]);
+        }
       }
       }
     }
     }