diff options
author | Brad King <brad.king@kitware.com> | 2019-05-30 13:27:17 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-05-30 13:27:17 (GMT) |
commit | 540a175d2059e59fc0c5c8b8d5812c89639b27e3 (patch) | |
tree | f81588c7279b977b6547e3d5284da91a8fd0244e /Source | |
parent | f07d42632bd4f29eda871de12ebb5f03f9d4edda (diff) | |
parent | 2d0b0e2b9d50aa14ccf345c727b2da73dfba9bd6 (diff) | |
download | CMake-540a175d2059e59fc0c5c8b8d5812c89639b27e3.zip CMake-540a175d2059e59fc0c5c8b8d5812c89639b27e3.tar.gz CMake-540a175d2059e59fc0c5c8b8d5812c89639b27e3.tar.bz2 |
Merge branch 'implicit-includes-CPATH' into release-3.14
Merge-request: !3395
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmLocalGenerator.cxx | 28 | ||||
-rw-r--r-- | Source/cmLocalGenerator.h | 2 |
2 files changed, 27 insertions, 3 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 7e15234..f6962d1 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -88,6 +88,19 @@ cmLocalGenerator::cmLocalGenerator(cmGlobalGenerator* gg, cmMakefile* makefile) this->ComputeObjectMaxPath(); + // Canonicalize entries of the CPATH environment variable the same + // way detection of CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES does. + { + std::vector<std::string> cpath; + cmSystemTools::GetPath(cpath, "CPATH"); + for (std::string& cp : cpath) { + if (cmSystemTools::FileIsFullPath(cp)) { + cp = cmSystemTools::CollapseFullPath(cp); + this->EnvCPATH.emplace(std::move(cp)); + } + } + } + std::vector<std::string> enabledLanguages = this->GetState()->GetEnabledLanguages(); @@ -988,9 +1001,18 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit( } // Checks if this is not an excluded (implicit) include directory. - auto notExcluded = [&implicitSet, &implicitExclude](std::string const& dir) { - return ((implicitSet.find(dir) == implicitSet.end()) && - (implicitExclude.find(dir) == implicitExclude.end())); + auto notExcluded = [this, &implicitSet, &implicitExclude, + &lang](std::string const& dir) { + return ( + // Do not exclude directories that are not in an excluded set. + ((implicitSet.find(dir) == implicitSet.end()) && + (implicitExclude.find(dir) == implicitExclude.end())) + // Do not exclude entries of the CPATH environment variable even though + // they are implicitly searched by the compiler. They are meant to be + // user-specified directories that can be re-ordered or converted to + // -isystem without breaking real compiler builtin headers. + || ((lang == "C" || lang == "CXX") && + (this->EnvCPATH.find(dir) != this->EnvCPATH.end()))); }; // Get the target-specific include directories. diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index f9839f6..9521ec5 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -429,6 +429,8 @@ protected: std::string::size_type ObjectPathMax; std::set<std::string> ObjectMaxPathViolations; + std::set<std::string> EnvCPATH; + typedef std::unordered_map<std::string, cmGeneratorTarget*> GeneratorTargetMap; GeneratorTargetMap GeneratorTargetSearchIndex; |