pchreuse: defer PCH consistency checks to generation time There's no reason that during-configure inconsistencies should block generation. It can be detected at that point instead.
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index e9a75cc..dc9fbbb 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx
@@ -2817,6 +2817,13 @@ if (!pchReuseFrom) { return nullptr; } + if (this->GetProperty("PRECOMPILE_HEADERS").IsOn()) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("PRECOMPILE_HEADERS property is already set on target (\"", + this->GetName(), "\")\n")); + } + // Guaranteed to exist because `SetProperty` does a target lookup. return this->GetGlobalGenerator()->FindGeneratorTarget(*pchReuseFrom); } @@ -2827,6 +2834,13 @@ if (!pchReuseFrom) { return nullptr; } + if (this->GetProperty("PRECOMPILE_HEADERS").IsOn()) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("PRECOMPILE_HEADERS property is already set on target (\"", + this->GetName(), "\")\n")); + } + // Guaranteed to exist because `SetProperty` does a target lookup. return this->GetGlobalGenerator()->FindGeneratorTarget(*pchReuseFrom); }
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4101be8..be4ae58 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx
@@ -2148,13 +2148,6 @@ return; } } else if (prop == propPRECOMPILE_HEADERS_REUSE_FROM) { - if (this->GetProperty("PRECOMPILE_HEADERS")) { - std::ostringstream e; - e << "PRECOMPILE_HEADERS property is already set on target (\"" - << this->impl->Name << "\")\n"; - this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str()); - return; - } auto* reusedTarget = this->impl->Makefile->GetCMakeInstance() ->GetGlobalGenerator() ->FindTarget(value); @@ -2202,15 +2195,6 @@ "imported targets (\"", this->impl->Name, "\")\n")); } - if (prop == propPRECOMPILE_HEADERS && - this->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM")) { - this->impl->Makefile->IssueMessage( - MessageType::FATAL_ERROR, - cmStrCat( - "PRECOMPILE_HEADERS_REUSE_FROM property is already set on target (\"", - this->impl->Name, "\")\n")); - return; - } UsageRequirementProperty* usageRequirements[] = { &this->impl->IncludeDirectories,
diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseConsistency.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseConsistency.cmake new file mode 100644 index 0000000..1b404e0 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseConsistency.cmake
@@ -0,0 +1,67 @@ +enable_language(CXX) + +if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH) + add_definitions(-DHAVE_PCH_SUPPORT) +endif() + +###################################################################### + +file(WRITE ${CMAKE_BINARY_DIR}/pch.cxx [=[ +void nothing() +{ +} +]=]) + +file(WRITE ${CMAKE_BINARY_DIR}/string.hxx [=[ +#include <string.h> + +namespace std { + struct string + { + char storage[20]; + + string(const char* s) { + strcpy(storage, s); + } + + const char* c_str() const { + return storage; + } + }; +} +]=]) + +add_library(pch-generator ${CMAKE_BINARY_DIR}/pch.cxx) +target_precompile_headers(pch-generator PRIVATE ${CMAKE_BINARY_DIR}/string.hxx) + +###################################################################### + +file(WRITE ${CMAKE_BINARY_DIR}/message.cxx [=[ +#include "message.hxx" + +#ifndef HAVE_PCH_SUPPORT + #include "string.hxx" +#endif + +const char* message() +{ + static std::string greeting("hi there"); + return greeting.c_str(); +} +]=]) + +file(WRITE ${CMAKE_BINARY_DIR}/message.hxx [=[ +const char* message(); +]=]) + +add_library(pch_before_reuse_reuse ${CMAKE_BINARY_DIR}/message.cxx) +target_precompile_headers(pch_before_reuse_reuse PRIVATE "${CMAKE_BINARY_DIR}/string.hxx") +target_precompile_headers(pch_before_reuse_reuse REUSE_FROM pch-generator) +set_property(TARGET pch_before_reuse_reuse PROPERTY PRECOMPILE_HEADERS "") +target_include_directories(pch_before_reuse_reuse PRIVATE ${CMAKE_BINARY_DIR}) + +add_library(reuse_before_pch_reuse ${CMAKE_BINARY_DIR}/message.cxx) +target_precompile_headers(reuse_before_pch_reuse REUSE_FROM pch-generator) +target_precompile_headers(reuse_before_pch_reuse PRIVATE "${CMAKE_BINARY_DIR}/string.hxx") +set_property(TARGET reuse_before_pch_reuse PROPERTY PRECOMPILE_HEADERS "") +target_include_directories(reuse_before_pch_reuse PRIVATE ${CMAKE_BINARY_DIR})
diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index 95aaafb..ebf704b 100644 --- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake +++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake
@@ -31,6 +31,7 @@ run_test(PchReuseFromSubdir) run_build_verbose(PchReuseFromIgnoreOwnProps) run_build_verbose(PchReuseFromUseUpdatedProps) +run_build_verbose(PchReuseConsistency) run_cmake(PchMultilanguage) if(RunCMake_GENERATOR MATCHES "Make|Ninja") run_cmake(PchWarnInvalid)