# $Header: /cvsroot/pgsql/contrib/contrib-global.mk,v 1.2 2001/09/16 16:11:08 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
#   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)
override DLLLIBS := $(BE_DLLLIBS) $(DLLLIBS)
endif

ifdef PG_CPPFLAGS
override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS)
endif

all: $(PROGRAM) $(DATA_built) $(addsuffix $(DLSUFFIX), $(MODULES))

ifdef MODULE_big
# shared library parameters
NAME = $(MODULE_big)
SO_MAJOR_VERSION= 0
SO_MINOR_VERSION= 0
rpath =

override DLLLIBS := $(BE_DLLLIBS) $(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


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))
	$(mkinstalldirs) $(DESTDIR)$(bindir)
endif


uninstall:
ifneq (,$(DATA)$(DATA_built))
	rm -f $(addprefix $(DESTDIR)$(datadir)/contrib/, $(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


clean:
ifdef MODULES
	rm -f $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .o, $(MODULES))
endif
ifdef DATA_built
	rm -f $(DATA_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
.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
