From 797689ab35c6f1edc37b120804e348b03ce7b161 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 16 Oct 2019 13:23:23 -0400 Subject: 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 --- Source/cmMakefileTargetGenerator.cxx | 6 +++++- Tests/BuildDepends/CMakeLists.txt | 16 ++++++++++++++-- Tests/BuildDepends/Project/CMakeLists.txt | 6 ++++++ Tests/BuildDepends/Project/zot.cxx | 5 +++-- Tests/BuildDepends/Project/zot_pch.cxx | 6 ++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 Tests/BuildDepends/Project/zot_pch.cxx diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index e252dcd..767f4e0 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 39a5131..c1ad17c 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 3f41b26..8338800 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 faee7d3..2d08c4b 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 0000000..d9d04c7 --- /dev/null +++ b/Tests/BuildDepends/Project/zot_pch.cxx @@ -0,0 +1,6 @@ +#include + +const char* zot_pch_f() +{ + return zot_pch; +} -- cgit v0.12