diff --git a/contrib/dblink/Makefile b/contrib/dblink/Makefile index e833b9203aca3cc7be079827be86c642033de3ea..a5b59c6b41f01c6d9abb9d6b01cde4bc016aa217 100644 --- a/contrib/dblink/Makefile +++ b/contrib/dblink/Makefile @@ -3,7 +3,7 @@ MODULE_big = dblink OBJS = dblink.o PG_CPPFLAGS = -I$(libpq_srcdir) -SHLIB_LINK = $(libpq) +SHLIB_LINK_INTERNAL = $(libpq) EXTENSION = dblink DATA = dblink--1.1.sql dblink--1.0--1.1.sql dblink--unpackaged--1.0.sql diff --git a/contrib/oid2name/Makefile b/contrib/oid2name/Makefile index f695b4a84e18f2f0f1d8f230335c02f378f3167f..b41f8af66615318b93c3379a9b0892625d386ac7 100644 --- a/contrib/oid2name/Makefile +++ b/contrib/oid2name/Makefile @@ -7,7 +7,7 @@ PROGRAM = oid2name OBJS = oid2name.o PG_CPPFLAGS = -I$(libpq_srcdir) -PG_LIBS = $(libpq_pgport) +PG_LIBS_INTERNAL = $(libpq_pgport) ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/pgbench/Makefile b/contrib/pgbench/Makefile index b8f5fb467f67d6c1d87fea0d7a8c7ab3e694d6b8..d6fbdcc0d69dfa28be0fcff98d45af95db1b6679 100644 --- a/contrib/pgbench/Makefile +++ b/contrib/pgbench/Makefile @@ -7,7 +7,8 @@ PROGRAM = pgbench OBJS = pgbench.o PG_CPPFLAGS = -I$(libpq_srcdir) -PG_LIBS = $(libpq_pgport) $(PTHREAD_LIBS) +PG_LIBS_INTERNAL = $(libpq_pgport) +PG_LIBS = $(PTHREAD_LIBS) ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/postgres_fdw/Makefile b/contrib/postgres_fdw/Makefile index c0f4160f6ba40d266b6cfe3c3a601b0a6f88f46d..bfb2e1d76810923e3c5de0d03e182b1af7d5eab3 100644 --- a/contrib/postgres_fdw/Makefile +++ b/contrib/postgres_fdw/Makefile @@ -4,7 +4,7 @@ MODULE_big = postgres_fdw OBJS = postgres_fdw.o option.o deparse.o connection.o PG_CPPFLAGS = -I$(libpq_srcdir) -SHLIB_LINK = $(libpq) +SHLIB_LINK_INTERNAL = $(libpq) EXTENSION = postgres_fdw DATA = postgres_fdw--1.0.sql diff --git a/contrib/spi/Makefile b/contrib/spi/Makefile index 0c11bfcbbd47b0c3ed002874bfefd9e2022cf5ac..f6ffe71c0204fd688999d550f6bb2cc8b96eb6ce 100644 --- a/contrib/spi/Makefile +++ b/contrib/spi/Makefile @@ -16,8 +16,6 @@ DOCS = $(addsuffix .example, $(MODULES)) # comment out if you want a quieter refint package for other uses PG_CPPFLAGS = -DREFINT_VERBOSE -LDFLAGS_SL += -L$(top_builddir)/src/port -lpgport - ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/vacuumlo/Makefile b/contrib/vacuumlo/Makefile index b658f9bf6f850d71dee78d178cb0fcd0bee986f0..ccb7d0740852d7bfcba420898412360db8c36435 100644 --- a/contrib/vacuumlo/Makefile +++ b/contrib/vacuumlo/Makefile @@ -7,7 +7,7 @@ PROGRAM = vacuumlo OBJS = vacuumlo.o PG_CPPFLAGS = -I$(libpq_srcdir) -PG_LIBS = $(libpq_pgport) +PG_LIBS_INTERNAL = $(libpq_pgport) ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/src/Makefile.global.in b/src/Makefile.global.in index e92b395376bef7ec060564314c1396e2f9d5dee8..f6b299bcf59097cf2c1f22f2569b4a639075cd6e 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -266,17 +266,26 @@ LD = @LD@ with_gnu_ld = @with_gnu_ld@ ld_R_works = @ld_R_works@ -# We want -L for libpgport.a and libpgcommon.a to be first in LDFLAGS. We -# also need LDFLAGS to be a "recursively expanded" variable, else adjustments -# to rpathdir don't work right. So we must NOT do LDFLAGS := something, -# meaning this has to be done first and elsewhere we must only do LDFLAGS += -# something. +# It's critical that within LDFLAGS, all -L switches pointing to build-tree +# directories come before any -L switches pointing to external directories. +# Otherwise it's possible for, e.g., a platform-provided copy of libpq.so +# to get linked in place of the one we've built. Therefore we adopt the +# convention that the first component of LDFLAGS is an extra variable +# LDFLAGS_INTERNAL, and -L and -l switches for PG's own libraries must be +# put into LDFLAGS_INTERNAL, so they will appear ahead of those for external +# libraries. +# +# We need LDFLAGS and LDFLAGS_INTERNAL to be "recursively expanded" variables, +# else adjustments to, e.g., rpathdir don't work right. So we must NOT do +# "LDFLAGS := something" anywhere, ditto for LDFLAGS_INTERNAL. +# These initial assignments must be "=" type, and elsewhere we must only do +# "LDFLAGS += something" or "LDFLAGS_INTERNAL += something". ifdef PGXS - LDFLAGS = -L$(libdir) + LDFLAGS_INTERNAL = -L$(libdir) else - LDFLAGS = -L$(top_builddir)/src/port -L$(top_builddir)/src/common + LDFLAGS_INTERNAL = -L$(top_builddir)/src/port -L$(top_builddir)/src/common endif -LDFLAGS += @LDFLAGS@ +LDFLAGS = $(LDFLAGS_INTERNAL) @LDFLAGS@ LDFLAGS_EX = @LDFLAGS_EX@ # LDFLAGS_SL might have already been assigned by calling makefile diff --git a/src/Makefile.shlib b/src/Makefile.shlib index c3f5d0f0a3b1a5a1ec695699c781351dbd449790..31d578101d3f9f423c172bc12799e22529515f2a 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -20,12 +20,16 @@ # # NAME Name of library to build (no suffix nor "lib" prefix) # OBJS List of object files to include in library -# SHLIB_LINK If shared library relies on other libraries, -# additional stuff to put in its link command +# SHLIB_LINK Stuff to append to library's link command +# (typically, -L and -l switches for external libraries) +# SHLIB_LINK_INTERNAL -L and -l switches for Postgres-supplied libraries # SHLIB_PREREQS Order-only prerequisites for library build target # SHLIB_EXPORTS (optional) Name of file containing list of symbols to # export, in the format "function_name number" # +# Don't use SHLIB_LINK for references to files in the build tree, or the +# wrong things will happen --- use SHLIB_LINK_INTERNAL for those! +# # When building a shared library, the following version information # must also be set. It should be omitted when building a dynamically # loadable module. @@ -71,6 +75,8 @@ COMPILER = $(CC) $(CFLAGS) LINK.static = $(AR) $(AROPT) +LDFLAGS_INTERNAL += $(SHLIB_LINK_INTERNAL) + ifdef SO_MAJOR_VERSION diff --git a/src/backend/replication/libpqwalreceiver/Makefile b/src/backend/replication/libpqwalreceiver/Makefile index 774adaa24d400b94ca2ab344c20ba8eabbf47a65..552e80d8bd8e3cb8a253001b228e89de319abbe2 100644 --- a/src/backend/replication/libpqwalreceiver/Makefile +++ b/src/backend/replication/libpqwalreceiver/Makefile @@ -15,7 +15,7 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) OBJS = libpqwalreceiver.o -SHLIB_LINK = $(libpq) +SHLIB_LINK_INTERNAL = $(libpq) SHLIB_PREREQS = submake-libpq NAME = libpqwalreceiver diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile index c6322ec26d4b6fa10074b31e7be1fab09ab5b9fa..f95e46a051520291a3c91c1715d5904d2a474148 100644 --- a/src/bin/pg_basebackup/Makefile +++ b/src/bin/pg_basebackup/Makefile @@ -17,19 +17,20 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) +LDFLAGS_INTERNAL += $(libpq_pgport) OBJS=receivelog.o streamutil.o $(WIN32RES) all: pg_basebackup pg_receivexlog pg_recvlogical pg_basebackup: pg_basebackup.o $(OBJS) | submake-libpq submake-libpgport - $(CC) $(CFLAGS) pg_basebackup.o $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) pg_basebackup.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) pg_receivexlog: pg_receivexlog.o $(OBJS) | submake-libpq submake-libpgport - $(CC) $(CFLAGS) pg_receivexlog.o $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) pg_receivexlog.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport - $(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs $(INSTALL_PROGRAM) pg_basebackup$(X) '$(DESTDIR)$(bindir)/pg_basebackup$(X)' diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile index a65c4ed0c8fff888a2c2e4832ec9f1bc02b564e3..8cb7130d5e8a5b1b4a85f47f908cc469bf31c1d9 100644 --- a/src/bin/pg_config/Makefile +++ b/src/bin/pg_config/Makefile @@ -19,7 +19,7 @@ OBJS= pg_config.o $(WIN32RES) # don't include subdirectory-path-dependent -I and -L switches STD_CPPFLAGS := $(filter-out -I$(top_srcdir)/src/include -I$(top_builddir)/src/include,$(CPPFLAGS)) -STD_LDFLAGS := $(filter-out -L$(top_builddir)/src/port,$(LDFLAGS)) +STD_LDFLAGS := $(filter-out -L$(top_builddir)/src/common -L$(top_builddir)/src/port,$(LDFLAGS)) override CPPFLAGS += -DVAL_CONFIGURE="\"$(configure_args)\"" override CPPFLAGS += -DVAL_CC="\"$(CC)\"" diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile index 68d92d31cff9988db923f7c136a65ec26fee00dd..43e88894cc1fa3262154fa9a304ab4df99059c8e 100644 --- a/src/bin/pg_ctl/Makefile +++ b/src/bin/pg_ctl/Makefile @@ -17,13 +17,14 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) +LDFLAGS_INTERNAL += $(libpq_pgport) OBJS= pg_ctl.o $(WIN32RES) all: pg_ctl pg_ctl: $(OBJS) | submake-libpq submake-libpgport - $(CC) $(CFLAGS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs $(INSTALL_PROGRAM) pg_ctl$(X) '$(DESTDIR)$(bindir)/pg_ctl$(X)' diff --git a/src/interfaces/ecpg/compatlib/Makefile b/src/interfaces/ecpg/compatlib/Makefile index 80a9ec08d046e60c0e45a477e805bdd80da3cbda..db0e725fadc254d3ae334e536ef51d380c7e5642 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -21,8 +21,8 @@ override CPPFLAGS := -I../include -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) -I$(top_srcdir)/src/include/utils -DFRONTEND $(CPPFLAGS) override CFLAGS += $(PTHREAD_CFLAGS) -SHLIB_LINK = -L../ecpglib -lecpg -L../pgtypeslib -lpgtypes $(libpq) \ - $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS) +SHLIB_LINK_INTERNAL = -L../ecpglib -lecpg -L../pgtypeslib -lpgtypes $(libpq) +SHLIB_LINK = $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS) SHLIB_PREREQS = submake-ecpglib submake-pgtypeslib SHLIB_EXPORTS = exports.txt diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index e65fea93452cd780d47e741be184b558e91cf43e..f8119acec6f239b26817224bfaa2b2751849d978 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -33,7 +33,8 @@ ifneq ($(PORTNAME), win32) OBJS += thread.o endif -SHLIB_LINK = -L../pgtypeslib -lpgtypes $(libpq) $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS) +SHLIB_LINK_INTERNAL = -L../pgtypeslib -lpgtypes $(libpq) +SHLIB_LINK = $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS) SHLIB_PREREQS = submake-libpq submake-pgtypeslib SHLIB_EXPORTS = exports.txt diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile index 79d15f0124dfc64c56142ac787e77bde85003bc4..83ef5a2d8167131f1d884a21ee1080c35e29180c 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -24,7 +24,7 @@ override CFLAGS += $(PTHREAD_CFLAGS) # Need to recompile any libpgport object files LIBS := $(filter-out -lpgport, $(LIBS)) -SHLIB_LINK += -lm +SHLIB_LINK += $(filter -lm, $(LIBS)) SHLIB_EXPORTS = exports.txt diff --git a/src/interfaces/ecpg/test/Makefile.regress b/src/interfaces/ecpg/test/Makefile.regress index b3d7c1e874af4ec9b1239f8b5cd3c082ddf56189..06c0461f667ab859eada1df5997a0e1eee2210aa 100644 --- a/src/interfaces/ecpg/test/Makefile.regress +++ b/src/interfaces/ecpg/test/Makefile.regress @@ -5,8 +5,9 @@ override CPPFLAGS := -I../../include -I$(top_srcdir)/src/interfaces/ecpg/include -I$(libpq_srcdir) $(CPPFLAGS) override CFLAGS += $(PTHREAD_CFLAGS) -override LDFLAGS := -L../../ecpglib -L../../pgtypeslib $(filter-out -l%, $(libpq)) $(LDFLAGS) -override LIBS := -lecpg -lpgtypes $(filter -l%, $(libpq)) $(LIBS) $(PTHREAD_LIBS) +LDFLAGS_INTERNAL += -L../../ecpglib -lecpg -L../../pgtypeslib -lpgtypes $(libpq) + +override LIBS += $(PTHREAD_LIBS) # Standard way to invoke the ecpg preprocessor ECPG = ../../preproc/ecpg --regression -I$(srcdir)/../../include -I$(srcdir) diff --git a/src/interfaces/ecpg/test/compat_informix/Makefile b/src/interfaces/ecpg/test/compat_informix/Makefile index 8a5e8544967539611f1d0e1acbc2d6d0ff10e59d..d50fdc29fd1c0044fed6e4756bf321cc716cb788 100644 --- a/src/interfaces/ecpg/test/compat_informix/Makefile +++ b/src/interfaces/ecpg/test/compat_informix/Makefile @@ -6,8 +6,7 @@ include $(top_srcdir)/$(subdir)/../Makefile.regress # Use special informix compatibility switch for all tests in this directory ECPG += -C INFORMIX -override LDFLAGS := -L../../compatlib $(LDFLAGS) -override LIBS := -lecpg_compat $(LIBS) +LDFLAGS_INTERNAL += -L../../compatlib -lecpg_compat TESTS = test_informix test_informix.c \ test_informix2 test_informix2.c \ diff --git a/src/interfaces/libpq/test/Makefile b/src/interfaces/libpq/test/Makefile index 01041fb15f0a283fb941df637d19a2c19aaa2955..4832fab9d239858728b2df197fdee80465cb76fe 100644 --- a/src/interfaces/libpq/test/Makefile +++ b/src/interfaces/libpq/test/Makefile @@ -3,11 +3,11 @@ top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global ifeq ($(PORTNAME), win32) -LDLIBS += -lws2_32 +LDFLAGS += -lws2_32 endif override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDLIBS := $(libpq_pgport) $(LDLIBS) +LDFLAGS_INTERNAL += $(libpq_pgport) PROGS = uri-regress diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk index 2cc7699824ca162f4911db50806061eab6f704b4..a6e70ce0d101ccee1e1832fb18359d76976363f4 100644 --- a/src/makefiles/pgxs.mk +++ b/src/makefiles/pgxs.mk @@ -42,7 +42,9 @@ # EXTRA_CLEAN -- extra files to remove in 'make clean' # PG_CPPFLAGS -- will be added to CPPFLAGS # PG_LIBS -- will be added to PROGRAM link line +# PG_LIBS_INTERNAL -- same, for references to libraries within build tree # SHLIB_LINK -- will be added to MODULE_big link line +# SHLIB_LINK_INTERNAL -- same, for references to libraries within build tree # PG_CONFIG -- path to pg_config program for the PostgreSQL installation # to build against (typically just "pg_config" to use the first one in # your PATH) @@ -300,5 +302,5 @@ endif ifdef PROGRAM $(PROGRAM): $(OBJS) - $(CC) $(CFLAGS) $(OBJS) $(PG_LIBS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) $(OBJS) $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@$(X) endif diff --git a/src/test/examples/Makefile b/src/test/examples/Makefile index aee5c044075885e15de65ffef5be0951ed538f99..1064a10be9966c4c5ea0ccfbd209f4de2b967eb4 100644 --- a/src/test/examples/Makefile +++ b/src/test/examples/Makefile @@ -7,11 +7,11 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global ifeq ($(PORTNAME), win32) -LDLIBS += -lws2_32 +LDFLAGS += -lws2_32 endif override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDLIBS := $(libpq_pgport) $(LDLIBS) +LDFLAGS_INTERNAL += $(libpq_pgport) PROGS = testlibpq testlibpq2 testlibpq3 testlibpq4 testlo testlo64