Order SYSTEM include directories after non-system directories

An effect of the `-isystem` flag is to search the directory after those
specified via `-I` flags.  Make behavior more consistent on compilers
that do not have any `-isystem` flag by explicitly moving system include
directories to the end.
This commit is contained in:
Ephi Sinowitz
2018-04-13 07:58:47 -04:00
committed by Brad King
parent fe0082875a
commit 76ad2ecb50
7 changed files with 40 additions and 1 deletions
+22 -1
View File
@@ -202,6 +202,22 @@ void cmLocalGenerator::ComputeObjectMaxPath()
this->ObjectMaxPathViolations.clear();
}
void cmLocalGenerator::MoveSystemIncludesToEnd(
std::vector<std::string>& includeDirs, const std::string& config,
const std::string& lang, const cmGeneratorTarget* target) const
{
if (!target) {
return;
}
std::stable_sort(
includeDirs.begin(), includeDirs.end(),
[&target, &config, &lang](std::string const& a, std::string const& b) {
return !target->IsSystemIncludeDirectory(a, config, lang) &&
target->IsSystemIncludeDirectory(b, config, lang);
});
}
void cmLocalGenerator::TraceDependencies()
{
std::vector<std::string> configs;
@@ -651,7 +667,7 @@ std::string cmLocalGenerator::ConvertToIncludeReference(
}
std::string cmLocalGenerator::GetIncludeFlags(
const std::vector<std::string>& includes, cmGeneratorTarget* target,
const std::vector<std::string>& includeDirs, cmGeneratorTarget* target,
const std::string& lang, bool forceFullPaths, bool forResponseFile,
const std::string& config)
{
@@ -659,6 +675,9 @@ std::string cmLocalGenerator::GetIncludeFlags(
return "";
}
std::vector<std::string> includes = includeDirs;
this->MoveSystemIncludesToEnd(includes, config, lang, target);
OutputFormat shellFormat = forResponseFile ? RESPONSE : SHELL;
std::ostringstream includeFlags;
@@ -924,6 +943,8 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
}
}
this->MoveSystemIncludesToEnd(dirs, config, lang, target);
// Add standard include directories for this language.
// We do not filter out implicit directories here.
std::string const standardIncludesVar =