Suppress macOS warnings about duplicate libraries in link commands.

As of Xcode 15 (macOS Sonoma), the linker complains about duplicate
references to the same library.  We see warnings about libpgport and
libpgcommon being duplicated in many client executables.  This is a
consequence of the hack introduced in commit 6b7ef076b to list
libpgport before libpq while not removing it from $(LIBS).
(Commit 8396447cd later applied the same rule to libpgcommon.)

The concern in 6b7ef076b was to ensure that the client executable
wouldn't unintentionally depend on pgport functions from libpq.
That concern is obsolete on any platform for which we can do symbol
export control, because if we can then the pgport functions in libpq
won't be exposed anyway.  Hence, we can fix this problem by just
removing libpgport and libpgcommon from $(libpq_pgport), and letting
clients depend on the occurrences in $(LIBS).

In the back branches, do that only on macOS (which we know has
symbol export control).  In HEAD, let's be more aggressive and
remove the extra libraries everywhere.  The only still-supported
platforms that lack export control are MinGW/Cygwin, and it
doesn't seem worth sweating over ABI stability details for those
(or if somebody does care, it'd probably be possible to perform
symbol export control for those too).  As well as being simpler,
this might give some microscopic improvement in build time.

The meson build system is not changed here, as it doesn't have
this particular disease, though it does have some related issues
that we'll fix separately.

Discussion: https://postgr.es/m/467042.1695766998@sss.pgh.pa.us
This commit is contained in:
Tom Lane 2023-09-29 14:07:30 -04:00
parent 75af0f401f
commit 06843df4ab
1 changed files with 17 additions and 9 deletions

View File

@ -589,19 +589,27 @@ endif
libpq = -L$(libpq_builddir) -lpq libpq = -L$(libpq_builddir) -lpq
# libpq_pgport is for use by client executables (not libraries) that use libpq. # libpq_pgport is for use by client executables (not libraries) that use libpq.
# We force clients to pull symbols from the non-shared libraries libpgport # We used to use this to force libpgport and libpgcommon to be linked before
# and libpgcommon rather than pulling some libpgport symbols from libpq just # libpq, ensuring that clients would pull symbols from those libraries rather
# because libpq uses those functions too. This makes applications less # than possibly getting them from libpq (and thereby having an unwanted
# dependent on changes in libpq's usage of pgport (on platforms where we # dependency on which symbols libpq uses). However, now that we can prevent
# don't have symbol export control for libpq). To do this we link to # libpq from exporting those symbols on all platforms of interest, we don't
# pgport before libpq. This does cause duplicate -lpgport's to appear # worry about that anymore. The previous technique resulted in duplicate
# on client link lines, since that also appears in $(LIBS). # libraries in link commands, since those libraries also appear in $(LIBS).
# Some platforms warn about that, so avoiding those warnings is now more
# important. Hence, $(libpq_pgport) is now equivalent to $(libpq), but we
# still recommend using it for client executables in case some other reason
# appears to handle them differently.
libpq_pgport = $(libpq)
# libpq_pgport_shlib is the same idea, but for use in client shared libraries. # libpq_pgport_shlib is the same idea, but for use in client shared libraries.
# We need those clients to use the shlib variants. (Ideally, users of this
# macro would strip libpgport and libpgcommon from $(LIBS), but no harm is
# done if they don't, since they will have satisfied all their references
# from these libraries.)
ifdef PGXS ifdef PGXS
libpq_pgport = -L$(libdir) -lpgcommon -lpgport $(libpq)
libpq_pgport_shlib = -L$(libdir) -lpgcommon_shlib -lpgport_shlib $(libpq) libpq_pgport_shlib = -L$(libdir) -lpgcommon_shlib -lpgport_shlib $(libpq)
else else
libpq_pgport = -L$(top_builddir)/src/common -lpgcommon -L$(top_builddir)/src/port -lpgport $(libpq)
libpq_pgport_shlib = -L$(top_builddir)/src/common -lpgcommon_shlib -L$(top_builddir)/src/port -lpgport_shlib $(libpq) libpq_pgport_shlib = -L$(top_builddir)/src/common -lpgcommon_shlib -L$(top_builddir)/src/port -lpgport_shlib $(libpq)
endif endif