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)