diff options
| author | Tom Lane | 2018-09-27 15:23:43 +0000 |
|---|---|---|
| committer | Tom Lane | 2018-09-27 15:23:43 +0000 |
| commit | ea53100d5671b5b243f77898b0b04d23c38b2820 (patch) | |
| tree | 4828a035056e37e3b7ff6eb4fa84a86c90138cee /src/port/Makefile | |
| parent | ce4887bd025b95c7b455fefd817a418844c6aad3 (diff) | |
Build src/port files as a library with -fPIC, and use that in libpq.
libpq and ecpg need shared-library-friendly versions of assorted src/port/
and src/common/ modules. Up to now, they got those by symlinking the
individual source files and compiling them locally. That's baroque, and a
pain to maintain, and it results in some amount of duplicated compile work.
It might've made sense when only a couple of files were needed, but the
list has grown and grown and grown :-(
It makes more sense to have the originating directory build a third variant
of libpgport.a/libpgcommon.a containing modules built with $(CFLAGS_SL),
and just link that into the shared library. Unused files won't get linked,
so the end result should be the same.
This patch makes a down payment on that idea by having src/port/ build
such a library and making libpq use it. If the buildfarm doesn't expose
fatal problems with the approach, I'll extend it to the other cases.
Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'src/port/Makefile')
| -rw-r--r-- | src/port/Makefile | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/src/port/Makefile b/src/port/Makefile index a2ee8e2d6d0..ec62a31d29f 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -1,18 +1,23 @@ #------------------------------------------------------------------------- # # Makefile -# Makefile for the port-specific subsystem of the backend +# Makefile for src/port # -# These files are used in other directories for portability on systems -# with broken/missing library files, and for common code sharing. +# These files are used by the Postgres backend, and also by frontend +# programs. Primarily, they are meant to provide portability on systems +# with broken/missing library files. # -# This makefile generates two outputs: +# This makefile generates three outputs: # # libpgport.a - contains object files with FRONTEND defined, -# for use by client application and libraries +# for use by client applications +# +# libpgport_shlib.a - contains object files with FRONTEND defined, +# built suitably for use in shared libraries; for use +# by libpq and other frontend libraries # # libpgport_srv.a - contains object files without FRONTEND defined, -# for use only by the backend binaries +# for use only by the backend # # LIBOBJS is set by configure (via Makefile.global) to be the list of object # files that are conditionally needed as determined by configure's probing. @@ -40,12 +45,15 @@ ifeq ($(enable_strong_random), yes) OBJS += pg_strong_random.o endif -# foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND +# libpgport.a, libpgport_shlib.a, and libpgport_srv.a contain the same files +# foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c +OBJS_SHLIB = $(OBJS:%.o=%_shlib.o) OBJS_SRV = $(OBJS:%.o=%_srv.o) -all: libpgport.a libpgport_srv.a +all: libpgport.a libpgport_shlib.a libpgport_srv.a # libpgport is needed by some contrib +# currently we don't install libpgport_shlib.a, maybe we should? install: all installdirs $(INSTALL_STLIB) libpgport.a '$(DESTDIR)$(libdir)/libpgport.a' @@ -59,18 +67,38 @@ libpgport.a: $(OBJS) rm -f $@ $(AR) $(AROPT) $@ $^ -# thread.o needs PTHREAD_CFLAGS (but thread_srv.o does not) +# thread.o and thread_shlib.o need PTHREAD_CFLAGS (but thread_srv.o does not) thread.o: CFLAGS+=$(PTHREAD_CFLAGS) +thread_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS) -# pg_crc32c_sse42.o and its _srv.o version need CFLAGS_SSE42 +# all versions of pg_crc32c_sse42.o need CFLAGS_SSE42 pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_SSE42) +pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_SSE42) pg_crc32c_sse42_srv.o: CFLAGS+=$(CFLAGS_SSE42) -# pg_crc32c_armv8.o and its _srv.o version need CFLAGS_ARMV8_CRC32C +# all versions of pg_crc32c_armv8.o need CFLAGS_ARMV8_CRC32C pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) +pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) # +# Shared library versions of object files +# + +libpgport_shlib.a: $(OBJS_SHLIB) + rm -f $@ + $(AR) $(AROPT) $@ $^ + +# Because this uses its own compilation rule, it doesn't use the +# dependency tracking logic from Makefile.global. To make sure that +# dependency tracking works anyway for the *_shlib.o files, depend on +# their *.o siblings as well, which do have proper dependencies. It's +# a hack that might fail someday if there is a *_shlib.o without a +# corresponding *.o, but there seems little reason for that. +%_shlib.o: %.c %.o + $(CC) $(CFLAGS) $(CFLAGS_SL) $(CPPFLAGS) -c $< -o $@ + +# # Server versions of object files # @@ -92,6 +120,8 @@ libpgport_srv.a: $(OBJS_SRV) path.o: path.c pg_config_paths.h +path_shlib.o: path.c pg_config_paths.h + path_srv.o: path.c pg_config_paths.h # We create a separate file rather than put these in pg_config.h @@ -112,4 +142,5 @@ pg_config_paths.h: $(top_builddir)/src/Makefile.global echo "#define MANDIR \"$(mandir)\"" >>$@ clean distclean maintainer-clean: - rm -f libpgport.a libpgport_srv.a $(OBJS) $(OBJS_SRV) pg_config_paths.h + rm -f libpgport.a libpgport_shlib.a libpgport_srv.a + rm -f $(OBJS) $(OBJS_SHLIB) $(OBJS_SRV) pg_config_paths.h |
