From 17096aeba815437abc6948954d62f9c64f8bdadd Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Oct 2022 11:59:20 -0400 Subject: [PATCH 1/4] cmLocalGenerator: Factor out helper to compute MSVC_DEBUG_INFORMATION_FORMAT --- Source/cmLocalGenerator.cxx | 42 +++++++++++++++++++++++-------------- Source/cmLocalGenerator.h | 4 ++++ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 2a50dd3660..33255c56c1 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2046,25 +2046,15 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags, } } - // Add MSVC debug information format flags. This is activated by the presence - // of a default selection whether or not it is overridden by a property. - cmValue msvcDebugInformationFormatDefault = this->Makefile->GetDefinition( - "CMAKE_MSVC_DEBUG_INFORMATION_FORMAT_DEFAULT"); - if (cmNonempty(msvcDebugInformationFormatDefault)) { - cmValue msvcDebugInformationFormatValue = - target->GetProperty("MSVC_DEBUG_INFORMATION_FORMAT"); - if (!msvcDebugInformationFormatValue) { - msvcDebugInformationFormatValue = msvcDebugInformationFormatDefault; - } - std::string const msvcDebugInformationFormat = - cmGeneratorExpression::Evaluate(*msvcDebugInformationFormatValue, this, - config, target); - if (!msvcDebugInformationFormat.empty()) { + // Add MSVC debug information format flags if CMP0141 is NEW. + if (cm::optional msvcDebugInformationFormat = + this->GetMSVCDebugFormatName(config, target)) { + if (!msvcDebugInformationFormat->empty()) { if (cmValue msvcDebugInformationFormatOptions = this->Makefile->GetDefinition( cmStrCat("CMAKE_", lang, "_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_", - msvcDebugInformationFormat))) { + *msvcDebugInformationFormat))) { this->AppendCompileOptions(flags, *msvcDebugInformationFormatOptions); } else if ((this->Makefile->GetSafeDefinition( cmStrCat("CMAKE_", lang, "_COMPILER_ID")) == "MSVC"_s || @@ -2074,7 +2064,7 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags, // The compiler uses the MSVC ABI so it needs a known runtime library. this->IssueMessage(MessageType::FATAL_ERROR, cmStrCat("MSVC_DEBUG_INFORMATION_FORMAT value '", - msvcDebugInformationFormat, + *msvcDebugInformationFormat, "' not known for this ", lang, " compiler.")); } @@ -2871,6 +2861,26 @@ void cmLocalGenerator::CopyPchCompilePdb( target_compile_pdb_dir); } +cm::optional cmLocalGenerator::GetMSVCDebugFormatName( + std::string const& config, cmGeneratorTarget const* target) +{ + // MSVC debug information format selection is activated by the presence + // of a default whether or not it is overridden by a property. + cm::optional msvcDebugInformationFormat; + cmValue msvcDebugInformationFormatDefault = this->Makefile->GetDefinition( + "CMAKE_MSVC_DEBUG_INFORMATION_FORMAT_DEFAULT"); + if (cmNonempty(msvcDebugInformationFormatDefault)) { + cmValue msvcDebugInformationFormatValue = + target->GetProperty("MSVC_DEBUG_INFORMATION_FORMAT"); + if (!msvcDebugInformationFormatValue) { + msvcDebugInformationFormatValue = msvcDebugInformationFormatDefault; + } + msvcDebugInformationFormat = cmGeneratorExpression::Evaluate( + *msvcDebugInformationFormatValue, this, config, target); + } + return msvcDebugInformationFormat; +} + namespace { inline void RegisterUnitySources(cmGeneratorTarget* target, cmSourceFile* sf, diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 0529431afa..765441cb15 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -646,6 +646,10 @@ private: cmGeneratorTarget* reuseTarget, std::vector const& extensions); + // Returns MSVC_DEBUG_INFORMATION_FORMAT value if CMP0141 is NEW. + cm::optional GetMSVCDebugFormatName( + std::string const& config, cmGeneratorTarget const* target); + struct UnityBatchedSource { cmSourceFile* Source = nullptr; From 2e65fe92db4ec2869618e863f80f21c825ac9e1c Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Oct 2022 11:59:20 -0400 Subject: [PATCH 2/4] cmLocalGenerator: Clarify name of local PDB type variable --- Source/cmLocalGenerator.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 33255c56c1..fc16b26850 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2678,8 +2678,7 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target) bool editAndContinueDebugInfo = langFlags.find("/ZI") != std::string::npos || langFlags.find("-ZI") != std::string::npos; - - bool enableDebuggingInformation = + bool programDatabaseDebugInfo = langFlags.find("/Zi") != std::string::npos || langFlags.find("-Zi") != std::string::npos; @@ -2697,7 +2696,7 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target) if (editAndContinueDebugInfo || msvc2008OrLess) { this->CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget, { ".pdb", ".idb" }); - } else if (enableDebuggingInformation) { + } else if (programDatabaseDebugInfo) { this->CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget, { ".pdb" }); } From 4d13f472a2ebd09f6f7f3be466e5d000bbeb6908 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Oct 2022 12:02:44 -0400 Subject: [PATCH 3/4] Tests: Drop redundant project init from RunCMake.PrecompileHeaders cases The `CMakeLists.txt` file already calls `cmake_minimum_required` and `project` before including each case's code. --- Tests/RunCMake/PrecompileHeaders/DisabledPch.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/PchDebugGenex.cmake | 3 +-- .../RunCMake/PrecompileHeaders/PchIncludedAllLanguages.cmake | 4 ++-- .../RunCMake/PrecompileHeaders/PchIncludedOneLanguage.cmake | 4 ++-- Tests/RunCMake/PrecompileHeaders/PchInterface.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/PchLibObjLibExe.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/PchMultilanguage.cmake | 4 ++-- Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue.cmake | 5 ++--- Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake | 5 ++--- Tests/RunCMake/PrecompileHeaders/PchReuseFromPrefixed.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/PchReuseFromSubdir.cmake | 3 +-- Tests/RunCMake/PrecompileHeaders/SkipPrecompileHeaders.cmake | 5 ++--- 13 files changed, 19 insertions(+), 29 deletions(-) diff --git a/Tests/RunCMake/PrecompileHeaders/DisabledPch.cmake b/Tests/RunCMake/PrecompileHeaders/DisabledPch.cmake index 59ee14b9ff..18b09c1c1e 100644 --- a/Tests/RunCMake/PrecompileHeaders/DisabledPch.cmake +++ b/Tests/RunCMake/PrecompileHeaders/DisabledPch.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(DisabledPch C) +enable_language(C) add_library(foo foo.c) target_include_directories(foo PUBLIC include) diff --git a/Tests/RunCMake/PrecompileHeaders/PchDebugGenex.cmake b/Tests/RunCMake/PrecompileHeaders/PchDebugGenex.cmake index 854689fd8f..039a546b6f 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchDebugGenex.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchDebugGenex.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(PchDebugGenex C) +enable_language(C) add_library(foo foo.c) target_include_directories(foo PUBLIC include) diff --git a/Tests/RunCMake/PrecompileHeaders/PchIncludedAllLanguages.cmake b/Tests/RunCMake/PrecompileHeaders/PchIncludedAllLanguages.cmake index a4554103d2..eef189ae63 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchIncludedAllLanguages.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchIncludedAllLanguages.cmake @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.15) -project(PchIncludedAllLanguages C CXX) +enable_language(C) +enable_language(CXX) if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH) add_definitions(-DHAVE_PCH_SUPPORT) diff --git a/Tests/RunCMake/PrecompileHeaders/PchIncludedOneLanguage.cmake b/Tests/RunCMake/PrecompileHeaders/PchIncludedOneLanguage.cmake index dd582aca8c..6c5e89d860 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchIncludedOneLanguage.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchIncludedOneLanguage.cmake @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.16) -project(PchIncludedAllLanguages C CXX) +enable_language(C) +enable_language(CXX) if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH) add_definitions(-DHAVE_PCH_SUPPORT) diff --git a/Tests/RunCMake/PrecompileHeaders/PchInterface.cmake b/Tests/RunCMake/PrecompileHeaders/PchInterface.cmake index aab20d8f59..c031660f57 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchInterface.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchInterface.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(PchInterface C) +enable_language(C) add_library(foo foo.c) target_include_directories(foo PUBLIC include) diff --git a/Tests/RunCMake/PrecompileHeaders/PchLibObjLibExe.cmake b/Tests/RunCMake/PrecompileHeaders/PchLibObjLibExe.cmake index b4fdb712a5..ad8a328187 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchLibObjLibExe.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchLibObjLibExe.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.16) -project(PchLibObjLibExe CXX) +enable_language(CXX) foreach(i 1 2 3) file(WRITE ${CMAKE_BINARY_DIR}/empty${i}.cpp "void nothing${i}() {}\n") diff --git a/Tests/RunCMake/PrecompileHeaders/PchMultilanguage.cmake b/Tests/RunCMake/PrecompileHeaders/PchMultilanguage.cmake index bb18a6423f..d8abf8e096 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchMultilanguage.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchMultilanguage.cmake @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.15) -project(PchMultilanguage C CXX) +enable_language(C) +enable_language(CXX) add_executable(foobar foo.c diff --git a/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue.cmake b/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue.cmake index 3e27620f9e..988c4c69f0 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue.cmake @@ -1,6 +1,5 @@ -cmake_minimum_required(VERSION 3.15) - -project(PchPrologueEpilogue) +enable_language(C) +enable_language(CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake index f8fba441a6..8d5e945077 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(PchReuseFrom C) +enable_language(C) if(CMAKE_C_COMPILE_OPTIONS_USE_PCH) add_definitions(-DHAVE_PCH_SUPPORT) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake index ba504a3ef3..510877ff01 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake @@ -1,6 +1,5 @@ -cmake_minimum_required(VERSION 3.18) - -project(PchReuseFromObjLib) +enable_language(C) +enable_language(CXX) set(CMAKE_PCH_WARN_INVALID OFF) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFromPrefixed.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFromPrefixed.cmake index e306d8e9c3..14703e336a 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFromPrefixed.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFromPrefixed.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(PchReuseFromPrefixed C) +enable_language(C) if(CMAKE_C_COMPILE_OPTIONS_USE_PCH) add_definitions(-DHAVE_PCH_SUPPORT) diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFromSubdir.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFromSubdir.cmake index fff74dcd68..fefb4eeebb 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchReuseFromSubdir.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFromSubdir.cmake @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.15) -project(PchReuseFromSubdir C) +enable_language(C) add_library(empty empty.c) target_precompile_headers(empty PUBLIC diff --git a/Tests/RunCMake/PrecompileHeaders/SkipPrecompileHeaders.cmake b/Tests/RunCMake/PrecompileHeaders/SkipPrecompileHeaders.cmake index 49efbfbab0..7405e658cc 100644 --- a/Tests/RunCMake/PrecompileHeaders/SkipPrecompileHeaders.cmake +++ b/Tests/RunCMake/PrecompileHeaders/SkipPrecompileHeaders.cmake @@ -1,6 +1,5 @@ -cmake_minimum_required(VERSION 3.15) - -project(SkipPrecompileHeaders) +enable_language(C) +enable_language(CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) From 183b9a9eca8bdf7684a6c281c677c58f3c0a66fd Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Oct 2022 12:11:18 -0400 Subject: [PATCH 4/4] 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 ++ ...seFrom.cmake => PchReuseFrom-common.cmake} | 0 .../PrecompileHeaders/RunCMakeTest.cmake | 3 ++- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-NEW.cmake create mode 100644 Tests/RunCMake/PrecompileHeaders/PchReuseFrom-CMP0141-OLD.cmake rename Tests/RunCMake/PrecompileHeaders/{PchReuseFrom.cmake => PchReuseFrom-common.cmake} (100%) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index fc16b26850..fb269b28fe 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 0000000000..daf7a3879e --- /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 0000000000..9586887fde --- /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.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake similarity index 100% rename from Tests/RunCMake/PrecompileHeaders/PchReuseFrom.cmake rename to Tests/RunCMake/PrecompileHeaders/PchReuseFrom-common.cmake diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index fd41e2f8e3..687fc0e669 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)