From: Peter Eisentraut Date: Fri, 30 Jul 2004 12:26:40 +0000 (+0000) Subject: PostgreSQL extension makefile framework ("pgxs"), by Fabien Coelho, with X-Git-Tag: REL9_0_0~12310 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=adf57cd7e2dca8ded31645e2f2b2deb5e4515c83;p=pg-rex%2Fsyncrep.git PostgreSQL extension makefile framework ("pgxs"), by Fabien Coelho, with some massaging by Peter Eisentraut. This is basically a simple generalization of the existing contrib makefiles. --- diff --git a/GNUmakefile.in b/GNUmakefile.in index b927866ed4..44c0ad6304 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -1,7 +1,7 @@ # # PostgreSQL top level makefile # -# $PostgreSQL: pgsql/GNUmakefile.in,v 1.39 2004/06/13 21:51:36 petere Exp $ +# $PostgreSQL: pgsql/GNUmakefile.in,v 1.40 2004/07/30 12:26:39 petere Exp $ # subdir = @@ -11,16 +11,19 @@ include $(top_builddir)/src/Makefile.global all: $(MAKE) -C doc all $(MAKE) -C src all + $(MAKE) -C config all @echo "All of PostgreSQL successfully made. Ready to install." install: $(MAKE) -C doc install $(MAKE) -C src install + $(MAKE) -C config install @echo "PostgreSQL installation complete." installdirs uninstall distprep: $(MAKE) -C doc $@ $(MAKE) -C src $@ + $(MAKE) -C config $@ install-all-headers: $(MAKE) -C src $@ @@ -31,6 +34,7 @@ clean: $(MAKE) -C doc $@ $(MAKE) -C contrib $@ $(MAKE) -C src $@ + $(MAKE) -C config $@ # Garbage from autoconf: @rm -rf autom4te.cache/ @@ -39,6 +43,7 @@ clean: distclean maintainer-clean: -$(MAKE) -C doc $@ -$(MAKE) -C contrib $@ + -$(MAKE) -C config $@ -$(MAKE) -C src $@ -rm -f config.cache config.log config.status GNUmakefile # Garbage from autoconf: diff --git a/config/Makefile b/config/Makefile new file mode 100644 index 0000000000..f37af2a6d6 --- /dev/null +++ b/config/Makefile @@ -0,0 +1,16 @@ +# $PostgreSQL: pgsql/config/Makefile,v 1.1 2004/07/30 12:26:39 petere Exp $ + +subdir = config +top_builddir = .. +include $(top_builddir)/src/Makefile.global + + +install: all installdirs + $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(pgxsdir)/config/install-sh + $(INSTALL_SCRIPT) $(srcdir)/mkinstalldirs $(DESTDIR)$(pgxsdir)/config/mkinstalldirs + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(pgxsdir)/config + +uninstall: + rm -f $(DESTDIR)$(pgxsdir)/config/install-sh $(DESTDIR)$(pgxsdir)/config/mkinstalldirs diff --git a/contrib/contrib-global.mk b/contrib/contrib-global.mk index 51e0ef18da..11e0293e01 100644 --- a/contrib/contrib-global.mk +++ b/contrib/contrib-global.mk @@ -1,234 +1,4 @@ -# $PostgreSQL: pgsql/contrib/contrib-global.mk,v 1.7 2003/11/29 19:51:18 pgsql Exp $ +# $PostgreSQL: pgsql/contrib/contrib-global.mk,v 1.8 2004/07/30 12:26:39 petere Exp $ -# This file contains generic rules to build many kinds of simple -# contrib modules. You only need to set a few variables and include -# this file, the rest will be done here. -# -# Use the following layout for your Makefile: -# -# subdir = contrib/xxx -# top_builddir = ../.. -# include $(top_builddir)/src/Makefile.global -# -# [variable assignments, see below] -# [custom rules, rarely necessary] -# -# include $(top_srcdir)/contrib/contrib-global.mk -# -# 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 -# DOCS -- random files to install under $PREFIX/doc/contrib -# SCRIPTS -- script files (not binaries) to install into $PREFIX/bin -# 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... - - -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 -rpath = - -SHLIB_LINK += $(BE_DLLLIBS) - -include $(top_srcdir)/src/Makefile.shlib - -all: all-lib -endif # MODULE_big - - -install: all installdirs -ifneq (,$(DATA)$(DATA_built)) - @for file in $(addprefix $(srcdir)/, $(DATA)) $(DATA_built); do \ - echo "$(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/contrib"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/contrib; \ - done -endif # DATA -ifdef MODULES - @for file in $(addsuffix $(DLSUFFIX), $(MODULES)); do \ - echo "$(INSTALL_SHLIB) $$file $(DESTDIR)$(pkglibdir)"; \ - $(INSTALL_SHLIB) $$file $(DESTDIR)$(pkglibdir); \ - done -endif # MODULES -ifdef DOCS - @for file in $(addprefix $(srcdir)/, $(DOCS)); do \ - echo "$(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/contrib"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/contrib; \ - done -endif # DOCS -ifdef PROGRAM - $(INSTALL_PROGRAM) $(PROGRAM)$(X) $(DESTDIR)$(bindir) -endif # PROGRAM -ifdef MODULE_big - $(INSTALL_SHLIB) $(shlib) $(DESTDIR)$(pkglibdir)/$(MODULE_big)$(DLSUFFIX) -endif # MODULE_big -ifdef SCRIPTS - @for file in $(addprefix $(srcdir)/, $(SCRIPTS)); do \ - echo "$(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir)"; \ - $(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir); \ - done -endif # SCRIPTS -ifdef SCRIPTS_built - @for file in $(SCRIPTS_built); do \ - echo "$(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir)"; \ - $(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir); \ - done -endif # SCRIPTS_built - - -installdirs: -ifneq (,$(DATA)$(DATA_built)) - $(mkinstalldirs) $(DESTDIR)$(datadir)/contrib -endif -ifneq (,$(MODULES)$(MODULE_big)) - $(mkinstalldirs) $(DESTDIR)$(pkglibdir) -endif -ifdef DOCS - $(mkinstalldirs) $(DESTDIR)$(docdir)/contrib -endif -ifneq (,$(PROGRAM)$(SCRIPTS)$(SCRIPTS_built)) - $(mkinstalldirs) $(DESTDIR)$(bindir) -endif - - -uninstall: -ifneq (,$(DATA)$(DATA_built)) - rm -f $(addprefix $(DESTDIR)$(datadir)/contrib/, $(notdir $(DATA) $(DATA_built))) -endif -ifdef MODULES - rm -f $(addprefix $(DESTDIR)$(pkglibdir)/, $(addsuffix $(DLSUFFIX), $(MODULES))) -endif -ifdef DOCS - rm -f $(addprefix $(DESTDIR)$(docdir)/contrib/, $(DOCS)) -endif -ifdef PROGRAM - rm -f $(DESTDIR)$(bindir)/$(PROGRAM)$(X) -endif -ifdef MODULE_big - rm -f $(DESTDIR)$(pkglibdir)/$(MODULE_big)$(DLSUFFIX) -endif -ifdef SCRIPTS - rm -f $(addprefix $(DESTDIR)$(bindir)/, $(SCRIPTS)) -endif -ifdef SCRIPTS_built - rm -f $(addprefix $(DESTDIR)$(bindir)/, $(SCRIPTS_built)) -endif - - -clean: -ifdef MODULES - rm -f $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .o, $(MODULES)) -endif -ifdef DATA_built - rm -f $(DATA_built) -endif -ifdef SCRIPTS_built - rm -f $(SCRIPTS_built) -endif -ifdef PROGRAM - rm -f $(PROGRAM)$(X) -endif -ifdef OBJS - rm -f $(OBJS) -endif -ifdef EXTRA_CLEAN - rm -f $(EXTRA_CLEAN) -endif -ifdef REGRESS -# things created by various check targets - rm -rf results tmp_check log - rm -f regression.diffs regression.out regress.out run_check.out -ifeq ($(PORTNAME), win) - rm -f regress.def -endif -endif # REGRESS - -ifdef MODULE_big -clean: clean-lib -endif - -distclean maintainer-clean: clean - - -ifdef REGRESS - -# When doing a VPATH build, must copy over the test .sql and .out -# files so that the driver script can find them. We have to use an -# absolute path for the targets, because otherwise make will try to -# locate the missing files using VPATH, and will find them in -# $(srcdir), but the point here is that we want to copy them from -# $(srcdir) to the build directory. - -ifdef VPATH -abs_builddir := $(shell pwd) -test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard $(srcdir)/expected/*.out) $(wildcard $(srcdir)/data/*.data) -test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, $(test_files_src)) - -all: $(test_files_build) -$(test_files_build): $(abs_builddir)/%: $(srcdir)/% - ln -s $< $@ -endif # VPATH - -.PHONY: submake -submake: - $(MAKE) -C $(top_builddir)/src/test/regress pg_regress - -# against installed postmaster -installcheck: submake - $(top_builddir)/src/test/regress/pg_regress $(REGRESS) - -# in-tree test doesn't work yet (no way to install my shared library) -#check: all submake -# $(top_builddir)/src/test/regress/pg_regress --temp-install \ -# --top-builddir=$(top_builddir) $(REGRESS) -check: - @echo "'make check' is not supported." - @echo "Do 'make install', then 'make installcheck' instead." -endif # REGRESS - - -# STANDARD RULES - -ifneq (,$(MODULES)$(MODULE_big)) -%.sql: %.sql.in - sed 's,MODULE_PATHNAME,$$libdir/$*,g' $< >$@ -endif - -ifdef PROGRAM -$(PROGRAM): $(OBJS) - $(CC) $(CFLAGS) $(OBJS) $(PG_LIBS) $(LDFLAGS) $(LIBS) -o $@ -endif +NO_PGXS = 1 +include $(top_srcdir)/src/makefiles/pgxs.mk diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index 6ec5836047..2f99f062b5 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -1,5 +1,5 @@ @@ -1610,6 +1610,199 @@ concat_text(PG_FUNCTION_ARGS) &dfunc; + + Extension build infrastructure + + + pgxs + + + + If you are thinking about distributing your PostgreSQL extension + modules, setting up a portable build system for them can be fairly + difficult. Therefore the PostgreSQL installation provides a build + infrastructure for extensions, called PGXS, so + that simple extension modules can be built simply against an + already installed server. Note that this infrastructure is not + intended to be a universal build system framework that can be used + to build all software interfacing to PostgreSQL; it simply + automates common build rules for simple server extension modules. + For more complicated packages, you need to write your own build + system. + + + + To use the infrastructure for your extension, you must write a + simple makefile. In that makefile, you need to set some variables + and finally include the global PGXS makefile. + Here is an example that builds an extension module named + isbn_issn consisting of a shared library, an + SQL script, and a documentation text file: + +MODULES = isbn_issn +DATA_built = isbn_issn.sql +DOCS = README.isbn_issn + +PGXS := $(shell pg_config --pgxs) +include $(PGXS) + + The last two lines should always be the same. Earlier in the + file, you assign variables or add custom + make rules. + + + + 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 + + + + + + DOCS + + + random files to install under + prefix/doc/contrib + + + + + + SCRIPTS + + + script files (not binaries) to install into + prefix/bin + + + + + + 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 + + + + + + + + Put this makefile as Makefile in the directory + which holds your extension. Then you can do + make to compile, and later make + install to install your module. The extension is + compiled and installed for the + PostgreSQL installation that + corresponds to the first pg_config command + found in your path. + + + + Composite-Type Arguments in C-Language Functions diff --git a/src/Makefile b/src/Makefile index a42b0620e0..1221c332a3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,7 +4,7 @@ # # Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/Makefile,v 1.32 2004/04/30 04:31:52 momjian Exp $ +# $PostgreSQL: pgsql/src/Makefile,v 1.33 2004/07/30 12:26:40 petere Exp $ # #------------------------------------------------------------------------- @@ -22,10 +22,30 @@ all install installdirs uninstall dep depend distprep: $(MAKE) -C interfaces $@ $(MAKE) -C bin $@ $(MAKE) -C pl $@ + $(MAKE) -C makefiles $@ + $(MAKE) -C utils $@ + +install: install-local + +install-local: installdirs-local + $(INSTALL_DATA) Makefile.global $(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.global + $(INSTALL_DATA) Makefile.port $(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.port + $(INSTALL_DATA) $(srcdir)/Makefile.shlib $(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.shlib + $(INSTALL_DATA) $(srcdir)/nls-global.mk $(DESTDIR)$(pgxsdir)/$(subdir)/nls-global.mk install-all-headers: $(MAKE) -C include $@ +installdirs: installdirs-local + +installdirs-local: + $(mkinstalldirs) $(DESTDIR)$(pgxsdir)/$(subdir) + +uninstall: uninstall-local + +uninstall-local: + rm -f $(addprefix $(DESTDIR)$(pgxsdir)/$(subdir), Makefile.global Makefile.port Makefile.shlib nls-global.mk) + clean: $(MAKE) -C port $@ $(MAKE) -C timezone $@ @@ -34,6 +54,7 @@ clean: $(MAKE) -C interfaces $@ $(MAKE) -C bin $@ $(MAKE) -C pl $@ + $(MAKE) -C makefiles $@ $(MAKE) -C test $@ $(MAKE) -C tutorial $@ $(MAKE) -C utils $@ @@ -47,8 +68,12 @@ distclean maintainer-clean: -$(MAKE) -C interfaces $@ -$(MAKE) -C bin $@ -$(MAKE) -C pl $@ + -$(MAKE) -C makefiles $@ -$(MAKE) -C test $@ -$(MAKE) -C tutorial $@ -$(MAKE) -C utils $@ -$(MAKE) -C tools/thread $@ rm -f Makefile.port Makefile.global + + +.PHONY: install-local installdirs-local uninstall-local diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 7a56b9ba46..7ccf9b00ef 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -1,5 +1,5 @@ # -*-makefile-*- -# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.189 2004/06/02 21:05:52 momjian Exp $ +# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.190 2004/07/30 12:26:40 petere Exp $ #------------------------------------------------------------------------------ # All PostgreSQL makefiles include this file and use the variables it sets, @@ -116,6 +116,8 @@ endif localedir := @localedir@ +pgxsdir = $(pkglibdir)/pgxs + ########################################################################## # @@ -166,10 +168,15 @@ COLLATEINDEX = @COLLATEINDEX@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ + +ifdef PGXS +override CPPFLAGS := -I$(includedir_server) -I$(includedir_internal) $(CPPFLAGS) +else # not PGXS override CPPFLAGS := -I$(top_srcdir)/src/include $(CPPFLAGS) ifdef VPATH override CPPFLAGS := -I$(top_builddir)/src/include $(CPPFLAGS) endif +endif # not PGXS CC = @CC@ GCC = @GCC@ @@ -366,6 +373,9 @@ TAS = @TAS@ %.bz2: % $(BZIP2) -f $< + +ifndef PGXS + # Remake Makefile.global from Makefile.global.in if the latter # changed. In order to trigger this rule, the including file must # write `include $(top_builddir)/src/Makefile.global', not some @@ -393,6 +403,8 @@ $(top_builddir)/src/include/stamp-h: $(top_srcdir)/src/include/pg_config.h.in $( $(top_builddir)/config.status: $(top_srcdir)/configure cd $(top_builddir) && ./config.status --recheck +endif # not PGXS + install-strip: @$(MAKE) INSTALL_PROGRAM_ENV="STRIPPROG='$(STRIP)'" \ diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile index 134a80372d..8fa0f94a7e 100644 --- a/src/bin/pg_config/Makefile +++ b/src/bin/pg_config/Makefile @@ -1,4 +1,4 @@ -# $PostgreSQL: pgsql/src/bin/pg_config/Makefile,v 1.6 2003/11/29 19:52:04 pgsql Exp $ +# $PostgreSQL: pgsql/src/bin/pg_config/Makefile,v 1.7 2004/07/30 12:26:40 petere Exp $ subdir = src/bin/pg_config top_builddir = ../../.. @@ -12,6 +12,7 @@ pg_config: pg_config.sh $(top_builddir)/src/Makefile.global Makefile -e 's,@includedir_server@,$(includedir_server),g' \ -e 's,@libdir@,$(libdir),g' \ -e 's,@pkglibdir@,$(pkglibdir),g' \ + -e 's,@pgxsdir@,$(pgxsdir),g' \ -e "s|@configure@|$(configure_args)|g" \ -e 's,@version@,$(VERSION),g' \ $< >$@ diff --git a/src/bin/pg_config/pg_config.sh b/src/bin/pg_config/pg_config.sh index e6d1824f20..673462d2af 100644 --- a/src/bin/pg_config/pg_config.sh +++ b/src/bin/pg_config/pg_config.sh @@ -7,7 +7,7 @@ # Author: Peter Eisentraut # Public domain -# $PostgreSQL: pgsql/src/bin/pg_config/pg_config.sh,v 1.9 2003/11/29 19:52:04 pgsql Exp $ +# $PostgreSQL: pgsql/src/bin/pg_config/pg_config.sh,v 1.10 2004/07/30 12:26:40 petere Exp $ me=`basename $0` @@ -17,6 +17,7 @@ val_includedir='@includedir@' val_includedir_server='@includedir_server@' val_libdir='@libdir@' val_pkglibdir='@pkglibdir@' +val_pgxsdir='@pgxsdir@' val_configure="@configure@" val_version='@version@' @@ -33,6 +34,7 @@ Options: --includedir-server show location of C header files for the server --libdir show location of object code libraries --pkglibdir show location of dynamically loadable modules + --pgxs show location of extension makefile --configure show options given to 'configure' script when PostgreSQL was built --version show the PostgreSQL version, then exit @@ -60,11 +62,12 @@ do show="$show \$val_includedir_server";; --libdir) show="$show \$val_libdir";; --pkglibdir) show="$show \$val_pkglibdir";; + --pgxs) show="$show \$val_pgxsdir/src/makefiles/pgxs.mk";; --configure) show="$show \$val_configure";; - --version) echo "PostgreSQL $val_version" + --version) echo "PostgreSQL $val_version" exit 0;; - --help|-\?) echo "$help" + --help|-\?) echo "$help" exit 0;; *) echo "$me: invalid argument: $opt" 1>&2 echo "$advice" 1>&2 diff --git a/src/makefiles/Makefile b/src/makefiles/Makefile new file mode 100644 index 0000000000..a33d6df7ab --- /dev/null +++ b/src/makefiles/Makefile @@ -0,0 +1,15 @@ +# $PostgreSQL: pgsql/src/makefiles/Makefile,v 1.1 2004/07/30 12:26:40 petere Exp $ + +subdir = src/makefiles +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global + + +install: all installdirs + $(INSTALL_DATA) $(srcdir)/pgxs.mk $(DESTDIR)$(pgxsdir)/$(subdir)/ + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(pgxsdir)/$(subdir) + +uninstall: + rm -f $(DESTDIR)$(pgxsdir)/$(subdir)/pgxs.mk diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk new file mode 100644 index 0000000000..1ca974c3ed --- /dev/null +++ b/src/makefiles/pgxs.mk @@ -0,0 +1,250 @@ +# PGXS: PostgreSQL extensions makefile + +# $PostgreSQL: pgsql/src/makefiles/pgxs.mk,v 1.1 2004/07/30 12:26:40 petere Exp $ + +# This file contains generic rules to build many kinds of simple +# extension modules. You only need to set a few variables and include +# this file, the rest will be done here. +# +# Use the following layout for your Makefile: +# +# [variable assignments, see below] +# [custom rules, rarely necessary] +# +# 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 +# DOCS -- random files to install under $PREFIX/doc/contrib +# SCRIPTS -- script files (not binaries) to install into $PREFIX/bin +# 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... + +ifndef PGXS +ifndef NO_PGXS +$(error pgxs error: makefile variable PGXS or NO_PGXS must be set) +endif +endif + + +ifdef PGXS +# We assume that we are in src/makefiles/, so top is ... +top_builddir := $(dir $(PGXS))/../.. +include $(top_builddir)/src/Makefile.global + +top_srcdir = $(top_builddir) +srcdir = . +VPATH = +endif + + +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 +rpath = + +SHLIB_LINK += $(BE_DLLLIBS) + +include $(top_srcdir)/src/Makefile.shlib + +all: all-lib +endif # MODULE_big + + +install: all installdirs +ifneq (,$(DATA)$(DATA_built)) + @for file in $(addprefix $(srcdir)/, $(DATA)) $(DATA_built); do \ + echo "$(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/contrib"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/contrib; \ + done +endif # DATA +ifdef MODULES + @for file in $(addsuffix $(DLSUFFIX), $(MODULES)); do \ + echo "$(INSTALL_SHLIB) $$file $(DESTDIR)$(pkglibdir)"; \ + $(INSTALL_SHLIB) $$file $(DESTDIR)$(pkglibdir); \ + done +endif # MODULES +ifdef DOCS + @for file in $(addprefix $(srcdir)/, $(DOCS)); do \ + echo "$(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/contrib"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/contrib; \ + done +endif # DOCS +ifdef PROGRAM + $(INSTALL_PROGRAM) $(PROGRAM)$(X) $(DESTDIR)$(bindir) +endif # PROGRAM +ifdef MODULE_big + $(INSTALL_SHLIB) $(shlib) $(DESTDIR)$(pkglibdir)/$(MODULE_big)$(DLSUFFIX) +endif # MODULE_big +ifdef SCRIPTS + @for file in $(addprefix $(srcdir)/, $(SCRIPTS)); do \ + echo "$(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir)"; \ + $(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir); \ + done +endif # SCRIPTS +ifdef SCRIPTS_built + @for file in $(SCRIPTS_built); do \ + echo "$(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir)"; \ + $(INSTALL_SCRIPT) $$file $(DESTDIR)$(bindir); \ + done +endif # SCRIPTS_built + + +installdirs: +ifneq (,$(DATA)$(DATA_built)) + $(mkinstalldirs) $(DESTDIR)$(datadir)/contrib +endif +ifneq (,$(MODULES)$(MODULE_big)) + $(mkinstalldirs) $(DESTDIR)$(pkglibdir) +endif +ifdef DOCS + $(mkinstalldirs) $(DESTDIR)$(docdir)/contrib +endif +ifneq (,$(PROGRAM)$(SCRIPTS)$(SCRIPTS_built)) + $(mkinstalldirs) $(DESTDIR)$(bindir) +endif + + +uninstall: +ifneq (,$(DATA)$(DATA_built)) + rm -f $(addprefix $(DESTDIR)$(datadir)/contrib/, $(notdir $(DATA) $(DATA_built))) +endif +ifdef MODULES + rm -f $(addprefix $(DESTDIR)$(pkglibdir)/, $(addsuffix $(DLSUFFIX), $(MODULES))) +endif +ifdef DOCS + rm -f $(addprefix $(DESTDIR)$(docdir)/contrib/, $(DOCS)) +endif +ifdef PROGRAM + rm -f $(DESTDIR)$(bindir)/$(PROGRAM)$(X) +endif +ifdef MODULE_big + rm -f $(DESTDIR)$(pkglibdir)/$(MODULE_big)$(DLSUFFIX) +endif +ifdef SCRIPTS + rm -f $(addprefix $(DESTDIR)$(bindir)/, $(SCRIPTS)) +endif +ifdef SCRIPTS_built + rm -f $(addprefix $(DESTDIR)$(bindir)/, $(SCRIPTS_built)) +endif + + +clean: +ifdef MODULES + rm -f $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .o, $(MODULES)) +endif +ifdef DATA_built + rm -f $(DATA_built) +endif +ifdef SCRIPTS_built + rm -f $(SCRIPTS_built) +endif +ifdef PROGRAM + rm -f $(PROGRAM)$(X) +endif +ifdef OBJS + rm -f $(OBJS) +endif +ifdef EXTRA_CLEAN + rm -f $(EXTRA_CLEAN) +endif +ifdef REGRESS +# things created by various check targets + rm -rf results tmp_check log + rm -f regression.diffs regression.out regress.out run_check.out +ifeq ($(PORTNAME), win) + rm -f regress.def +endif +endif # REGRESS + +ifdef MODULE_big +clean: clean-lib +endif + +distclean maintainer-clean: clean + + +ifdef REGRESS + +# When doing a VPATH build, must copy over the test .sql and .out +# files so that the driver script can find them. We have to use an +# absolute path for the targets, because otherwise make will try to +# locate the missing files using VPATH, and will find them in +# $(srcdir), but the point here is that we want to copy them from +# $(srcdir) to the build directory. + +ifdef VPATH +abs_builddir := $(shell pwd) +test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard $(srcdir)/expected/*.out) $(wildcard $(srcdir)/data/*.data) +test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, $(test_files_src)) + +all: $(test_files_build) +$(test_files_build): $(abs_builddir)/%: $(srcdir)/% + ln -s $< $@ +endif # VPATH + +.PHONY: submake +submake: + $(MAKE) -C $(top_builddir)/src/test/regress pg_regress + +# against installed postmaster +installcheck: submake + $(top_builddir)/src/test/regress/pg_regress $(REGRESS) + +# in-tree test doesn't work yet (no way to install my shared library) +#check: all submake +# $(top_builddir)/src/test/regress/pg_regress --temp-install \ +# --top-builddir=$(top_builddir) $(REGRESS) +check: + @echo "'make check' is not supported." + @echo "Do 'make install', then 'make installcheck' instead." +endif # REGRESS + + +# STANDARD RULES + +ifneq (,$(MODULES)$(MODULE_big)) +%.sql: %.sql.in + sed 's,MODULE_PATHNAME,$$libdir/$*,g' $< >$@ +endif + +ifdef PROGRAM +$(PROGRAM): $(OBJS) + $(CC) $(CFLAGS) $(OBJS) $(PG_LIBS) $(LDFLAGS) $(LIBS) -o $@ +endif diff --git a/src/utils/Makefile b/src/utils/Makefile index 5a98b17aa1..7726144510 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -2,7 +2,7 @@ # # Makefile for utils # -# $PostgreSQL: pgsql/src/utils/Makefile,v 1.20 2003/11/29 19:52:15 pgsql Exp $ +# $PostgreSQL: pgsql/src/utils/Makefile,v 1.21 2004/07/30 12:26:40 petere Exp $ # # dllinit.o is only built on Win32 platform. # @@ -12,7 +12,21 @@ subdir = src/utils top_builddir = ../.. include $(top_builddir)/src/Makefile.global + +ifdef DLLINIT + all: +install: all installdirs + $(INSTALL_DATA) dllinit.o $(DESTDIR)$(pgxsdir)/$(subdir)/ + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(pgxsdir)/$(subdir) + +uninstall: + rm -f $(DESTDIR)$(pgxsdir)/$(subdir)/dllinit.o + clean distclean maintainer-clean: rm -f dllinit.o + +endif # not DLLINIT