mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-21 03:13:05 +08:00
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 commit6b7ef076b
to list libpgport before libpq while not removing it from $(LIBS). (Commit8396447cd
later applied the same rule to libpgcommon.) The concern in6b7ef076b
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:
parent
7478766f9d
commit
d8ceb98e4c
@ -572,19 +572,32 @@ 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 want clients to pull symbols from the non-shared libraries libpgport
|
||||||
# and libpgcommon rather than pulling some libpgport symbols from libpq just
|
# and libpgcommon rather than pulling some libpgport symbols from libpq just
|
||||||
# because libpq uses those functions too. This makes applications less
|
# because libpq uses those functions too. This makes applications less
|
||||||
# dependent on changes in libpq's usage of pgport (on platforms where we
|
# dependent on changes in libpq's usage of pgport. To do this we link to
|
||||||
# don't have symbol export control for libpq). To do this we link to
|
|
||||||
# pgport before libpq. This does cause duplicate -lpgport's to appear
|
# pgport before libpq. This does cause duplicate -lpgport's to appear
|
||||||
# on client link lines, since that also appears in $(LIBS).
|
# on client link lines, since that also appears in $(LIBS). On platforms
|
||||||
# libpq_pgport_shlib is the same idea, but for use in client shared libraries.
|
# where we have symbol export control for libpq, the whole exercise is
|
||||||
ifdef PGXS
|
# unnecessary because libpq won't expose any of these symbols. Currently,
|
||||||
|
# only macOS warns about duplicate library references, so we only suppress
|
||||||
|
# the duplicates on macOS.
|
||||||
|
ifeq ($(PORTNAME),darwin)
|
||||||
|
libpq_pgport = $(libpq)
|
||||||
|
else ifdef PGXS
|
||||||
libpq_pgport = -L$(libdir) -lpgcommon -lpgport $(libpq)
|
libpq_pgport = -L$(libdir) -lpgcommon -lpgport $(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 = -L$(top_builddir)/src/common -lpgcommon -L$(top_builddir)/src/port -lpgport $(libpq)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# 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
|
||||||
|
libpq_pgport_shlib = -L$(libdir) -lpgcommon_shlib -lpgport_shlib $(libpq)
|
||||||
|
else
|
||||||
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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user