Hi,

Windows CI images are updated ~15 hours ago [1] and Windows CI task
started to fail with [2]:

```
FAILED: [code=2] src/interfaces/libpq/libpq.a.p/meson_pch-c.obj
src/interfaces/libpq/libpq.a.p/postgres_fe_pch.pch

"cl" "-Isrc/interfaces/libpq\libpq.a.p" "-Isrc/interfaces/libpq"
"-I..\src\interfaces\libpq" "-Isrc\port" "-I..\src\port"
"-Isrc\include" "-I..\src\include" "-Ic:\openssl\1.1\include"
"-I..\src\include\port\win32" "-I..\src\include\port\win32_msvc"
"-IC:/cirrus/src/include/pch" "/nologo" "/showIncludes" "/utf-8" "/W2"
"/Od" "/Zi" "/Zc:preprocessor" "/DWIN32" "/DWINDOWS" "/D__WINDOWS__"
"/D__WIN32__" "/D_CRT_SECURE_NO_DEPRECATE"
"/D_CRT_NONSTDC_NO_DEPRECATE" "/wd4018" "/wd4244" "/wd4273" "/wd4101"
"/wd4102" "/wd4090" "/wd4267" "/Ycpostgres_fe_pch.h"
"/Fpsrc/interfaces/libpq\libpq.a.p\postgres_fe_pch.pch"
"/Fosrc/interfaces/libpq\libpq.a.p\meson_pch-c.obj" "/MDd" "/nologo"
"/showIncludes" "/utf-8" "/W2" "/Od" "/Zi" "/Zc:preprocessor"
"/DWIN32" "/DWINDOWS" "/D__WINDOWS__" "/D__WIN32__"
"/D_CRT_SECURE_NO_DEPRECATE" "/D_CRT_NONSTDC_NO_DEPRECATE" "/wd4018"
"/wd4244" "/wd4273" "/wd4101" "/wd4102" "/wd4090" "/wd4267"
"-DSO_MAJOR_VERSION=5" "/FS"
"/FdC:\cirrus\build\src/interfaces/libpq\libpq.pdb" "/c"
src/interfaces/libpq/libpq.a.p/meson_pch-c.c

src/interfaces/libpq/libpq.a.p/meson_pch-c.c: fatal error C1052:
program database file,
'C:\cirrus\build\src\interfaces\libpq\libpq.pdb', was generated by the
linker with /DEBUG:fastlink; compiler cannot update such PDB files;
please delete it or use /Fd to specify a different PDB filename
```

After talking with Andres, we realized that the problem is caused by
static and shared libraries having the same name, so they overwrite
each other's debug file. This was not seen before, our guess is that
the ninja version is upgraded on the Windows CI image from 1.11.1 to
1.13.0 and new ninja optimized the build. Older ninja was building two
libraries concurrently and that hid the problem but the new ninja
optimized/changed the build, so these two libraries weren't built
concurrently and caused the failure.

The solution is changing the libraries' names [3]. Changing
conflicting libraries' names is actually enough but I wanted to add
_static and _shared suffixes to all of the libraries' names as I think
this is more future proof.

Any feedback would be appreciated.

Note: Since there is no new commit after the Windows CI image update
[1], this problem is not visible on the upstream Postgres for now. The
first commit will trigger this problem.

[1] https://cirrus-ci.com/task/5683237017616384
[2] https://cirrus-ci.com/task/5906793164963840
[3] https://cirrus-ci.com/task/5204554066690048

-- 
Regards,
Nazir Bilal Yavuz
Microsoft
From 3e177cb280d0e643f6cce785d6048c5e2dd11d5c Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <[email protected]>
Date: Tue, 12 Aug 2025 17:53:50 +0300
Subject: [PATCH v1] meson: Add _static and _shared suffixes to the library
 names

Otherwise static and shared libraries overwrite each other's debug file.

Suggested-by: Andres Freund <[email protected]>
Author: Nazir Bilal Yavuz <[email protected]>
---
 src/backend/bootstrap/meson.build          | 2 +-
 src/backend/meson.build                    | 2 +-
 src/backend/nodes/meson.build              | 2 +-
 src/backend/parser/meson.build             | 2 +-
 src/backend/replication/meson.build        | 2 +-
 src/backend/utils/activity/meson.build     | 2 +-
 src/backend/utils/adt/meson.build          | 2 +-
 src/backend/utils/misc/meson.build         | 2 +-
 src/common/meson.build                     | 6 +++---
 src/port/meson.build                       | 4 ++--
 src/fe_utils/meson.build                   | 2 +-
 src/bin/pg_basebackup/meson.build          | 2 +-
 src/bin/pg_dump/meson.build                | 2 +-
 src/bin/scripts/meson.build                | 2 +-
 src/interfaces/libpq/meson.build           | 4 ++--
 src/interfaces/ecpg/compatlib/meson.build  | 4 ++--
 src/interfaces/ecpg/ecpglib/meson.build    | 4 ++--
 src/interfaces/ecpg/pgtypeslib/meson.build | 4 ++--
 src/interfaces/libpq-oauth/meson.build     | 2 +-
 19 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
index 29726c1ab4f..4264d09113c 100644
--- a/src/backend/bootstrap/meson.build
+++ b/src/backend/bootstrap/meson.build
@@ -21,7 +21,7 @@ bootparse = custom_target('bootparse',
 generated_sources += bootparse.to_list()
 boot_parser_sources += bootparse
 
-boot_parser = static_library('boot_parser',
+boot_parser = static_library('boot_parser_static',
   boot_parser_sources,
   dependencies: [backend_code],
   include_directories: include_directories('.'),
diff --git a/src/backend/meson.build b/src/backend/meson.build
index b831a541652..e6e2f93179c 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -62,7 +62,7 @@ backend_link_depends = []
 # Can't name the static library 'postgres', because msbuild ends up with a
 # conflict for the .pdb file otherwise.
 
-postgres_lib = static_library('postgres_lib',
+postgres_lib = static_library('postgres_lib_static',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
index 9a1c1b7b987..1ee286ea17b 100644
--- a/src/backend/nodes/meson.build
+++ b/src/backend/nodes/meson.build
@@ -23,7 +23,7 @@ nodefunc_sources = files(
   'outfuncs.c',
   'readfuncs.c',
 )
-nodefuncs = static_library('nodefuncs',
+nodefuncs = static_library('nodefuncs_static',
   nodefunc_sources,
   dependencies: [backend_code],
   include_directories: include_directories('../../include/nodes'),
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
index 874aa749aa6..f5c07ff8dcf 100644
--- a/src/backend/parser/meson.build
+++ b/src/backend/parser/meson.build
@@ -42,7 +42,7 @@ backend_parser = custom_target('gram',
 generated_sources += backend_parser.to_list()
 parser_sources += backend_parser
 
-parser = static_library('parser',
+parser = static_library('parser_static',
   parser_sources,
   dependencies: [backend_code],
   include_directories: include_directories('.'),
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
index b0601498865..ad278e78e3b 100644
--- a/src/backend/replication/meson.build
+++ b/src/backend/replication/meson.build
@@ -42,7 +42,7 @@ syncrep_gram = custom_target('syncrep_gram',
 generated_sources += syncrep_gram.to_list()
 repl_parser_sources += syncrep_gram
 
-repl_parser = static_library('repl_parser',
+repl_parser = static_library('repl_parser_static',
   repl_parser_sources,
   dependencies: [backend_code],
   include_directories: include_directories('.'),
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
index d8e56b49c24..1bb0320a0b2 100644
--- a/src/backend/utils/activity/meson.build
+++ b/src/backend/utils/activity/meson.build
@@ -27,7 +27,7 @@ waitevent_sources = files(
   'wait_event_funcs.c',
 )
 
-wait_event = static_library('wait_event_names',
+wait_event = static_library('wait_event_names_static',
   waitevent_sources,
   dependencies: [backend_code],
   include_directories: include_directories('../../../include/utils'),
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
index ed9bbd7b926..238ce24a7f8 100644
--- a/src/backend/utils/adt/meson.build
+++ b/src/backend/utils/adt/meson.build
@@ -130,7 +130,7 @@ jsonpath_gram = custom_target('jsonpath_parse',
 generated_sources += jsonpath_gram.to_list()
 
 # so we don't need to add . as an include dir for the whole backend
-backend_link_with += static_library('jsonpath',
+backend_link_with += static_library('jsonpath_static',
   jsonpath_scan, jsonpath_gram,
   dependencies: [backend_code],
   include_directories: include_directories('.'),
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
index 9e389a00d05..af01d4852a8 100644
--- a/src/backend/utils/misc/meson.build
+++ b/src/backend/utils/misc/meson.build
@@ -27,7 +27,7 @@ guc_scan = custom_target('guc_scan',
 generated_sources += guc_scan
 
 # so we don't need to add . as an include dir for the whole backend
-backend_link_with += static_library('guc-file',
+backend_link_with += static_library('guc-file_static',
   guc_scan,
   dependencies: [backend_code],
   include_directories: include_directories('.'),
diff --git a/src/common/meson.build b/src/common/meson.build
index 1540ba67cca..7ce71bbf934 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -167,7 +167,7 @@ foreach name, opts : pgcommon_variants
       continue
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
-    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+    cflag_libs += static_library('libpgcommon@0@_@1@_static'.format(name, cflagname),
       c_pch: pch_c_h,
       kwargs: opts + {
         'include_directories': [
@@ -182,7 +182,7 @@ foreach name, opts : pgcommon_variants
     )
   endforeach
 
-  lib = static_library('libpgcommon@0@'.format(name),
+  lib = static_library('libpgcommon@0@_static'.format(name),
       link_with: cflag_libs,
       link_whole: cflag_libs,
       c_pch: pch_c_h,
@@ -201,7 +201,7 @@ common_srv = pgcommon['_srv']
 common_shlib = pgcommon['_shlib']
 common_static = pgcommon['']
 
-common_excluded_shlib = static_library('libpgcommon_excluded_shlib',
+common_excluded_shlib = static_library('libpgcommon_excluded_shlib_static',
   sources: common_sources_excluded_shlib,
   dependencies: [frontend_common_code],
   build_by_default: false,
diff --git a/src/port/meson.build b/src/port/meson.build
index fc7b059fee5..382e6d3078a 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -175,7 +175,7 @@ foreach name, opts : pgport_variants
       continue
     endif
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
-    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+    cflag_libs += static_library('libpgport@0@_@1@_static'.format(name, cflagname),
       sources,
       c_pch: pch_c_h,
       kwargs: opts + {
@@ -186,7 +186,7 @@ foreach name, opts : pgport_variants
     )
   endforeach
 
-  lib = static_library('libpgport@0@'.format(name),
+  lib = static_library('libpgport@0@_static'.format(name),
       pgport_sources,
       link_with: cflag_libs,
       link_whole: cflag_libs,
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index 5a9ddb73463..999dc469896 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -28,7 +28,7 @@ psqlscan = custom_target('psqlscan',
 generated_sources += psqlscan
 fe_utils_sources += psqlscan
 
-fe_utils = static_library('libpgfeutils',
+fe_utils = static_library('libpgfeutils_static',
   fe_utils_sources,
   c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index 3a7fc10eab0..8cd2186ad2f 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -8,7 +8,7 @@ common_sources = files(
 )
 
 pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
-pg_basebackup_common = static_library('libpg_basebackup_common',
+pg_basebackup_common = static_library('libpg_basebackup_common_static',
   common_sources,
   dependencies: pg_basebackup_deps,
   kwargs: internal_lib_args,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index a2233b0a1b4..c58fd370f21 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -19,7 +19,7 @@ pg_dump_common_sources = files(
   'pg_backup_utils.c',
 )
 
-pg_dump_common = static_library('libpgdump_common',
+pg_dump_common = static_library('libpgdump_common_static',
   pg_dump_common_sources,
   c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, lz4, zlib, zstd],
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index 80df7c33257..ff5b815baff 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -1,6 +1,6 @@
 # Copyright (c) 2022-2025, PostgreSQL Global Development Group
 
-scripts_common = static_library('libscripts_common',
+scripts_common = static_library('libscripts_common_static',
   files('common.c'),
   dependencies: [frontend_code, libpq],
   kwargs: internal_lib_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index a74e885b169..52e157b48e8 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -57,7 +57,7 @@ libpq_so_c_args = ['-DUSE_DYNAMIC_OAUTH']
 # We could try to avoid building the source files twice, but it probably adds
 # more complexity than its worth (reusing object files requires also linking
 # to the library on windows or breaks precompiled headers).
-libpq_st = static_library('libpq',
+libpq_st = static_library('libpq_static',
   libpq_sources,
   include_directories: [libpq_inc],
   c_args: libpq_c_args,
@@ -66,7 +66,7 @@ libpq_st = static_library('libpq',
   kwargs: default_lib_args,
 )
 
-libpq_so = shared_library('libpq',
+libpq_so = shared_library('libpq_shared',
   libpq_sources + libpq_so_sources,
   include_directories: [libpq_inc, postgres_inc],
   c_args: libpq_c_args + libpq_so_c_args,
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 56e0a21651b..4e5ad5e3f5b 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -16,7 +16,7 @@ if host_system == 'windows'
 endif
 
 # see src/interfaces/libpq/meson.build
-ecpg_compat_st = static_library('libecpg_compat',
+ecpg_compat_st = static_library('libecpg_compat_static',
   ecpg_compat_sources,
   include_directories: ecpg_compat_inc,
   c_args: ecpg_compat_c_args,
@@ -26,7 +26,7 @@ ecpg_compat_st = static_library('libecpg_compat',
 )
 ecpg_targets += ecpg_compat_st
 
-ecpg_compat_so = shared_library('libecpg_compat',
+ecpg_compat_so = shared_library('libecpg_compat_shared',
   ecpg_compat_sources + ecpg_compat_so_sources,
   include_directories: ecpg_compat_inc,
   c_args: ecpg_compat_c_args,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 8f478c6a73e..df0aebe2d1c 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -25,7 +25,7 @@ if host_system == 'windows'
 endif
 
 # see src/interfaces/libpq/meson.build
-ecpglib_st = static_library('libecpg',
+ecpglib_st = static_library('libecpg_static',
   ecpglib_sources,
   include_directories: ecpglib_inc,
   c_args: ecpglib_c_args,
@@ -36,7 +36,7 @@ ecpglib_st = static_library('libecpg',
 )
 ecpg_targets += ecpglib_st
 
-ecpglib_so = shared_library('libecpg',
+ecpglib_so = shared_library('libecpg_shared',
   ecpglib_sources + ecpglib_so_sources,
   include_directories: ecpglib_inc,
   c_args: ecpglib_c_args,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 02301ec9acb..7b660932526 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -21,7 +21,7 @@ if host_system == 'windows'
 endif
 
 # see src/interfaces/libpq/meson.build
-ecpg_pgtypes_st = static_library('libpgtypes',
+ecpg_pgtypes_st = static_library('libpgtypes_static',
   ecpg_pgtypes_sources,
   include_directories: ecpg_pgtypes_inc,
   c_args: ecpg_pgtypes_c_args,
@@ -31,7 +31,7 @@ ecpg_pgtypes_st = static_library('libpgtypes',
 )
 ecpg_targets += ecpg_pgtypes_st
 
-ecpg_pgtypes_so = shared_library('libpgtypes',
+ecpg_pgtypes_so = shared_library('libpgtypes_shared',
   ecpg_pgtypes_sources + ecpg_pgtypes_so_sources,
   include_directories: ecpg_pgtypes_inc,
   c_args: ecpg_pgtypes_c_args,
diff --git a/src/interfaces/libpq-oauth/meson.build b/src/interfaces/libpq-oauth/meson.build
index df064c59a40..0b986b4355b 100644
--- a/src/interfaces/libpq-oauth/meson.build
+++ b/src/interfaces/libpq-oauth/meson.build
@@ -21,7 +21,7 @@ export_file = custom_target('libpq-oauth.exports',
 # port needs to be in include path due to pthread-win32.h
 libpq_oauth_inc = include_directories('.', '../libpq', '../../port')
 
-libpq_oauth_st = static_library('libpq-oauth',
+libpq_oauth_st = static_library('libpq-oauth_static',
   libpq_oauth_sources,
   include_directories: [libpq_oauth_inc, postgres_inc],
   c_pch: pch_postgres_fe_h,
-- 
2.50.1

Reply via email to