mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-16 14:08:35 +08:00
Fix regression in -I/usr/include exclusion logic
The change in commit 15ad830062
(Refactor exclusion of -I/usr/include to
avoid per-language values, 2019-01-21, v3.14.0-rc1~108^2~4) caused the
exclusion to apply to Fortran, but it was only meant for C, CXX, and
CUDA. The purpose of the change was to prepare for the value of
`CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES` to be computed from the
actual compiler instead of hard-coded. We need to preserve exclusion of
`-I/usr/include` if the compiler has any implicit include directory that
looks intended to replace it, e.g. `<sdk>/usr/include` on macOS.
Fixes: #18914
This commit is contained in:
@@ -63,11 +63,6 @@ list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
|
|||||||
/lib /lib32 /lib64 /usr/lib /usr/lib32 /usr/lib64
|
/lib /lib32 /lib64 /usr/lib /usr/lib32 /usr/lib64
|
||||||
)
|
)
|
||||||
|
|
||||||
# Platform-wide directories to avoid adding via -I<dir>.
|
|
||||||
list(APPEND CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES
|
|
||||||
/usr/include
|
|
||||||
)
|
|
||||||
|
|
||||||
# Default per-language values. These may be later replaced after
|
# Default per-language values. These may be later replaced after
|
||||||
# parsing the implicit directory information from compiler output.
|
# parsing the implicit directory information from compiler output.
|
||||||
set(_CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES_INIT
|
set(_CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES_INIT
|
||||||
|
@@ -939,12 +939,6 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
|
|||||||
// Raw list of implicit include directories
|
// Raw list of implicit include directories
|
||||||
std::vector<std::string> impDirVec;
|
std::vector<std::string> impDirVec;
|
||||||
|
|
||||||
// Get platform-wide implicit directories.
|
|
||||||
if (const char* implicitIncludes = (this->Makefile->GetDefinition(
|
|
||||||
"CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES"))) {
|
|
||||||
cmSystemTools::ExpandListArgument(implicitIncludes, impDirVec);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load implicit include directories for this language.
|
// Load implicit include directories for this language.
|
||||||
std::string key = "CMAKE_";
|
std::string key = "CMAKE_";
|
||||||
key += lang;
|
key += lang;
|
||||||
@@ -953,6 +947,22 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
|
|||||||
cmSystemTools::ExpandListArgument(value, impDirVec);
|
cmSystemTools::ExpandListArgument(value, impDirVec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The Platform/UnixPaths module used to hard-code /usr/include for C, CXX,
|
||||||
|
// and CUDA in CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES, but those
|
||||||
|
// variables are now computed. On macOS the /usr/include directory is
|
||||||
|
// inside the platform SDK so the computed value does not contain it
|
||||||
|
// directly. In this case adding -I/usr/include can hide SDK headers so we
|
||||||
|
// must still exclude it.
|
||||||
|
if ((lang == "C" || lang == "CXX" || lang == "CUDA") &&
|
||||||
|
std::find(impDirVec.begin(), impDirVec.end(), "/usr/include") ==
|
||||||
|
impDirVec.end() &&
|
||||||
|
std::find_if(impDirVec.begin(), impDirVec.end(),
|
||||||
|
[](std::string const& d) {
|
||||||
|
return cmHasLiteralSuffix(d, "/usr/include");
|
||||||
|
}) != impDirVec.end()) {
|
||||||
|
impDirVec.emplace_back("/usr/include");
|
||||||
|
}
|
||||||
|
|
||||||
for (std::string const& i : impDirVec) {
|
for (std::string const& i : impDirVec) {
|
||||||
std::string imd = rootPath + i;
|
std::string imd = rootPath + i;
|
||||||
cmSystemTools::ConvertToUnixSlashes(imd);
|
cmSystemTools::ConvertToUnixSlashes(imd);
|
||||||
|
Reference in New Issue
Block a user