From a8b7cbb787bfc3ebb139ecabac03be332cc7d6ff Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Thu, 28 Mar 2019 10:00:40 +0100 Subject: Autogen: Do not treat hard-coded -I/usr/include exclusion as implicit include The `cmLocalGenerator::GetIncludeDirectoriesImplicit` method is called by `cmQtAutoGenInitializer` to get the compiler's list of implicit include directories. Since commit 557b2d6e65 (Fix regression in -I/usr/include exclusion logic, 2019-02-13, v3.14.0-rc2~6^2~2) the method hard-codes exclusion of `/usr/include` for historical reasons. However, it should not be reported as a real implicit include directory unless the compiler really has it. Refactor the logic to distinguish the hard-coded exclusion of `/usr/include` from the real list of implicit include directories. Fixes: #19100 --- Source/cmLocalGenerator.cxx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 7e56818..7e15234 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -937,10 +937,8 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( // Implicit include directories std::vector implicitDirs; std::set implicitSet; - // Checks if this is not an implicit include directory - auto notImplicit = [&implicitSet](std::string const& dir) { - return (implicitSet.find(dir) == implicitSet.end()); - }; + // Include directories to be excluded as if they were implicit. + std::set implicitExclude; { // Raw list of implicit include directories // Start with "standard" directories that we unconditionally add below. @@ -978,7 +976,8 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( [](std::string const& d) { return cmHasLiteralSuffix(d, "/usr/include"); }) != impDirVec.end()) { - impDirVec.emplace_back("/usr/include"); + // Only exclude this hard coded path for backwards compatibility. + implicitExclude.emplace("/usr/include"); } for (std::string const& i : impDirVec) { @@ -988,6 +987,12 @@ std::vector> 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())); + }; + // Get the target-specific include directories. std::vector> userDirs = target->GetIncludeDirectories(config, lang); @@ -1004,7 +1009,7 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( cmSystemTools::ComparePath(udr.Value, topBinaryDir) || cmSystemTools::IsSubDirectory(udr.Value, topSourceDir) || cmSystemTools::IsSubDirectory(udr.Value, topBinaryDir)) { - if (notImplicit(udr.Value)) { + if (notExcluded(udr.Value)) { emitBT(udr); } } @@ -1013,7 +1018,7 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( // Emit remaining non implicit user direcories. for (BT const& udr : userDirs) { - if (notImplicit(udr.Value)) { + if (notExcluded(udr.Value)) { emitBT(udr); } } @@ -1032,7 +1037,7 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( if (!stripImplicitDirs) { // Append implicit directories that were requested by the user only for (BT const& udr : userDirs) { - if (!notImplicit(udr.Value)) { + if (implicitSet.find(udr.Value) != implicitSet.end()) { emitBT(udr); } } -- cgit v0.12