Browse Source

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
Ben Boeckel 1 week ago
parent
commit
1a8712d31a

+ 4 - 9
Source/cmGeneratorTarget.cxx

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

+ 8 - 0
Tests/MSVCDebugInformationFormat/CMakeLists.txt

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

+ 15 - 0
Tests/MSVCDebugInformationFormat/PdbCompileFileName.c

@@ -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;
+}