From f9bc615d9a6eb8fa2db9332ec22eea42c0404134 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sun, 15 Jun 2025 21:24:49 +0200 Subject: [PATCH] pchreuse: ban PCH reuse from targets which disable PCH --- Source/cmGeneratorTarget.cxx | 18 ++++++ .../PchReuseWithoutPch-result.txt | 1 + .../PchReuseWithoutPch-stderr.txt | 4 ++ .../PchReuseWithoutPch.cmake | 60 +++++++++++++++++++ .../PrecompileHeaders/RunCMakeTest.cmake | 1 + 5 files changed, 84 insertions(+) create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-result.txt create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-stderr.txt create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch.cmake diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 7ec51bb086..a86e469557 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2860,6 +2860,15 @@ cmGeneratorTarget const* cmGeneratorTarget::GetPchReuseTarget() const } if (generatorTarget) { + if (generatorTarget->GetPropertyAsBool("DISABLE_PRECOMPILE_HEADERS")) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat( + "Target \"", *pchReuseFrom, "\" for the \"", this->GetName(), + R"(" target's "PRECOMPILE_HEADERS_REUSE_FROM" property has set "DISABLE_PRECOMPILE_HEADERS".)")); + return nullptr; + } + if (auto const* recurseReuseTarget = generatorTarget->GetPchReuseTarget()) { return recurseReuseTarget; @@ -2904,6 +2913,15 @@ cmGeneratorTarget* cmGeneratorTarget::GetPchReuseTarget() } if (generatorTarget) { + if (generatorTarget->GetPropertyAsBool("DISABLE_PRECOMPILE_HEADERS")) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat( + "Target \"", *pchReuseFrom, "\" for the \"", this->GetName(), + R"(" target's "PRECOMPILE_HEADERS_REUSE_FROM" property has set "DISABLE_PRECOMPILE_HEADERS".)")); + return nullptr; + } + if (auto* recurseReuseTarget = generatorTarget->GetPchReuseTarget()) { return recurseReuseTarget; } diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-result.txt b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-stderr.txt b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-stderr.txt new file mode 100644 index 0000000000..a2d912b4a1 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch-stderr.txt @@ -0,0 +1,4 @@ +CMake Error in CMakeLists.txt: + Target "pch-generator" for the "reuse_from_nopch" target's + "PRECOMPILE_HEADERS_REUSE_FROM" property has set + "DISABLE_PRECOMPILE_HEADERS". diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch.cmake new file mode 100644 index 0000000000..316793e0fc --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseWithoutPch.cmake @@ -0,0 +1,60 @@ +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 + +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) +set_property(TARGET pch-generator PROPERTY DISABLE_PRECOMPILE_HEADERS 1) + +###################################################################### + +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(reuse_from_nopch ${CMAKE_BINARY_DIR}/message.cxx) +target_precompile_headers(reuse_from_nopch REUSE_FROM pch-generator) +target_include_directories(reuse_from_nopch PRIVATE ${CMAKE_BINARY_DIR}) diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index 386bbe2801..f18b1d74f6 100644 --- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake +++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake @@ -33,6 +33,7 @@ run_build_verbose(PchReuseFromIgnoreOwnProps) run_build_verbose(PchReuseFromUseUpdatedProps) run_build_verbose(PchReuseConsistency) run_cmake(PchReuseFromCycle) +run_cmake(PchReuseWithoutPch) run_cmake(PchMultilanguage) run_build_verbose(PchReuseDeclarationOrder) if(RunCMake_GENERATOR MATCHES "Make|Ninja")