cmGeneratorTarget: always provide a compile PDB filename

As of commit f78f592b78 (pchreuse: defer target existence enforcement to
generation time, 2025-06-16) via !10887, the compile PDB directory is
always set. Some codepaths used the total computation as a signal to
build the path themselves. But the filename was not specified, so the
resulting filename ended up changing. Always create the filename as
expected.

Fixes: #27401
This commit is contained in:
Ben Boeckel
2025-11-24 21:15:50 -05:00
parent ae5f525826
commit 1a8712d31a
3 changed files with 27 additions and 9 deletions

View File

@@ -1312,15 +1312,10 @@ std::string cmGeneratorTarget::GetCompilePDBName(
return components.prefix + pdbName + ".pdb";
}
// If the target is PCH-reused, we need a stable name for the PDB file so
// that reusing targets can construct a stable name for it.
if (this->PchReused) {
NameComponents const& components = GetFullNameInternalComponents(
config, cmStateEnums::RuntimeBinaryArtifact);
return cmStrCat(components.prefix, this->GetName(), ".pdb");
}
return "";
// Always use a name for the compile-time database.
NameComponents const& components =
GetFullNameInternalComponents(config, cmStateEnums::RuntimeBinaryArtifact);
return cmStrCat(components.prefix, this->GetName(), ".pdb");
}
std::string cmGeneratorTarget::GetCompilePDBPath(

View File

@@ -79,3 +79,11 @@ endif()
if(CMake_TEST_Fortran)
verify(Fortran verify.F90)
endif()
# Issue 27401; 4.2.0 regression
add_library(PdbCompileFileName PdbCompileFileName.c)
target_compile_definitions(PdbCompileFileName
PRIVATE
"TARGET_DIRECTORY=\"$<TARGET_INTERMEDIATE_DIR:PdbCompileFileName>\"")
set_property(TARGET PdbCompileFileName PROPERTY
MSVC_DEBUG_INFORMATION_FORMAT "ProgramDatabase")

View File

@@ -0,0 +1,15 @@
#include <stdio.h>
int main(int argc, char* argv[])
{
int ret = 0;
char const* fname = TARGET_DIRECTORY "/PdbCompileFileName.pdb";
FILE* f = fopen(fname, "r");
if (f) {
fclose(f);
} else {
printf("Failed to open PDB file '%s'\n", fname);
ret = 1;
}
return ret;
}