From 5c92784a4db7cd13d7d51b7684fead4166146eb3 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Mon, 15 Jun 2026 14:57:02 +0800
Subject: [PATCH v1] Make frontend programs relink after libpgfeutils changes

Several frontend programs link with libpgfeutils, but their Makefile rules
only had submake-libpgfeutils as an order-only prerequisite. As a result,
changes in src/fe_utils rebuilt libpgfeutils.a but did not cause those
programs to relink.

Add a shared libpgfeutils variable in Makefile.global.in and make each
in-tree target that links with -lpgfeutils depend on the archive as a normal
prerequisite. This includes the test_escape test module, which is not built
by top-level make but should still relink when that module is built or tested.

For rules that used $^ in the link command, switch to explicit object lists
so the archive prerequisite does not get added to the link line separately
from -lpgfeutils.

Author: Chao Li <lic@highgo.com>
---
 src/Makefile.global.in                | 10 ++++++++++
 src/bin/initdb/Makefile               |  2 +-
 src/bin/pg_amcheck/Makefile           |  4 ++--
 src/bin/pg_basebackup/Makefile        | 10 +++++-----
 src/bin/pg_checksums/Makefile         |  4 ++--
 src/bin/pg_combinebackup/Makefile     |  4 ++--
 src/bin/pg_dump/Makefile              |  6 +++---
 src/bin/pg_resetwal/Makefile          |  4 ++--
 src/bin/pg_rewind/Makefile            |  4 ++--
 src/bin/pg_upgrade/Makefile           |  4 ++--
 src/bin/pg_verifybackup/Makefile      |  4 ++--
 src/bin/pg_waldump/Makefile           |  4 ++--
 src/bin/pg_walsummary/Makefile        |  4 ++--
 src/bin/pgbench/Makefile              |  4 ++--
 src/bin/psql/Makefile                 |  2 +-
 src/bin/scripts/Makefile              | 24 ++++++++++++++++--------
 src/test/modules/test_escape/Makefile |  2 +-
 17 files changed, 57 insertions(+), 39 deletions(-)

diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index cef1ad7f87d..09c7423f8cf 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -637,6 +637,12 @@ ifeq ($(PORTNAME),cygwin)
 libpq_pgport += $(LDAP_LIBS_FE)
 endif
 
+# libpgfeutils is for client executables that link with fe_utils.  Targets
+# should depend on this when they need to be relinked after fe_utils changes.
+ifndef PGXS
+libpgfeutils = $(top_builddir)/src/fe_utils/libpgfeutils.a
+endif
+
 
 ##########################################################################
 #
@@ -654,6 +660,10 @@ submake-libpgfeutils: | submake-generated-headers
 	$(MAKE) -C $(top_builddir)/src/common all
 	$(MAKE) -C $(top_builddir)/src/fe_utils all
 
+ifndef PGXS
+$(libpgfeutils): | submake-libpgfeutils
+endif
+
 .PHONY: submake-libpq submake-libpgport submake-libpgfeutils
 
 
diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile
index 21b755025ad..8e4adbff07a 100644
--- a/src/bin/initdb/Makefile
+++ b/src/bin/initdb/Makefile
@@ -38,7 +38,7 @@ OBJS = \
 
 all: initdb
 
-initdb: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+initdb: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 # We must pull in localtime.c from src/timezones
diff --git a/src/bin/pg_amcheck/Makefile b/src/bin/pg_amcheck/Makefile
index f7a9640033b..4ea498b9dab 100644
--- a/src/bin/pg_amcheck/Makefile
+++ b/src/bin/pg_amcheck/Makefile
@@ -27,8 +27,8 @@ OBJS = \
 
 all: pg_amcheck
 
-pg_amcheck: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_amcheck: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 
 install: all installdirs
diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile
index df94fc27d02..8b1df134ff2 100644
--- a/src/bin/pg_basebackup/Makefile
+++ b/src/bin/pg_basebackup/Makefile
@@ -41,16 +41,16 @@ BBOBJS = \
 
 all: pg_basebackup pg_createsubscriber pg_receivewal pg_recvlogical
 
-pg_basebackup: $(BBOBJS) $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_basebackup: $(BBOBJS) $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) $(BBOBJS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_createsubscriber: pg_createsubscriber.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_createsubscriber: pg_createsubscriber.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) pg_createsubscriber.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_receivewal: pg_receivewal.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_receivewal: pg_receivewal.o $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) pg_receivewal.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_recvlogical: pg_recvlogical.o $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile
index b16cfafa0bf..601aeafbc01 100644
--- a/src/bin/pg_checksums/Makefile
+++ b/src/bin/pg_checksums/Makefile
@@ -24,8 +24,8 @@ OBJS = \
 
 all: pg_checksums
 
-pg_checksums: $(OBJS) | submake-libpgport
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_checksums: $(OBJS) $(libpgfeutils) | submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) pg_checksums$(X) '$(DESTDIR)$(bindir)/pg_checksums$(X)'
diff --git a/src/bin/pg_combinebackup/Makefile b/src/bin/pg_combinebackup/Makefile
index 0d0089472e8..c217941448a 100644
--- a/src/bin/pg_combinebackup/Makefile
+++ b/src/bin/pg_combinebackup/Makefile
@@ -30,8 +30,8 @@ OBJS = \
 
 all: pg_combinebackup
 
-pg_combinebackup: $(OBJS) | submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_combinebackup: $(OBJS) $(libpgfeutils) | submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) pg_combinebackup$(X) '$(DESTDIR)$(bindir)/pg_combinebackup$(X)'
diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile
index 79073b0a0ea..bc2db929cea 100644
--- a/src/bin/pg_dump/Makefile
+++ b/src/bin/pg_dump/Makefile
@@ -45,13 +45,13 @@ OBJS = \
 
 all: pg_dump pg_restore pg_dumpall
 
-pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_restore: pg_restore.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_restore: pg_restore.o $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) pg_restore.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_dumpall: pg_dumpall.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_dumpall: pg_dumpall.o $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) pg_dumpall.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile
index 7113acbef2f..da6ae2ce2a7 100644
--- a/src/bin/pg_resetwal/Makefile
+++ b/src/bin/pg_resetwal/Makefile
@@ -23,8 +23,8 @@ OBJS = \
 
 all: pg_resetwal
 
-pg_resetwal: $(OBJS) | submake-libpgport
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_resetwal: $(OBJS) $(libpgfeutils) | submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) pg_resetwal$(X) '$(DESTDIR)$(bindir)/pg_resetwal$(X)'
diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile
index 32a35c57612..09a68a9045c 100644
--- a/src/bin/pg_rewind/Makefile
+++ b/src/bin/pg_rewind/Makefile
@@ -34,8 +34,8 @@ EXTRA_CLEAN = xlogreader.c
 
 all: pg_rewind
 
-pg_rewind: $(OBJS) | submake-libpq submake-libpgport
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_rewind: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
 	rm -f $@ && $(LN_S) $< .
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
index 771addb675a..acb90651a3a 100644
--- a/src/bin/pg_upgrade/Makefile
+++ b/src/bin/pg_upgrade/Makefile
@@ -44,8 +44,8 @@ export TEST_EXT_LIB
 
 all: pg_upgrade
 
-pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_upgrade: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) pg_upgrade$(X) '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
diff --git a/src/bin/pg_verifybackup/Makefile b/src/bin/pg_verifybackup/Makefile
index 374d4a8afd1..87cc1997729 100644
--- a/src/bin/pg_verifybackup/Makefile
+++ b/src/bin/pg_verifybackup/Makefile
@@ -27,8 +27,8 @@ OBJS = \
 
 all: pg_verifybackup
 
-pg_verifybackup: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_verifybackup: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) pg_verifybackup$(X) '$(DESTDIR)$(bindir)/pg_verifybackup$(X)'
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
index aabb87566a2..0235263b5ff 100644
--- a/src/bin/pg_waldump/Makefile
+++ b/src/bin/pg_waldump/Makefile
@@ -29,8 +29,8 @@ RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
 
 all: pg_waldump
 
-pg_waldump: $(OBJS) | submake-libpgport
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_waldump: $(OBJS) $(libpgfeutils) | submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
 	rm -f $@ && $(LN_S) $< .
diff --git a/src/bin/pg_walsummary/Makefile b/src/bin/pg_walsummary/Makefile
index 7563c243c1b..ab41d2280f2 100644
--- a/src/bin/pg_walsummary/Makefile
+++ b/src/bin/pg_walsummary/Makefile
@@ -25,8 +25,8 @@ OBJS = \
 
 all: pg_walsummary
 
-pg_walsummary: $(OBJS) | submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_walsummary: $(OBJS) $(libpgfeutils) | submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 
 install: all installdirs
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index 987bf64df9d..a70c69ec016 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -26,8 +26,8 @@ LIBS += $(PTHREAD_LIBS)
 
 all: pgbench
 
-pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
-	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pgbench: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 # See notes in src/backend/parser/Makefile about the following two rules
 exprparse.h: exprparse.c
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
index be0032652cd..ce1c9ef48fa 100644
--- a/src/bin/psql/Makefile
+++ b/src/bin/psql/Makefile
@@ -46,7 +46,7 @@ OBJS = \
 
 all: psql
 
-psql: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+psql: $(OBJS) $(libpgfeutils) | submake-libpq submake-libpgport
 	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 help.o: sql_help.h
diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile
index e6cd9ef4af5..11fe464a873 100644
--- a/src/bin/scripts/Makefile
+++ b/src/bin/scripts/Makefile
@@ -31,14 +31,22 @@ LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
 
 all: $(PROGRAMS)
 
-createdb: createdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-createuser: createuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-dropdb: dropdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-dropuser: dropuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-clusterdb: clusterdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-vacuumdb: vacuumdb.o vacuuming.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-reindexdb: reindexdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
-pg_isready: pg_isready.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+createdb: createdb.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) createdb.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+createuser: createuser.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) createuser.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+dropdb: dropdb.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) dropdb.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+dropuser: dropuser.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) dropuser.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+clusterdb: clusterdb.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) clusterdb.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+vacuumdb: vacuumdb.o vacuuming.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) vacuumdb.o vacuuming.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+reindexdb: reindexdb.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) reindexdb.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_isready: pg_isready.o common.o $(WIN32RES) $(libpgfeutils) | submake-libpq submake-libpgport
+	$(CC) $(CFLAGS) pg_isready.o common.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
 	$(INSTALL_PROGRAM) createdb$(X)   '$(DESTDIR)$(bindir)'/createdb$(X)
diff --git a/src/test/modules/test_escape/Makefile b/src/test/modules/test_escape/Makefile
index 786db4cbae4..fe797e13eda 100644
--- a/src/test/modules/test_escape/Makefile
+++ b/src/test/modules/test_escape/Makefile
@@ -23,5 +23,5 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
-test_escape$(X): | submake-libpgfeutils
+test_escape$(X): $(libpgfeutils)
 check: test_escape$(X)
-- 
2.50.1 (Apple Git-155)

