Add a variable to specify language-wide system include directories

Create a `CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES` variable to specify
system include directories for for `<LANG>` compiler command lines.
This plays a role for include directories as the existing
`CMAKE_<LANG>_STANDARD_LIBRARIES` variable does for link libraries.
This commit is contained in:
Brad King 2016-05-24 11:39:25 -04:00
parent 4419909756
commit c13408279f
10 changed files with 66 additions and 0 deletions

View File

@ -365,6 +365,7 @@ Variables for Languages
/variable/CMAKE_LANG_SIMULATE_VERSION
/variable/CMAKE_LANG_SIZEOF_DATA_PTR
/variable/CMAKE_LANG_SOURCE_FILE_EXTENSIONS
/variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES
/variable/CMAKE_LANG_STANDARD_LIBRARIES
/variable/CMAKE_USER_MAKE_RULES_OVERRIDE_LANG

View File

@ -0,0 +1,6 @@
standard-include-directories
----------------------------
* A :variable:`CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES` variable was
added for use by toolchain files to specify system include directories
to be appended to all compiler command lines.

View File

@ -0,0 +1,14 @@
CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES
-----------------------------------------
Include directories to be used for every source file compiled with
the ``<LANG>`` compiler. This is meant for specification of system
include directories needed by the language for the current platform.
The directories always appear at the end of the include path passed
to the compiler.
This variable should not be set by project code. It is meant to be set by
CMake's platform information modules for the current toolchain, or by a
toolchain file when used with :variable:`CMAKE_TOOLCHAIN_FILE`.
See also :variable:`CMAKE_<LANG>_STANDARD_LIBRARIES`.

View File

@ -8,3 +8,5 @@ libraries needed by the language for the current platform.
This variable should not be set by project code. It is meant to be set by
CMake's platform information modules for the current toolchain, or by a
toolchain file when used with :variable:`CMAKE_TOOLCHAIN_FILE`.
See also :variable:`CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES`.

View File

@ -2415,6 +2415,18 @@ std::vector<std::string> cmGeneratorTarget::GetIncludeDirectories(
cmDeleteAll(linkInterfaceIncludeDirectoriesEntries);
// Add standard include directories for this language.
std::string const standardIncludesVar =
"CMAKE_" + lang + "_STANDARD_INCLUDE_DIRECTORIES";
std::string const standardIncludes =
this->Makefile->GetSafeDefinition(standardIncludesVar);
std::vector<std::string>::size_type const before = includes.size();
cmSystemTools::ExpandListArgument(standardIncludes, includes);
for (std::vector<std::string>::iterator i = includes.begin() + before;
i != includes.end(); ++i) {
cmSystemTools::ConvertToUnixSlashes(*i);
}
return includes;
}

View File

@ -1385,6 +1385,9 @@ cmGlobalGenerator::CreateQtAutoGeneratorsTargets()
void cmGlobalGenerator::FinalizeTargetCompileInfo()
{
std::vector<std::string> const langs =
this->CMakeInstance->GetState()->GetEnabledLanguages();
// Construct per-target generator information.
for (unsigned int i = 0; i < this->Makefiles.size(); ++i) {
cmMakefile* mf = this->Makefiles[i];
@ -1429,6 +1432,23 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo()
}
}
}
// The standard include directories for each language
// should be treated as system include directories.
std::set<std::string> standardIncludesSet;
for (std::vector<std::string>::const_iterator li = langs.begin();
li != langs.end(); ++li) {
std::string const standardIncludesVar =
"CMAKE_" + *li + "_STANDARD_INCLUDE_DIRECTORIES";
std::string const standardIncludesStr =
mf->GetSafeDefinition(standardIncludesVar);
std::vector<std::string> standardIncludesVec;
cmSystemTools::ExpandListArgument(standardIncludesStr,
standardIncludesVec);
standardIncludesSet.insert(standardIncludesVec.begin(),
standardIncludesVec.end());
}
mf->AddSystemIncludeDirectories(standardIncludesSet);
}
}

View File

@ -63,6 +63,7 @@ else()
PROPERTIES COMPILE_FLAGS "-ITarProp")
endif()
add_subdirectory(StandardIncludeDirectories)
add_subdirectory(TargetIncludeDirectories)
set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR}")

View File

@ -0,0 +1,5 @@
# Normally this variable should be set by a platform information module or
# a toolchain file, but for purposes of this test we simply set it here.
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/StdDir)
add_executable(StandardIncludeDirectories main.c)

View File

@ -0,0 +1,5 @@
#include "StdIncDir.h"
int main()
{
return 0;
}