From dddfc4cb2edcfa5497f5d50190a7fb046c51da16 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 3 Apr 2018 16:26:05 -0400 Subject: [PATCH] Prevent accidental linking of system-supplied copies of libpq.so etc. We were being careless in some places about the order of -L switches in link command lines, such that -L switches referring to external directories could come before those referring to directories within the build tree. This made it possible to accidentally link a system-supplied library, for example /usr/lib/libpq.so, in place of the one built in the build tree. Hilarity ensued, the more so the older the system-supplied library is. To fix, break LDFLAGS into two parts, a sub-variable LDFLAGS_INTERNAL and the main LDFLAGS variable, both of which are "recursively expanded" so that they can be incrementally adjusted by different makefiles. Establish a policy that -L switches for directories in the build tree must always be added to LDFLAGS_INTERNAL, while -L switches for external directories must always be added to LDFLAGS. This is sufficient to ensure a safe search order. For simplicity, we typically also put -l switches for the respective libraries into those same variables. (Traditional make usage would have us put -l switches into LIBS, but cleaning that up is a project for another day, as there's no clear need for it.) This turns out to also require separating SHLIB_LINK into two variables, SHLIB_LINK and SHLIB_LINK_INTERNAL, with a similar rule about which switches go into which variable. And likewise for PG_LIBS. Although this change might appear to affect external users of pgxs.mk, I think it doesn't; they shouldn't have any need to touch the _INTERNAL variables. In passing, tweak src/common/Makefile so that the value of CPPFLAGS recorded in pg_config lacks "-DFRONTEND" and the recorded value of LDFLAGS lacks "-L../../../src/common". Both of those things are mistakes, apparently introduced during prior code rearrangements, as old versions of pg_config don't print them. In general we don't want anything that's specific to the src/common subdirectory to appear in those outputs. This is certainly a bug fix, but in view of the lack of field complaints, I'm unsure whether it's worth the risk of back-patching. In any case it seems wise to see what the buildfarm makes of it first. Discussion: https://postgr.es/m/25214.1522604295@sss.pgh.pa.us --- contrib/dblink/Makefile | 2 +- contrib/hstore_plperl/Makefile | 2 +- contrib/hstore_plpython/Makefile | 2 +- contrib/jsonb_plperl/Makefile | 2 +- contrib/jsonb_plpython/Makefile | 2 +- contrib/ltree_plpython/Makefile | 2 +- contrib/oid2name/Makefile | 2 +- contrib/postgres_fdw/Makefile | 2 +- contrib/spi/Makefile | 2 -- contrib/vacuumlo/Makefile | 2 +- src/Makefile.global.in | 25 +++++++++++++------ src/Makefile.shlib | 10 ++++++-- .../replication/libpqwalreceiver/Makefile | 3 ++- src/bin/initdb/Makefile | 2 +- src/bin/pg_basebackup/Makefile | 2 +- src/bin/pg_ctl/Makefile | 2 +- src/bin/pg_dump/Makefile | 2 +- src/bin/pg_rewind/Makefile | 2 +- src/bin/pg_upgrade/Makefile | 2 +- src/bin/pgbench/Makefile | 2 +- src/bin/psql/Makefile | 2 +- src/bin/scripts/Makefile | 2 +- src/common/Makefile | 8 +++--- src/interfaces/ecpg/compatlib/Makefile | 4 +-- src/interfaces/ecpg/ecpglib/Makefile | 3 ++- src/interfaces/ecpg/pgtypeslib/Makefile | 2 +- src/interfaces/ecpg/test/Makefile.regress | 5 ++-- .../ecpg/test/compat_informix/Makefile | 3 +-- src/interfaces/libpq/test/Makefile | 4 +-- src/makefiles/pgxs.mk | 4 ++- src/test/examples/Makefile | 4 +-- src/tools/findoidjoins/Makefile | 2 +- 32 files changed, 66 insertions(+), 49 deletions(-) diff --git a/contrib/dblink/Makefile b/contrib/dblink/Makefile index 5189758dab..b1a5e06383 100644 --- a/contrib/dblink/Makefile +++ b/contrib/dblink/Makefile @@ -3,7 +3,7 @@ MODULE_big = dblink OBJS = dblink.o $(WIN32RES) PG_CPPFLAGS = -I$(libpq_srcdir) -SHLIB_LINK = $(libpq) +SHLIB_LINK_INTERNAL = $(libpq) EXTENSION = dblink DATA = dblink--1.2.sql dblink--1.1--1.2.sql dblink--1.0--1.1.sql \ diff --git a/contrib/hstore_plperl/Makefile b/contrib/hstore_plperl/Makefile index c0906db1f5..f63cba2745 100644 --- a/contrib/hstore_plperl/Makefile +++ b/contrib/hstore_plperl/Makefile @@ -28,7 +28,7 @@ ifeq ($(PORTNAME), win32) # these settings are the same as for plperl override CPPFLAGS += -DPLPERL_HAVE_UID_GID -Wno-comment # ... see silliness in plperl Makefile ... -SHLIB_LINK += $(sort $(wildcard ../../src/pl/plperl/libperl*.a)) +SHLIB_LINK_INTERNAL += $(sort $(wildcard ../../src/pl/plperl/libperl*.a)) else rpathdir = $(perl_archlibexp)/CORE SHLIB_LINK += $(perl_embed_ldflags) diff --git a/contrib/hstore_plpython/Makefile b/contrib/hstore_plpython/Makefile index 7ff787a22e..b81735ab91 100644 --- a/contrib/hstore_plpython/Makefile +++ b/contrib/hstore_plpython/Makefile @@ -26,7 +26,7 @@ endif # We must link libpython explicitly ifeq ($(PORTNAME), win32) # ... see silliness in plpython Makefile ... -SHLIB_LINK += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) +SHLIB_LINK_INTERNAL += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) else rpathdir = $(python_libdir) SHLIB_LINK += $(python_libspec) $(python_additional_libs) diff --git a/contrib/jsonb_plperl/Makefile b/contrib/jsonb_plperl/Makefile index 8c427c545a..b9fe943197 100644 --- a/contrib/jsonb_plperl/Makefile +++ b/contrib/jsonb_plperl/Makefile @@ -27,7 +27,7 @@ ifeq ($(PORTNAME), win32) # these settings are the same as for plperl override CPPFLAGS += -DPLPERL_HAVE_UID_GID -Wno-comment # ... see silliness in plperl Makefile ... -SHLIB_LINK += $(sort $(wildcard ../../src/pl/plperl/libperl*.a)) +SHLIB_LINK_INTERNAL += $(sort $(wildcard ../../src/pl/plperl/libperl*.a)) else rpathdir = $(perl_archlibexp)/CORE SHLIB_LINK += $(perl_embed_ldflags) diff --git a/contrib/jsonb_plpython/Makefile b/contrib/jsonb_plpython/Makefile index 8c7090a884..b3c98e6db0 100644 --- a/contrib/jsonb_plpython/Makefile +++ b/contrib/jsonb_plpython/Makefile @@ -26,7 +26,7 @@ endif # We must link libpython explicitly ifeq ($(PORTNAME), win32) # ... see silliness in plpython Makefile ... -SHLIB_LINK += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) +SHLIB_LINK_INTERNAL += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) else rpathdir = $(python_libdir) SHLIB_LINK += $(python_libspec) $(python_additional_libs) diff --git a/contrib/ltree_plpython/Makefile b/contrib/ltree_plpython/Makefile index bc7502b8c3..7e988c7993 100644 --- a/contrib/ltree_plpython/Makefile +++ b/contrib/ltree_plpython/Makefile @@ -26,7 +26,7 @@ endif # We must link libpython explicitly ifeq ($(PORTNAME), win32) # ... see silliness in plpython Makefile ... -SHLIB_LINK += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) +SHLIB_LINK_INTERNAL += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) else rpathdir = $(python_libdir) SHLIB_LINK += $(python_libspec) $(python_additional_libs) diff --git a/contrib/oid2name/Makefile b/contrib/oid2name/Makefile index 3414b4a5cc..3eef8f60be 100644 --- a/contrib/oid2name/Makefile +++ b/contrib/oid2name/Makefile @@ -7,7 +7,7 @@ PROGRAM = oid2name OBJS = oid2name.o $(WIN32RES) 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/postgres_fdw/Makefile b/contrib/postgres_fdw/Makefile index 354331247a..85394b4f1f 100644 --- a/contrib/postgres_fdw/Makefile +++ b/contrib/postgres_fdw/Makefile @@ -5,7 +5,7 @@ OBJS = postgres_fdw.o option.o deparse.o connection.o shippable.o $(WIN32RES) PGFILEDESC = "postgres_fdw - foreign data wrapper for PostgreSQL" 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 10ab5bb5fe..42aa3740c4 100644 --- a/contrib/spi/Makefile +++ b/contrib/spi/Makefile @@ -17,8 +17,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 b4ba896fba..71106ff69c 100644 --- a/contrib/vacuumlo/Makefile +++ b/contrib/vacuumlo/Makefile @@ -7,7 +7,7 @@ PROGRAM = vacuumlo OBJS = vacuumlo.o $(WIN32RES) 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 04cace1017..2dac3ff897 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -290,17 +290,26 @@ LLVM_LIBS=@LLVM_LIBS@ LD = @LD@ with_gnu_ld = @with_gnu_ld@ -# 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 74d48c56f2..95b82a6dea 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. @@ -70,6 +74,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 a7a5fe1ed2..75b0e2b49f 100644 --- a/src/backend/replication/libpqwalreceiver/Makefile +++ b/src/backend/replication/libpqwalreceiver/Makefile @@ -15,7 +15,8 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) OBJS = libpqwalreceiver.o $(WIN32RES) -SHLIB_LINK = $(libpq) $(filter -lintl, $(LIBS)) +SHLIB_LINK_INTERNAL = $(libpq) +SHLIB_LINK = $(filter -lintl, $(LIBS)) SHLIB_PREREQS = submake-libpq PGFILEDESC = "libpqwalreceiver - receive WAL during streaming replication" NAME = libpqwalreceiver diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index dae3daf8bd..8c23941930 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -19,7 +19,7 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(CPPFLAGS) # note: we need libpq only because fe_utils does -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) # use system timezone data? ifneq (,$(with_system_tzdata)) diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile index 54f915eec7..74dfb7ab33 100644 --- a/src/bin/pg_basebackup/Makefile +++ b/src/bin/pg_basebackup/Makefile @@ -19,7 +19,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) OBJS=receivelog.o streamutil.o walmethods.o $(WIN32RES) diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile index 4afc791cad..0202853871 100644 --- a/src/bin/pg_ctl/Makefile +++ b/src/bin/pg_ctl/Makefile @@ -20,7 +20,7 @@ include $(top_builddir)/src/Makefile.global # but let's not pull that in on platforms where we don't need it. ifeq ($(PORTNAME), win32) override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += $(libpq_pgport) SUBMAKE_LIBPQ := submake-libpq endif diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index e3bfc95f16..c46804ab8b 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -17,7 +17,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) OBJS= pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \ pg_backup_null.o pg_backup_tar.o pg_backup_directory.o \ diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile index 422c3eeba8..2bcfcc61af 100644 --- a/src/bin/pg_rewind/Makefile +++ b/src/bin/pg_rewind/Makefile @@ -16,7 +16,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS) -override LDFLAGS := $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += $(libpq_pgport) OBJS = pg_rewind.o parsexlog.o xlogreader.o datapagemap.o timeline.o \ fetch.o file_ops.o copy_fetch.o libpq_fetch.o filemap.o logging.o \ diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 1d6ee702c6..adb0d5d707 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -12,7 +12,7 @@ OBJS = check.o controldata.o dump.o exec.o file.o function.o info.o \ tablespace.o util.o version.o $(WIN32RES) override CPPFLAGS := -DDLSUFFIX=\"$(DLSUFFIX)\" -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) all: pg_upgrade diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile index 8a8e516896..25abd0a875 100644 --- a/src/bin/pgbench/Makefile +++ b/src/bin/pgbench/Makefile @@ -10,7 +10,7 @@ include $(top_builddir)/src/Makefile.global OBJS = pgbench.o exprparse.o $(WIN32RES) override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) ifneq ($(PORTNAME), win32) override CFLAGS += $(PTHREAD_CFLAGS) diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile index 2ad73d03a1..cd1b1b6ee9 100644 --- a/src/bin/psql/Makefile +++ b/src/bin/psql/Makefile @@ -19,7 +19,7 @@ include $(top_builddir)/src/Makefile.global REFDOCDIR= $(top_srcdir)/doc/src/sgml/ref override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) OBJS= command.o common.o copy.o crosstabview.o \ describe.o help.o input.o large_obj.o mainloop.o \ diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile index 0cc528e965..4c6e4b9395 100644 --- a/src/bin/scripts/Makefile +++ b/src/bin/scripts/Makefile @@ -19,7 +19,7 @@ include $(top_builddir)/src/Makefile.global PROGRAMS = createdb createuser dropdb dropuser clusterdb vacuumdb reindexdb pg_isready override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) all: $(PROGRAMS) diff --git a/src/common/Makefile b/src/common/Makefile index 80e78d72fe..873fbb6438 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -24,12 +24,9 @@ subdir = src/common top_builddir = ../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -DFRONTEND $(CPPFLAGS) -LIBS += $(PTHREAD_LIBS) - # 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)\"" override CPPFLAGS += -DVAL_CPPFLAGS="\"$(STD_CPPFLAGS)\"" @@ -40,6 +37,9 @@ override CPPFLAGS += -DVAL_LDFLAGS_EX="\"$(LDFLAGS_EX)\"" override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\"" override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\"" +override CPPFLAGS := -DFRONTEND $(CPPFLAGS) +LIBS += $(PTHREAD_LIBS) + OBJS_COMMON = base64.o config_info.o controldata_utils.o exec.o ip.o \ keywords.o md5.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o \ rmtree.o saslprep.o scram-common.o string.o unicode_norm.o \ diff --git a/src/interfaces/ecpg/compatlib/Makefile b/src/interfaces/ecpg/compatlib/Makefile index cd03af56a9..ebfd89544a 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -22,8 +22,8 @@ override CPPFLAGS := -I../include -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) -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 bc20cf77af..d25d248616 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -35,7 +35,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 0945f3d5bc..29264ce7b7 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -25,7 +25,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 b3d7c1e874..06c0461f66 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 8a5e854496..d50fdc29fd 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 01041fb15f..4832fab9d2 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 5beb1e6b3c..c038836e73 100644 --- a/src/makefiles/pgxs.mk +++ b/src/makefiles/pgxs.mk @@ -45,7 +45,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) @@ -315,5 +317,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 31da210a31..a67f456904 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 diff --git a/src/tools/findoidjoins/Makefile b/src/tools/findoidjoins/Makefile index a3462b937c..1af0a93a89 100644 --- a/src/tools/findoidjoins/Makefile +++ b/src/tools/findoidjoins/Makefile @@ -13,7 +13,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -override LDFLAGS := $(libpq_pgport) $(LDFLAGS) +LDFLAGS_INTERNAL += $(libpq_pgport) OBJS= findoidjoins.o -- 2.40.0