mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-21 13:48:33 -05:00
cmGeneratorTarget: Include Cache now occurs per language+config
Previously only occurred per config which broke per-language system includes.
This commit is contained in:
@@ -1195,8 +1195,8 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(
|
|||||||
config_upper = cmSystemTools::UpperCase(config);
|
config_upper = cmSystemTools::UpperCase(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
using IncludeCacheType = std::map<std::string, std::vector<std::string>>;
|
std::string key = cmStrCat(config_upper, "/", language);
|
||||||
auto iter = this->SystemIncludesCache.find(config_upper);
|
auto iter = this->SystemIncludesCache.find(key);
|
||||||
|
|
||||||
if (iter == this->SystemIncludesCache.end()) {
|
if (iter == this->SystemIncludesCache.end()) {
|
||||||
cmGeneratorExpressionDAGChecker dagChecker(
|
cmGeneratorExpressionDAGChecker dagChecker(
|
||||||
@@ -1224,8 +1224,7 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(
|
|||||||
std::sort(result.begin(), result.end());
|
std::sort(result.begin(), result.end());
|
||||||
result.erase(std::unique(result.begin(), result.end()), result.end());
|
result.erase(std::unique(result.begin(), result.end()), result.end());
|
||||||
|
|
||||||
IncludeCacheType::value_type entry(config_upper, result);
|
iter = this->SystemIncludesCache.emplace(key, result).first;
|
||||||
iter = this->SystemIncludesCache.insert(entry).first;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::binary_search(iter->second.begin(), iter->second.end(), dir);
|
return std::binary_search(iter->second.begin(), iter->second.end(), dir);
|
||||||
|
|||||||
@@ -849,6 +849,8 @@ private:
|
|||||||
mutable std::set<std::string> VisitedConfigsForObjects;
|
mutable std::set<std::string> VisitedConfigsForObjects;
|
||||||
mutable std::map<cmSourceFile const*, std::string> Objects;
|
mutable std::map<cmSourceFile const*, std::string> Objects;
|
||||||
std::set<cmSourceFile const*> ExplicitObjectName;
|
std::set<cmSourceFile const*> ExplicitObjectName;
|
||||||
|
|
||||||
|
// "config/language" is the key
|
||||||
mutable std::map<std::string, std::vector<std::string>> SystemIncludesCache;
|
mutable std::map<std::string, std::vector<std::string>> SystemIncludesCache;
|
||||||
|
|
||||||
mutable std::string ExportMacro;
|
mutable std::string ExportMacro;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREA
|
|||||||
endif()
|
endif()
|
||||||
if (run_sys_includes_test)
|
if (run_sys_includes_test)
|
||||||
add_subdirectory(SystemIncludeDirectories)
|
add_subdirectory(SystemIncludeDirectories)
|
||||||
|
add_subdirectory(SystemIncludeDirectoriesPerLang)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.17 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(SystemIncludeDirectoriesPerLang)
|
||||||
|
|
||||||
|
add_library(c_interface INTERFACE)
|
||||||
|
set_target_properties(c_interface PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||||
|
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||||
|
)
|
||||||
|
target_compile_options(c_interface INTERFACE "$<$<COMPILE_LANG_AND_ID:C,GNU,Clang>:-Werror=unused-variable>")
|
||||||
|
|
||||||
|
add_library(cxx_interface INTERFACE)
|
||||||
|
set_target_properties(cxx_interface PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_system_include>"
|
||||||
|
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_system_include>"
|
||||||
|
)
|
||||||
|
target_compile_options(cxx_interface INTERFACE "$<$<COMPILE_LANG_AND_ID:CXX,GNU,Clang>:-Werror=unused-variable>")
|
||||||
|
|
||||||
|
# The C header must come before the C++ header for this test to smoke out the
|
||||||
|
# failure. The order of sources is how CMake determines the include cache
|
||||||
|
# and we need it to cache on the 'bad' language first
|
||||||
|
add_executable(consume_multi_lang_includes main.c smoke_out_includes.cxx)
|
||||||
|
target_link_libraries(consume_multi_lang_includes PRIVATE c_interface cxx_interface)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
// Generate a warning in here
|
||||||
|
|
||||||
|
int function_that_generates_warning(int x)
|
||||||
|
{
|
||||||
|
int y = x;
|
||||||
|
int z = 2;
|
||||||
|
y -= x;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
#include <header.h>
|
||||||
|
|
||||||
|
int empty_func()
|
||||||
|
{
|
||||||
|
return function_that_generates_warning(4);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user