Merge topic 'cmp0141-pch-reuse' into release-3.25

183b9a9eca CMP0141: Fix PCH REUSE_FROM under policy NEW behavior
4d13f472a2 Tests: Drop redundant project init from RunCMake.PrecompileHeaders cases
2e65fe92db cmLocalGenerator: Clarify name of local PDB type variable
17096aeba8 cmLocalGenerator: Factor out helper to compute MSVC_DEBUG_INFORMATION_FORMAT

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !7854
This commit is contained in:
Brad King
2022-11-01 12:53:42 +00:00
committed by Kitware Robot
18 changed files with 72 additions and 54 deletions

View File

@@ -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<std::string> 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."));
}
@@ -2685,13 +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 enableDebuggingInformation =
langFlags.find("/Zi") != std::string::npos ||
langFlags.find("-Zi") != std::string::npos;
bool editAndContinueDebugInfo = false;
bool programDatabaseDebugInfo = false;
if (cm::optional<std::string> 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 =
@@ -2707,7 +2706,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" });
}
@@ -2871,6 +2870,26 @@ void cmLocalGenerator::CopyPchCompilePdb(
target_compile_pdb_dir);
}
cm::optional<std::string> 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<std::string> 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,

View File

@@ -646,6 +646,10 @@ private:
cmGeneratorTarget* reuseTarget,
std::vector<std::string> const& extensions);
// Returns MSVC_DEBUG_INFORMATION_FORMAT value if CMP0141 is NEW.
cm::optional<std::string> GetMSVCDebugFormatName(
std::string const& config, cmGeneratorTarget const* target);
struct UnityBatchedSource
{
cmSourceFile* Source = nullptr;

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.15)
project(PchPrologueEpilogue)
enable_language(C)
enable_language(CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

View File

@@ -0,0 +1,2 @@
cmake_policy(SET CMP0141 NEW)
include(PchReuseFrom-common.cmake)

View File

@@ -0,0 +1,2 @@
cmake_policy(SET CMP0141 OLD)
include(PchReuseFrom-common.cmake)

View File

@@ -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)

View File

@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.18)
project(PchReuseFromObjLib)
enable_language(C)
enable_language(CXX)
set(CMAKE_PCH_WARN_INVALID OFF)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.15)
project(SkipPrecompileHeaders)
enable_language(C)
enable_language(CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)