From a896043bacdd0cb2597fa10074302ed8a9a5e138 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 24 May 2016 09:37:09 -0400 Subject: [PATCH 1/3] GHS: Compute include directories consistently with other generators All generators use cmLocalGenerator::GetIncludeDirectories to construct the final list of include directories for a target. --- Source/cmGhsMultiTargetGenerator.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/cmGhsMultiTargetGenerator.cxx b/Source/cmGhsMultiTargetGenerator.cxx index 5e13d4cadf..8565fdb9c0 100644 --- a/Source/cmGhsMultiTargetGenerator.cxx +++ b/Source/cmGhsMultiTargetGenerator.cxx @@ -322,8 +322,10 @@ void cmGhsMultiTargetGenerator::WriteCompilerDefinitions( void cmGhsMultiTargetGenerator::WriteIncludes(const std::string& config, const std::string& language) { - std::vector includes = - this->GeneratorTarget->GetIncludeDirectories(config, language); + std::vector includes; + this->LocalGenerator->GetIncludeDirectories(includes, this->GeneratorTarget, + language, config); + for (std::vector::const_iterator includes_i = includes.begin(); includes_i != includes.end(); ++includes_i) { *this->GetFolderBuildStreams() << " -I\"" << *includes_i << "\"" From 4419909756751170d6fd4248b205c96767220dee Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 24 May 2016 11:38:18 -0400 Subject: [PATCH 2/3] cmMakefile: Optimize AddSystemIncludeDirectories for empty set Do not bother looping over all targets if we have no system include directories to add anyway. --- Source/cmMakefile.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 7e99f2c2de..e684689f0f 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1574,6 +1574,10 @@ void cmMakefile::AddIncludeDirectories(const std::vector& incs, void cmMakefile::AddSystemIncludeDirectories(const std::set& incs) { + if (incs.empty()) { + return; + } + this->SystemIncludeDirectories.insert(incs.begin(), incs.end()); for (cmTargets::iterator l = this->Targets.begin(); l != this->Targets.end(); From c13408279f035c8261b530e26040cf4b8f01fdab Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 24 May 2016 11:39:25 -0400 Subject: [PATCH 3/3] Add a variable to specify language-wide system include directories Create a `CMAKE__STANDARD_INCLUDE_DIRECTORIES` variable to specify system include directories for for `` compiler command lines. This plays a role for include directories as the existing `CMAKE__STANDARD_LIBRARIES` variable does for link libraries. --- Help/manual/cmake-variables.7.rst | 1 + .../dev/standard-include-directories.rst | 6 ++++++ ...MAKE_LANG_STANDARD_INCLUDE_DIRECTORIES.rst | 14 +++++++++++++ .../CMAKE_LANG_STANDARD_LIBRARIES.rst | 2 ++ Source/cmGeneratorTarget.cxx | 12 +++++++++++ Source/cmGlobalGenerator.cxx | 20 +++++++++++++++++++ Tests/IncludeDirectories/CMakeLists.txt | 1 + .../StandardIncludeDirectories/CMakeLists.txt | 5 +++++ .../StdDir/StdIncDir.h | 0 .../StandardIncludeDirectories/main.c | 5 +++++ 10 files changed, 66 insertions(+) create mode 100644 Help/release/dev/standard-include-directories.rst create mode 100644 Help/variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES.rst create mode 100644 Tests/IncludeDirectories/StandardIncludeDirectories/CMakeLists.txt create mode 100644 Tests/IncludeDirectories/StandardIncludeDirectories/StdDir/StdIncDir.h create mode 100644 Tests/IncludeDirectories/StandardIncludeDirectories/main.c diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 925b70cf98..b8c8bea86d 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -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 diff --git a/Help/release/dev/standard-include-directories.rst b/Help/release/dev/standard-include-directories.rst new file mode 100644 index 0000000000..a03d7dbfc5 --- /dev/null +++ b/Help/release/dev/standard-include-directories.rst @@ -0,0 +1,6 @@ +standard-include-directories +---------------------------- + +* A :variable:`CMAKE__STANDARD_INCLUDE_DIRECTORIES` variable was + added for use by toolchain files to specify system include directories + to be appended to all compiler command lines. diff --git a/Help/variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES.rst b/Help/variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES.rst new file mode 100644 index 0000000000..c8e3d578c5 --- /dev/null +++ b/Help/variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES.rst @@ -0,0 +1,14 @@ +CMAKE__STANDARD_INCLUDE_DIRECTORIES +----------------------------------------- + +Include directories to be used for every source file compiled with +the ```` 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__STANDARD_LIBRARIES`. diff --git a/Help/variable/CMAKE_LANG_STANDARD_LIBRARIES.rst b/Help/variable/CMAKE_LANG_STANDARD_LIBRARIES.rst index ad3b911053..ba6df933ab 100644 --- a/Help/variable/CMAKE_LANG_STANDARD_LIBRARIES.rst +++ b/Help/variable/CMAKE_LANG_STANDARD_LIBRARIES.rst @@ -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__STANDARD_INCLUDE_DIRECTORIES`. diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 31fff9f298..8859172442 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2415,6 +2415,18 @@ std::vector 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::size_type const before = includes.size(); + cmSystemTools::ExpandListArgument(standardIncludes, includes); + for (std::vector::iterator i = includes.begin() + before; + i != includes.end(); ++i) { + cmSystemTools::ConvertToUnixSlashes(*i); + } + return includes; } diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 3f4c22f60b..ea2842f416 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1385,6 +1385,9 @@ cmGlobalGenerator::CreateQtAutoGeneratorsTargets() void cmGlobalGenerator::FinalizeTargetCompileInfo() { + std::vector 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 standardIncludesSet; + for (std::vector::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 standardIncludesVec; + cmSystemTools::ExpandListArgument(standardIncludesStr, + standardIncludesVec); + standardIncludesSet.insert(standardIncludesVec.begin(), + standardIncludesVec.end()); + } + mf->AddSystemIncludeDirectories(standardIncludesSet); } } diff --git a/Tests/IncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/CMakeLists.txt index 9ee195714c..523c4f71c5 100644 --- a/Tests/IncludeDirectories/CMakeLists.txt +++ b/Tests/IncludeDirectories/CMakeLists.txt @@ -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}") diff --git a/Tests/IncludeDirectories/StandardIncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/StandardIncludeDirectories/CMakeLists.txt new file mode 100644 index 0000000000..dcbc56696b --- /dev/null +++ b/Tests/IncludeDirectories/StandardIncludeDirectories/CMakeLists.txt @@ -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) diff --git a/Tests/IncludeDirectories/StandardIncludeDirectories/StdDir/StdIncDir.h b/Tests/IncludeDirectories/StandardIncludeDirectories/StdDir/StdIncDir.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Tests/IncludeDirectories/StandardIncludeDirectories/main.c b/Tests/IncludeDirectories/StandardIncludeDirectories/main.c new file mode 100644 index 0000000000..edfe9ceac3 --- /dev/null +++ b/Tests/IncludeDirectories/StandardIncludeDirectories/main.c @@ -0,0 +1,5 @@ +#include "StdIncDir.h" +int main() +{ + return 0; +}