Hi, our make dependencies currently are insufficient to trigger client binaries to be relinked when pgport/pgcommon/libpq/... changes.
To reproduce, you can use something like: touch ~/src/postgresql/src/port/snprintf.c && make -j48 2>&1|grep 'gcc.*pgbench' which won't show anything, whereas e.g. touch ~/src/postgresql/src/include/postgres_fe.h && make -j48 2>&1|grep 'gcc.*pgbench' will. The reason for that is that currently client programs only have order-only dependencies on pgport: pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) which will dutifully cause pgport to be rebuilt. But then we won't actually rebuild $client_program, because it's just an order-only dependency [1]. The same problem does *not* exist for the backend, because there we add pgport/pgcommon to OBJS, which will cause them to be proper dependencies. This does explain some mysterious issues I had over the years with changes occasionally requiring a clean/build cycle to fully take. It's especially confusing because after a build cycle one ends up with a build partially using the old and partially the new libraries. I unfortunately don't see a localized fix for this. Afaict we'd need to change all client build rules to also have a dependency on the library? Greetings, Andres Freund [1] https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html