Proposed patch to remove .so pattern rules from platform Makefiles - Mailing list pgsql-patches

From Tom Lane
Subject Proposed patch to remove .so pattern rules from platform Makefiles
Date
Msg-id 14717.1122242415@sss.pgh.pa.us
Whole thread Raw
List pgsql-patches
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 $@.pic
-     @${AR} cq $@.pic `lorder $<.obj | tsort`
-     ${RANLIB} $@.pic
-     @rm -f $@
-     $(LD) -x -Bshareable -Bforcearchive -o $@ $@.pic
- 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 $@.pic
-     @${AR} cq $@.pic `lorder $<.obj | tsort`
-     ${RANLIB} $@.pic
-     @rm -f $@
-     $(LD) -x -Bshareable -Bforcearchive -o $@ $@.pic
- 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 $@.pic
-     @${AR} cq $@.pic `lorder $<.obj | tsort`
-     ${RANLIB} $@.pic
-     @rm -f $@
-     $(LD) -x -Bshareable -Bforcearchive -o $@ $@.pic
- 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

pgsql-patches by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: [HACKERS] Autovacuum loose ends
Next
From: Tom Lane
Date:
Subject: Re: Regression - GNUmakefile - pg_usleep