diff options
author | Brad King <brad.king@kitware.com> | 2019-10-16 13:23:23 -0400 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-10-17 10:29:31 -0400 |
commit | 797689ab35c6f1edc37b120804e348b03ce7b161 (patch) | |
tree | 45f9980d83280112e450ec768efd9d589933451b | |
parent | 0b10b3ed6b3ee644a44414d8b5c205d94a967c12 (diff) | |
download | cmake-797689ab35c6f1edc37b120804e348b03ce7b161.tar.gz |
PCH: Fix Makefile dependencies to rebuild PCH on header changes
Teach the Makefile generator to scan the implicit dependencies of PCH
creation. When a header named by `target_precompile_headers` changes
the corresponding PCH must be rebuilt and all consumers recompiled.
Fixes: #19830
-rw-r--r-- | Source/cmMakefileTargetGenerator.cxx | 6 | ||||
-rw-r--r-- | Tests/BuildDepends/CMakeLists.txt | 16 | ||||
-rw-r--r-- | Tests/BuildDepends/Project/CMakeLists.txt | 6 | ||||
-rw-r--r-- | Tests/BuildDepends/Project/zot.cxx | 5 | ||||
-rw-r--r-- | Tests/BuildDepends/Project/zot_pch.cxx | 6 |
5 files changed, 34 insertions, 5 deletions
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index e252dcd775..767f4e0aa8 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -458,10 +458,14 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles( const std::string pchSource = this->GeneratorTarget->GetPchSource(config, lang); if (!pchSource.empty() && !source.GetProperty("SKIP_PRECOMPILE_HEADERS")) { - depends.push_back(this->GeneratorTarget->GetPchHeader(config, lang)); + std::string const& pchHeader = + this->GeneratorTarget->GetPchHeader(config, lang); + depends.push_back(pchHeader); if (source.GetFullPath() != pchSource) { depends.push_back(this->GeneratorTarget->GetPchFile(config, lang)); } + this->LocalGenerator->AddImplicitDepends(this->GeneratorTarget, lang, + objFullPath, pchHeader); } std::string relativeObj = diff --git a/Tests/BuildDepends/CMakeLists.txt b/Tests/BuildDepends/CMakeLists.txt index 39a5131fed..c1ad17cd35 100644 --- a/Tests/BuildDepends/CMakeLists.txt +++ b/Tests/BuildDepends/CMakeLists.txt @@ -62,6 +62,12 @@ file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_macro_dir.hxx "static const char* zot_macro_dir = \"zot_macro_dir\";\n") file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_macro_tgt.hxx "static const char* zot_macro_tgt = \"zot_macro_tgt\";\n") +file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_pch.hxx + "#ifndef ZOT_PCH_HXX\n" + "#define ZOT_PCH_HXX\n" + "static const char* zot_pch = \"zot_pch\";\n" + "#endif\n" + ) file(WRITE ${BuildDepends_BINARY_DIR}/Project/link_depends_no_shared_lib.h "#define link_depends_no_shared_lib_value 1\n") @@ -155,7 +161,7 @@ execute_process(COMMAND ${zot} OUTPUT_VARIABLE out RESULT_VARIABLE runResult) string(REGEX REPLACE "[\r\n]" " " out "${out}") message("Run result: ${runResult} Output: \"${out}\"") -set(VALUE_UNCHANGED "[zot] [zot_custom] [zot_macro_dir] [zot_macro_tgt] ") +set(VALUE_UNCHANGED "[zot] [zot_custom] [zot_macro_dir] [zot_macro_tgt] [zot_pch] ") if("${out}" STREQUAL "${VALUE_UNCHANGED}") message("Worked!") else() @@ -245,6 +251,12 @@ file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_macro_dir.hxx "static const char* zot_macro_dir = \"zot_macro_dir changed\";\n") file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_macro_tgt.hxx "static const char* zot_macro_tgt = \"zot_macro_tgt changed\";\n") +file(WRITE ${BuildDepends_BINARY_DIR}/Project/zot_pch.hxx + "#ifndef ZOT_PCH_HXX\n" + "#define ZOT_PCH_HXX\n" + "static const char* zot_pch = \"zot_pch changed\";\n" + "#endif\n" + ) file(WRITE ${BuildDepends_BINARY_DIR}/Project/link_depends_no_shared_lib.h "#define link_depends_no_shared_lib_value 0\n") @@ -326,7 +338,7 @@ string(REGEX REPLACE "[\r\n]" " " out "${out}") message("Run result: ${runResult} Output: \"${out}\"") set(VALUE_CHANGED - "[zot changed] [zot_custom changed] [zot_macro_dir changed] [zot_macro_tgt changed] " + "[zot changed] [zot_custom changed] [zot_macro_dir changed] [zot_macro_tgt changed] [zot_pch changed] " ) if("${out}" STREQUAL "${VALUE_CHANGED}") message("Worked!") diff --git a/Tests/BuildDepends/Project/CMakeLists.txt b/Tests/BuildDepends/Project/CMakeLists.txt index 3f41b26d09..833880098c 100644 --- a/Tests/BuildDepends/Project/CMakeLists.txt +++ b/Tests/BuildDepends/Project/CMakeLists.txt @@ -93,6 +93,12 @@ add_executable(zot zot.cxx ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx zot_macro_dir.cxx zot_macro_tgt.cxx) add_dependencies(zot zot_custom) +add_library(zot_pch zot_pch.cxx) +target_link_libraries(zot zot_pch) +if(NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]") + target_precompile_headers(zot_pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/zot_pch.hxx) +endif() + # Test the #include line macro transformation rule support. set_property( TARGET zot diff --git a/Tests/BuildDepends/Project/zot.cxx b/Tests/BuildDepends/Project/zot.cxx index faee7d3cec..2d08c4b78d 100644 --- a/Tests/BuildDepends/Project/zot.cxx +++ b/Tests/BuildDepends/Project/zot.cxx @@ -4,11 +4,12 @@ const char* zot_macro_dir_f(); const char* zot_macro_tgt_f(); +const char* zot_pch_f(); int main() { - printf("[%s] [%s] [%s] [%s]\n", zot, zot_custom, zot_macro_dir_f(), - zot_macro_tgt_f()); + printf("[%s] [%s] [%s] [%s] [%s]\n", zot, zot_custom, zot_macro_dir_f(), + zot_macro_tgt_f(), zot_pch_f()); fflush(stdout); return 0; } diff --git a/Tests/BuildDepends/Project/zot_pch.cxx b/Tests/BuildDepends/Project/zot_pch.cxx new file mode 100644 index 0000000000..d9d04c7fad --- /dev/null +++ b/Tests/BuildDepends/Project/zot_pch.cxx @@ -0,0 +1,6 @@ +#include <zot_pch.hxx> + +const char* zot_pch_f() +{ + return zot_pch; +} |