I've wanted for a long time to get rid of the pattern rules in the
port-specific Makefiles that generate shared libraries from single
object files.  These patterns duplicate (or, more often, fail to
completely duplicate) the knowledge in Makefile.shlib.  So from
a maintenance point of view centralizing that knowledge is a good
thing.

The stumbling block has been partly that the regression-test makefile
depended on the pattern rules (easily fixed by using Makefile.shlib)
and partly that pgxs.mk (and its predecessor contrib-global.mk) depended
on the pattern rules to handle Makefiles that wanted to build multiple
.so files.  Since Makefile.shlib is designed to handle only one shlib
per build, there wasn't any obvious way to fix that.

The attached proposed patch gets around this by invoking Makefile.shlib
in a way that produces a pattern rule "lib%.so : %.o".  This is
moderately ugly but it gets the job done without changing Makefile.shlib
itself.  Possibly it could be done more cleanly if we were willing
to introduce pattern rules inside Makefile.shlib.

I am not sure if the patch works on non-Unix platforms --- could someone
test on Win32 and Cygwin, in particular?  AIX is weird enough to need
testing too.

Any other comments?

                        regards, tom lane

*** src/makefiles/Makefile.aix.orig     Wed Oct  9 12:21:54 2002
--- src/makefiles/Makefile.aix  Sun Jul 24 16:19:25 2005
***************
*** 23,33 ****
  
  MKLDEXPORT=$(top_srcdir)/src/backend/port/aix/mkldexport.sh
  
- %$(EXPSUFF): %.o
-       $(MKLDEXPORT) $*.o > $*$(EXPSUFF)
- 
- %$(DLSUFFIX): %.o %$(EXPSUFF)
-       @echo Making shared library $@ from $*.o, $*$(EXPSUFF) and postgres.imp
-       $(CC) $(LDFLAGS) $(LDFLAGS_SL) -o $@ $*.o 
-Wl,-bI:$(top_builddir)/src/backend/$(POSTGRES_IMP) -Wl,-bE:$*$(EXPSUFF) $(LIBS)
- 
  sqlmansect = 7
--- 23,26 ----
*** src/makefiles/Makefile.beos.orig    Thu Dec 16 22:49:58 2004
--- src/makefiles/Makefile.beos Sun Jul 24 16:19:25 2005
***************
*** 8,19 ****
  DLSUFFIX = .so
  CFLAGS_SL = -fpic -DPIC
  
- %.so: %.o
- ifdef PGXS
-       ln -fs $(DESTDIR)$(bindir)/postgres _APP_
- else
-       ln -fs $(top_builddir)/src/backend/postgres _APP_
- endif
-       $(CC) -nostart -Xlinker -soname=$@ -o $@ _APP_ $<
- 
  sqlmansect = 7
--- 8,11 ----
*** src/makefiles/Makefile.bsdi.orig    Tue Dec 21 13:42:04 2004
--- src/makefiles/Makefile.bsdi Sun Jul 24 16:19:26 2005
***************
*** 20,26 ****
  CFLAGS_SL =
  endif
  
- %.so: %.o
-       $(CC) -shared -o $@ $<
- 
  sqlmansect = 7
--- 20,23 ----
*** src/makefiles/Makefile.cygwin.orig  Thu Dec 16 22:52:48 2004
--- src/makefiles/Makefile.cygwin       Sun Jul 24 16:19:26 2005
***************
*** 16,26 ****
  DLSUFFIX = .dll
  CFLAGS_SL =
  
- %.dll: %.o
-       $(DLLTOOL) --export-all --output-def $*.def $<
-       $(DLLWRAP) -o $@ --def $*.def $< $(DLLINIT) $(SHLIB_LINK)
-       rm -f $*.def
- 
  ifneq (,$(findstring backend,$(subdir)))
  ifeq (,$(findstring conversion_procs,$(subdir)))
  override CPPFLAGS+= -DBUILDING_DLL
--- 16,21 ----
*** src/makefiles/Makefile.darwin.orig  Thu Dec 16 22:49:59 2004
--- src/makefiles/Makefile.darwin       Sun Jul 24 16:19:27 2005
***************
*** 10,18 ****
  BE_DLLLIBS= -bundle_loader $(top_builddir)/src/backend/postgres
  endif
  
- # Rule for building shared libs (currently used only for regression test
- # shlib ... should go away, since this is not really enough knowledge)
- %.so: %.o
-       $(CC) -bundle -o $@ $< $(BE_DLLLIBS)
- 
  sqlmansect = 7
--- 10,13 ----
*** src/makefiles/Makefile.dgux.orig    Wed Aug 29 15:14:40 2001
--- src/makefiles/Makefile.dgux Sun Jul 24 16:19:27 2005
***************
*** 2,8 ****
  DLSUFFIX = .so
  CFLAGS_SL = -fpic
  
- %.so: %.o
-       $(CC) -shared -o $@ $<
- 
  sqlmansect = 5
--- 2,5 ----
*** src/makefiles/Makefile.freebsd.orig Tue Dec 21 13:42:10 2004
--- src/makefiles/Makefile.freebsd      Sun Jul 24 16:19:28 2005
***************
*** 13,30 ****
  CFLAGS_SL = -fpic -DPIC
  endif
  
- 
- %.so: %.o
- ifdef ELF_SYSTEM
-       $(LD) -x -shared -o $@ $<
- else
-       $(LD) $(LDREL) $(LDOUT) $<.obj -x $<
-       @echo building shared object $@
-       @rm -f [EMAIL PROTECTED]
-       @${AR} cq [EMAIL PROTECTED] `lorder $<.obj | tsort`
-       ${RANLIB} [EMAIL PROTECTED]
-       @rm -f $@
-       $(LD) -x -Bshareable -Bforcearchive -o $@ [EMAIL PROTECTED]
- endif
- 
  sqlmansect = 7
--- 13,16 ----
*** src/makefiles/Makefile.hpux.orig    Tue Dec 21 13:42:14 2004
--- src/makefiles/Makefile.hpux Sun Jul 24 16:10:28 2005
***************
*** 49,69 ****
     CFLAGS_SL = +z
  endif
  
- # Rule for building shared libs (currently used only for regression test
- # shlib ... should go away, since this is not really enough knowledge)
- %$(DLSUFFIX): %.o
- ifeq ($(GCC), yes)
-   ifeq ($(with_gnu_ld), yes)
-       $(CC) $(LDFLAGS) -shared -o $@ $< `$(CC) $(LDFLAGS) 
-print-libgcc-file-name`
-   else
-       $(LD) -b -o $@ $< `$(CC) $(LDFLAGS) -print-libgcc-file-name`
-   endif
- else
-   ifeq ($(with_gnu_ld), yes)
-       $(CC) $(LDFLAGS) -shared -o $@ $<
-   else
-       $(LD) -b -o $@ $<
-   endif
- endif
- 
  sqlmansect = 5
--- 49,52 ----
*** src/makefiles/Makefile.irix.orig    Tue Dec 21 13:42:17 2004
--- src/makefiles/Makefile.irix Sun Jul 24 16:19:28 2005
***************
*** 6,14 ****
  # PIC is default
  CFLAGS_SL =
  
- %.so: %.o
-       $(LD) -G -Bdynamic -shared -o $@ $< 
- 
  override CPPFLAGS += -U_NO_XOPEN4
  
  ifneq ($(GCC), yes)
--- 6,11 ----
*** src/makefiles/Makefile.linux.orig   Tue Dec 21 13:42:20 2004
--- src/makefiles/Makefile.linux        Sun Jul 24 16:19:29 2005
***************
*** 10,16 ****
  CFLAGS_SL = -fpic
  endif
  
- %.so: %.o
-       $(CC) -shared -o $@ $<
- 
  sqlmansect = 7
--- 10,13 ----
*** src/makefiles/Makefile.netbsd.orig  Tue Dec 21 13:42:24 2004
--- src/makefiles/Makefile.netbsd       Sun Jul 24 16:19:31 2005
***************
*** 15,32 ****
  CFLAGS_SL = -fpic -DPIC
  endif
  
- 
- %.so: %.o
- ifdef ELF_SYSTEM
-       $(LD) -x -Bshareable -o $@ $<
- else
-       $(LD) $(LDREL) $(LDOUT) $<.obj -x $<
-       @echo building shared object $@
-       @rm -f [EMAIL PROTECTED]
-       @${AR} cq [EMAIL PROTECTED] `lorder $<.obj | tsort`
-       ${RANLIB} [EMAIL PROTECTED]
-       @rm -f $@
-       $(LD) -x -Bshareable -Bforcearchive -o $@ [EMAIL PROTECTED]
- endif
- 
  sqlmansect = 7
--- 15,18 ----
*** src/makefiles/Makefile.openbsd.orig Tue Dec 21 13:42:29 2004
--- src/makefiles/Makefile.openbsd      Sun Jul 24 16:19:31 2005
***************
*** 13,30 ****
  CFLAGS_SL = -fpic -DPIC
  endif
  
- 
- %.so: %.o
- ifdef ELF_SYSTEM
-       $(CC) -shared -o $@ $<
- else
-       $(LD) $(LDREL) $(LDOUT) $<.obj -x $<
-       @echo building shared object $@
-       @rm -f [EMAIL PROTECTED]
-       @${AR} cq [EMAIL PROTECTED] `lorder $<.obj | tsort`
-       ${RANLIB} [EMAIL PROTECTED]
-       @rm -f $@
-       $(LD) -x -Bshareable -Bforcearchive -o $@ [EMAIL PROTECTED]
- endif
- 
  sqlmansect = 7
--- 13,16 ----
*** src/makefiles/Makefile.osf.orig     Thu Jan  6 15:55:45 2005
--- src/makefiles/Makefile.osf  Sun Jul 24 16:19:31 2005
***************
*** 3,9 ****
  CFLAGS_SL =
  rpath = -rpath $(rpathdir)
  
- %.so: %.o
-       $(LD) -shared -expect_unresolved '*' -o $@ $<
- 
  sqlmansect = 5
--- 3,6 ----
*** src/makefiles/Makefile.qnx4.orig    Wed Sep  4 18:54:18 2002
--- src/makefiles/Makefile.qnx4 Sun Jul 24 16:19:32 2005
***************
*** 10,16 ****
  DLSUFFIX = .so
  CFLAGS_SL =
  
- %$(DLSUFFIX): %.o
-       @echo 'cannot make shared object $@ from $<'
- 
  sqlmansect = 7
--- 10,13 ----
*** src/makefiles/Makefile.sco.orig     Tue Dec 21 13:42:35 2004
--- src/makefiles/Makefile.sco  Sun Jul 24 16:19:32 2005
***************
*** 8,13 ****
  CFLAGS_SL = -K PIC
  endif
  
- %.so: %.o
-       $(LD) -G -Bdynamic -o $@ $<
  sqlmansect = 7
--- 8,11 ----
*** src/makefiles/Makefile.solaris.orig Tue Dec 21 13:47:42 2004
--- src/makefiles/Makefile.solaris      Sun Jul 24 16:19:33 2005
***************
*** 16,22 ****
  CFLAGS_SL = -KPIC
  endif
  
- %.so: %.o
-       $(LD) -G -Bdynamic -o $@ $<
- 
  sqlmansect = 5sql
--- 16,19 ----
*** src/makefiles/Makefile.sunos4.orig  Wed Sep  4 18:54:18 2002
--- src/makefiles/Makefile.sunos4       Sun Jul 24 16:19:33 2005
***************
*** 7,13 ****
  CFLAGS_SL = -PIC
  endif
  
- %.so: %.o
-       $(LD) -assert pure-text -Bdynamic -o $@ $<
- 
  sqlmansect = 7
--- 7,10 ----
*** src/makefiles/Makefile.svr4.orig    Wed Aug 29 15:14:40 2001
--- src/makefiles/Makefile.svr4 Sun Jul 24 16:19:34 2005
***************
*** 8,14 ****
  DLSUFFIX = .so
  CFLAGS_SL =
  
- %.so: %.o
-       $(LD) -G -Bdynamic -o $@ $<
- 
  sqlmansect = 5
--- 8,11 ----
*** src/makefiles/Makefile.ultrix4.orig Wed Aug 29 15:14:40 2001
--- src/makefiles/Makefile.ultrix4      Sun Jul 24 16:19:34 2005
***************
*** 6,12 ****
  # "-G 0" works for both DEC cc and GNU cc.
  CFLAGS_SL = -G 0
  
- %.so: %.c
-       $(CC) -c -G 0 $(CPPFLAGS) $(CFLAGS) -o $@ $<
- 
  sqlmansect = 7
--- 6,9 ----
*** src/makefiles/Makefile.univel.orig  Wed Aug 29 15:14:40 2001
--- src/makefiles/Makefile.univel       Sun Jul 24 16:19:35 2005
***************
*** 3,9 ****
  DLSUFFIX = .so
  CFLAGS_SL = -K PIC
  
- %.so: %.o
-       $(LD) -G -Bdynamic -o $@ $<
- 
  sqlmansect = 5
--- 3,6 ----
*** src/makefiles/Makefile.unixware.orig        Tue Dec 21 13:42:39 2004
--- src/makefiles/Makefile.unixware     Sun Jul 24 16:19:35 2005
***************
*** 13,18 ****
--- 13,21 ----
  endif
  endif
  
+ # Unixware needs threads for everything that uses libpq
+ CFLAGS += $(PTHREAD_CFLAGS)
+ 
  DLSUFFIX = .so
  ifeq ($(GCC), yes)
  CFLAGS_SL = -fpic
***************
*** 25,34 ****
  SO_FLAGS = -G
  endif
  
- %.so: %.o
-       $(CC) $(SO_FLAGS) -o $@ $<
- 
  sqlmansect = 5sql
- 
- # Unixware needs threads for everything that uses libpq
- CFLAGS += $(PTHREAD_CFLAGS)
--- 28,31 ----
*** src/makefiles/Makefile.win32.orig   Thu Dec 16 22:52:49 2004
--- src/makefiles/Makefile.win32        Sun Jul 24 16:19:36 2005
***************
*** 16,26 ****
  DLSUFFIX = .dll
  CFLAGS_SL =
  
- %.dll: %.o
-       $(DLLTOOL) --export-all --output-def $*.def $<
-       $(DLLWRAP) -o $@ --def $*.def $< $(DLLINIT) $(SHLIB_LINK)
-       rm -f $*.def
- 
  ifneq (,$(findstring backend,$(subdir)))
  ifeq (,$(findstring conversion_procs,$(subdir)))
  override CPPFLAGS+= -DBUILDING_DLL
--- 16,21 ----
*** src/makefiles/pgxs.mk.orig  Tue May 17 14:26:22 2005
--- src/makefiles/pgxs.mk       Sun Jul 24 17:33:00 2005
***************
*** 14,23 ****
  #   PGXS := $(shell pg_config --pgxs)
  #   include $(PGXS)
  #
! # The following variables can be set:
  #
! #   MODULES -- list of shared objects to be build from source file with
  #     same stem (do not include suffix in this list)
  #   DATA -- random files to install into $PREFIX/share/contrib
  #   DATA_built -- random files to install into $PREFIX/share/contrib,
  #     which need to be built first
--- 14,29 ----
  #   PGXS := $(shell pg_config --pgxs)
  #   include $(PGXS)
  #
! # Set at most one of these three variables to describe code to be built:
  #
! #   MODULES -- list of shared objects to be built from source files with
  #     same stem (do not include suffix in this list)
+ #   MODULE_big -- a single shared object to build from multiple source
+ #     files (list object files in OBJS)
+ #   PROGRAM -- an executable program to build (list object files in OBJS)
+ #
+ # The following can also be set:
+ #
  #   DATA -- random files to install into $PREFIX/share/contrib
  #   DATA_built -- random files to install into $PREFIX/share/contrib,
  #     which need to be built first
***************
*** 26,43 ****
  #   SCRIPTS_built -- script files (not binaries) to install into $PREFIX/bin,
  #     which need to be built first
  #   REGRESS -- list of regression test cases (without suffix)
- #
- # or at most one of these two:
- #
- #   PROGRAM -- a binary program to build (list objects files in OBJS)
- #   MODULE_big -- a shared object to build (list object files in OBJS)
- #
- # The following can also be set:
- #
  #   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
! #   SHLIB_LINK -- will be added to MODULE_big link line
  #
  # Better look at some of the existing uses for examples...
  
--- 32,41 ----
  #   SCRIPTS_built -- script files (not binaries) to install into $PREFIX/bin,
  #     which need to be built first
  #   REGRESS -- list of regression test cases (without suffix)
  #   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
! #   SHLIB_LINK -- will be added to MODULES or MODULE_big link line
  #
  # Better look at some of the existing uses for examples...
  
***************
*** 61,88 ****
  
  override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
  
- ifdef MODULES
- override CFLAGS += $(CFLAGS_SL)
- SHLIB_LINK += $(BE_DLLLIBS)
- endif
- 
  ifdef PG_CPPFLAGS
  override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS)
  endif
  
  all: $(PROGRAM) $(DATA_built) $(SCRIPTS_built) $(addsuffix $(DLSUFFIX), 
$(MODULES))
  
  ifdef MODULE_big
  # shared library parameters
  NAME = $(MODULE_big)
  SO_MAJOR_VERSION= 0
  SO_MINOR_VERSION= 0
  
  SHLIB_LINK += $(BE_DLLLIBS)
  
  include $(top_srcdir)/src/Makefile.shlib
  
  all: all-lib
  endif # MODULE_big
  
  
--- 59,113 ----
  
  override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
  
  ifdef PG_CPPFLAGS
  override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS)
  endif
  
  all: $(PROGRAM) $(DATA_built) $(SCRIPTS_built) $(addsuffix $(DLSUFFIX), 
$(MODULES))
  
+ ifdef MODULES
+ 
+ # set up shared library parameters to produce a pattern rule lib%.so : %.o
+ NAME = %
+ SO_MAJOR_VERSION= 0
+ SO_MINOR_VERSION= 0
+ OBJS := %.o
+ 
+ SHLIB_LINK += $(BE_DLLLIBS)
+ 
+ include $(top_srcdir)/src/Makefile.shlib
+ 
+ # Now adjust $(OBJS) so that evaluation of the pattern rule works correctly
+ OBJS = $<
+ 
+ # This rule converts libNAME.so to NAME.so and gets rid of extra symlinks
+ %$(DLSUFFIX): $(shlib)
+       rm -f $@
+       ln $< $@
+ ifneq ($(shlib), $(shlib_major))
+       rm -f $(shlib_major)
+ endif
+ ifneq ($(shlib), $(shlib_bare))
+       rm -f $(shlib_bare)
+ endif
+ 
+ endif # MODULES
+ 
+ 
  ifdef MODULE_big
+ 
  # shared library parameters
  NAME = $(MODULE_big)
  SO_MAJOR_VERSION= 0
  SO_MINOR_VERSION= 0
+ # OBJS must have been set by caller
  
  SHLIB_LINK += $(BE_DLLLIBS)
  
  include $(top_srcdir)/src/Makefile.shlib
  
  all: all-lib
+ 
  endif # MODULE_big
  
  
*** src/test/regress/GNUmakefile.orig   Sun Jul 17 14:28:45 2005
--- src/test/regress/GNUmakefile        Sun Jul 24 17:27:58 2005
***************
*** 1,13 ****
  #-------------------------------------------------------------------------
  #
  # GNUmakefile--
! #    Makefile for regress (the regression tests)
  #
! # Copyright (c) 1994, Regents of the University of California
  #
! #
! # IDENTIFICATION
! #    $PostgreSQL: pgsql/src/test/regress/GNUmakefile,v 1.50 2005/07/17 
18:28:45 tgl Exp $
  #
  #-------------------------------------------------------------------------
  
--- 1,12 ----
  #-------------------------------------------------------------------------
  #
  # GNUmakefile--
! #    Makefile for src/test/regress (the regression tests)
  #
! # Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
! # Portions Copyright (c) 1994, Regents of the University of California
  #
! # $PostgreSQL: pgsql/src/test/regress/GNUmakefile,v 1.50 2005/07/17 18:28:45 
tgl Exp $
  #
  #-------------------------------------------------------------------------
  
***************
*** 17,27 ****
  
  contribdir := $(top_builddir)/contrib
  
- override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
- override CFLAGS += $(CFLAGS_SL)
- 
- SHLIB_LINK = $(BE_DLLLIBS)
- 
  # port number for temp-installation test postmaster
  TEMP_PORT = 5$(DEF_PGPORT)
  
--- 16,21 ----
***************
*** 59,71 ****
  
  # Build dynamically-loaded object file for CREATE FUNCTION ... LANGUAGE 'C'.
  
! DLOBJS := regress$(DLSUFFIX)
! # This is for some platforms
! ifdef EXPSUFF
! DLOBJS += regress$(EXPSUFF)
! endif
  
! all: $(DLOBJS)
  
  
  # Build test input and expected files
--- 53,71 ----
  
  # Build dynamically-loaded object file for CREATE FUNCTION ... LANGUAGE 'C'.
  
! NAME = regress
! SO_MAJOR_VERSION= 0
! SO_MINOR_VERSION= 0
! OBJS = regress.o
! SHLIB_LINK = $(BE_DLLLIBS)
! 
! include $(top_srcdir)/src/Makefile.shlib
! 
! all: $(NAME)$(DLSUFFIX)
  
! $(NAME)$(DLSUFFIX): $(shlib)
!       rm -f $(NAME)$(DLSUFFIX)
!       $(LN_S) $(shlib) $(NAME)$(DLSUFFIX)
  
  
  # Build test input and expected files
***************
*** 163,172 ****
  ## Clean up
  ##
  
! clean distclean maintainer-clean:
  # things built by `all' target
        $(MAKE) -C $(contribdir)/spi clean
!       rm -f $(output_files) $(input_files) $(DLOBJS) regress.o pg_regress
  # things created by various check targets
        rm -rf testtablespace
        rm -rf results tmp_check log
--- 163,173 ----
  ## Clean up
  ##
  
! clean distclean maintainer-clean: clean-lib
  # things built by `all' target
+       rm -f $(NAME)$(DLSUFFIX) $(OBJS)
        $(MAKE) -C $(contribdir)/spi clean
!       rm -f $(output_files) $(input_files) pg_regress
  # things created by various check targets
        rm -rf testtablespace
        rm -rf results tmp_check log
---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to