From 183b9a9eca8bdf7684a6c281c677c58f3c0a66fd Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Oct 2022 12:11:18 -0400 Subject: CMP0141: Fix PCH REUSE_FROM under policy NEW behavior Under the CMP0141 NEW behavior added by commit 0e96a20478 (MSVC: Add abstraction for debug information format, 2022-08-25, v3.25.0-rc1~142^2~1), the `-Zi` and `-ZI` flags do not appear in `CMAKE__FLAGS_` anymore. Teach the PCH REUSE_FROM implementation to recognize the `EditAndContinue` and `ProgramDatabase` debug information formats through the policy's new abstraction. Fixes: #24106 --- Source/cmLocalGenerator.cxx | 22 +++++++++++----- .../PchReuseFrom-CMP0141-NEW.cmake | 2 ++ .../PchReuseFrom-CMP0141-OLD.cmake | 2 ++ .../PrecompileHeaders/PchReuseFrom-common.cmake | 29 ++++++++++++++++++++++ .../RunCMake/PrecompileHeaders/PchReuseFrom.cmake | 29 ---------------------- .../RunCMake/PrecompileHeaders/RunCMakeTest.cmake | 3 ++- 6 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-NEW.cmake create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-OLD.cmake create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake delete mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index fc16b26..fb269b2 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2675,12 +2675,22 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target) this->Makefile->GetSafeDefinition( cmStrCat("CMAKE_", lang, "_FLAGS_", configUpper)); - bool editAndContinueDebugInfo = - langFlags.find("/ZI") != std::string::npos || - langFlags.find("-ZI") != std::string::npos; - bool programDatabaseDebugInfo = - langFlags.find("/Zi") != std::string::npos || - langFlags.find("-Zi") != std::string::npos; + bool editAndContinueDebugInfo = false; + bool programDatabaseDebugInfo = false; + if (cm::optional msvcDebugInformationFormat = + this->GetMSVCDebugFormatName(config, target)) { + editAndContinueDebugInfo = + *msvcDebugInformationFormat == "EditAndContinue"; + programDatabaseDebugInfo = + *msvcDebugInformationFormat == "ProgramDatabase"; + } else { + editAndContinueDebugInfo = + langFlags.find("/ZI") != std::string::npos || + langFlags.find("-ZI") != std::string::npos; + programDatabaseDebugInfo = + langFlags.find("/Zi") != std::string::npos || + langFlags.find("-Zi") != std::string::npos; + } // MSVC 2008 is producing both .pdb and .idb files with /Zi. bool msvc2008OrLess = diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-NEW.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-NEW.cmake new file mode 100644 index 0000000..daf7a38 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-NEW.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0141 NEW) +include(PchReuseFrom-common.cmake) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-OLD.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-OLD.cmake new file mode 100644 index 0000000..9586887 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-OLD.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0141 OLD) +include(PchReuseFrom-common.cmake) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake new file mode 100644 index 0000000..8d5e945 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake @@ -0,0 +1,29 @@ +enable_language(C) + +if(CMAKE_C_COMPILE_OPTIONS_USE_PCH) + add_definitions(-DHAVE_PCH_SUPPORT) +endif() + +# Add this before the target from which we will reuse the PCH +# to test that generators can handle reversed ordering. +add_library(foo foo.c) +target_include_directories(foo PUBLIC include) + +add_library(empty empty.c) +target_precompile_headers(empty PRIVATE + + +) +target_include_directories(empty PUBLIC include) + +target_precompile_headers(foo REUSE_FROM empty) + +# should not cause problems if configured multiple times +target_precompile_headers(foo REUSE_FROM empty) + +add_executable(foobar foobar.c) +target_link_libraries(foobar foo ) +set_target_properties(foobar PROPERTIES PRECOMPILE_HEADERS_REUSE_FROM foo) + +enable_testing() +add_test(NAME foobar COMMAND foobar) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake deleted file mode 100644 index 8d5e945..0000000 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake +++ /dev/null @@ -1,29 +0,0 @@ -enable_language(C) - -if(CMAKE_C_COMPILE_OPTIONS_USE_PCH) - add_definitions(-DHAVE_PCH_SUPPORT) -endif() - -# Add this before the target from which we will reuse the PCH -# to test that generators can handle reversed ordering. -add_library(foo foo.c) -target_include_directories(foo PUBLIC include) - -add_library(empty empty.c) -target_precompile_headers(empty PRIVATE - - -) -target_include_directories(empty PUBLIC include) - -target_precompile_headers(foo REUSE_FROM empty) - -# should not cause problems if configured multiple times -target_precompile_headers(foo REUSE_FROM empty) - -add_executable(foobar foobar.c) -target_link_libraries(foobar foo ) -set_target_properties(foobar PROPERTIES PRECOMPILE_HEADERS_REUSE_FROM foo) - -enable_testing() -add_test(NAME foobar COMMAND foobar) diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index fd41e2f..687fc0e 100644 --- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake +++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake @@ -15,7 +15,8 @@ run_test(PchInterface) run_cmake(PchPrologueEpilogue) run_test(SkipPrecompileHeaders) run_test(CXXnotC) -run_test(PchReuseFrom) +run_test(PchReuseFrom-CMP0141-OLD) +run_test(PchReuseFrom-CMP0141-NEW) run_test(PchReuseFromPrefixed) run_test(PchReuseFromSubdir) run_cmake(PchMultilanguage) -- cgit v0.12