Improved parallel make support
authorPeter Eisentraut <[email protected]>
Fri, 12 Nov 2010 20:15:16 +0000 (22:15 +0200)
committerPeter Eisentraut <[email protected]>
Fri, 12 Nov 2010 20:15:16 +0000 (22:15 +0200)
Replace for loops in makefiles with proper dependencies.  Parallel
make can now span across directories.  Also, make -k and make -q work
properly.

GNU make 3.80 or newer is now required.

30 files changed:
GNUmakefile.in
contrib/Makefile
contrib/dblink/Makefile
doc/src/sgml/installation.sgml
src/Makefile
src/Makefile.global.in
src/Makefile.shlib
src/backend/Makefile
src/backend/common.mk
src/backend/replication/libpqwalreceiver/Makefile
src/backend/utils/mb/conversion_procs/Makefile
src/bin/Makefile
src/bin/initdb/Makefile
src/bin/pg_config/Makefile
src/bin/pg_controldata/Makefile
src/bin/pg_ctl/Makefile
src/bin/pg_dump/Makefile
src/bin/pg_resetxlog/Makefile
src/bin/psql/Makefile
src/bin/scripts/Makefile
src/interfaces/Makefile
src/interfaces/ecpg/Makefile
src/interfaces/ecpg/compatlib/Makefile
src/interfaces/ecpg/ecpglib/Makefile
src/interfaces/ecpg/preproc/Makefile
src/pl/Makefile
src/test/regress/GNUmakefile
src/timezone/Makefile
src/tools/findoidjoins/Makefile
src/tools/fsync/Makefile

index ed42170a9b5a1aa338da96f73ffd0da562882ad6..8ccbdcc49fb802acc8cbec6194b397ba38fbafac 100644 (file)
@@ -8,57 +8,39 @@ subdir =
 top_builddir = .
 include $(top_builddir)/src/Makefile.global
 
+$(call recurse,all install,src config)
+
 all:
-   $(MAKE) -C src all
-   $(MAKE) -C config all
-   @echo "All of PostgreSQL successfully made. Ready to install."
+   +@echo "All of PostgreSQL successfully made. Ready to install."
 
 docs:
    $(MAKE) -C doc all
 
+$(call recurse,world,doc src config contrib,all)
 world:
-   $(MAKE) -C doc all
-   $(MAKE) -C src all
-   $(MAKE) -C config all
-   $(MAKE) -C contrib all
-   @echo "PostgreSQL, contrib, and documentation successfully made. Ready to install."
+   +@echo "PostgreSQL, contrib, and documentation successfully made. Ready to install."
 
 html man:
    $(MAKE) -C doc $@
 
 install:
-   $(MAKE) -C src $@
-   $(MAKE) -C config $@
-   @echo "PostgreSQL installation complete."
+   +@echo "PostgreSQL installation complete."
 
 install-docs:
    $(MAKE) -C doc install
 
+$(call recurse,install-world,doc src config contrib,install)
 install-world:
-   $(MAKE) -C doc install
-   $(MAKE) -C src install
-   $(MAKE) -C config install
-   $(MAKE) -C contrib install
-   @echo "PostgreSQL, contrib, and documentation installation complete."
+   +@echo "PostgreSQL, contrib, and documentation installation complete."
 
-installdirs uninstall coverage:
-   $(MAKE) -C doc $@
-   $(MAKE) -C src $@
-   $(MAKE) -C config $@
+$(call recurse,installdirs uninstall coverage,doc src config)
 
-distprep:
-   $(MAKE) -C doc $@
-   $(MAKE) -C src $@
-   $(MAKE) -C config $@
-   $(MAKE) -C contrib $@
+$(call recurse,distprep,doc src config contrib)
 
 # clean, distclean, etc should apply to contrib too, even though
 # it's not built by default
+$(call recurse,clean,doc contrib src config)
 clean:
-   $(MAKE) -C doc $@
-   $(MAKE) -C contrib $@
-   $(MAKE) -C src $@
-   $(MAKE) -C config $@
 # Garbage from autoconf:
    @rm -rf autom4te.cache/
 
@@ -78,11 +60,7 @@ check: all
 check installcheck installcheck-parallel:
    $(MAKE) -C src/test $@
 
-installcheck-world:
-   $(MAKE) -C src/test installcheck
-   $(MAKE) -C src/pl installcheck
-   $(MAKE) -C src/interfaces/ecpg installcheck
-   $(MAKE) -C contrib installcheck
+$(call recurse,installcheck-world,src/test src/pl src/interfaces/ecpg contrib,installcheck)
 
 GNUmakefile: GNUmakefile.in $(top_builddir)/config.status
    ./config.status $@
@@ -143,12 +121,4 @@ distcheck: dist
    rm -rf $(distdir) $(dummy)
    @echo "Distribution integrity checks out."
 
-.PHONY: dist distdir distcheck docs install-docs
-
-
-# Temporary measure to explore whether we can start requiring GNU make
-# 3.80.  That version also happens to be the version where the
-# .VARIABLES variable was introduced, so this is a simple check.
-ifndef .VARIABLES
-$(warning warning: GNU make 3.80 or newer might become required soon. You are using version $(MAKE_VERSION).)
-endif
+.PHONY: dist distdir distcheck docs install-docs world install-world installcheck-world
index b7773255341bdd19d10190884d6da22e407c5ee9..e1f2a84cde3d000d400917bc05a40c1a0d7f7fe0 100644 (file)
@@ -63,14 +63,4 @@ endif
 #      start-scripts   \ (does not have a makefile)
 
 
-all install installdirs uninstall distprep clean distclean maintainer-clean:
-   @for dir in $(SUBDIRS); do \
-       $(MAKE) -C $$dir $@ || exit; \
-   done
-
-# We'd like check operations to run all the subtests before failing.
-check installcheck:
-   @CHECKERR=0; for dir in $(SUBDIRS); do \
-       $(MAKE) -C $$dir $@ || CHECKERR=$$?; \
-   done; \
-   exit $$CHECKERR
+$(recurse)
index 148961e6c94a6106eb3bf20c5aaa51b94ae9de2f..cc59128cb2ab78f83d0706d415b954380a5afdea 100644 (file)
@@ -4,6 +4,7 @@ MODULE_big = dblink
 PG_CPPFLAGS = -I$(libpq_srcdir)
 OBJS   = dblink.o
 SHLIB_LINK = $(libpq)
+SHLIB_PREREQS = submake-libpq
 
 DATA_built = dblink.sql 
 DATA = uninstall_dblink.sql 
index d471e6da00ec287b47922af2073d8f6f1d98bfda..0eeaa25af9a847f8c7177ac67a69dd600a6cad1f 100644 (file)
@@ -68,8 +68,8 @@ su - postgres
        <primary>make</primary>
       </indexterm>
 
-      <acronym>GNU</> <application>make</> is required; other
-      <application>make</> programs will <emphasis>not</> work.
+      <acronym>GNU</> <application>make</> version 3.80 or newer is required; other
+      <application>make</> programs or older <acronym>GNU</> <application>make</> versions will <emphasis>not</> work.
       <acronym>GNU</> <application>make</> is often installed under
       the name <filename>gmake</filename>; this document will always
       refer to it by that name. (On some systems
@@ -79,7 +79,6 @@ su - postgres
 <screen>
 <userinput>gmake --version</userinput>
 </screen>
-      It is recommended to use version 3.79.1 or later.
      </para>
     </listitem>
 
index 0e1e43197a4688a1c90ce93ee2df079040683f88..0d4a6ee65b9e45a2d643250649b86674347d7f7b 100644 (file)
@@ -12,20 +12,21 @@ subdir = src
 top_builddir = ..
 include Makefile.global
 
+SUBDIRS = \
+   port \
+   timezone \
+   backend \
+   backend/utils/mb/conversion_procs \
+   backend/snowball \
+   include \
+   interfaces \
+   backend/replication/libpqwalreceiver \
+   bin \
+   pl \
+   makefiles \
+   test/regress
 
-all install installdirs uninstall distprep:
-   $(MAKE) -C port $@
-   $(MAKE) -C timezone $@
-   $(MAKE) -C backend $@
-   $(MAKE) -C backend/utils/mb/conversion_procs $@
-   $(MAKE) -C backend/snowball $@
-   $(MAKE) -C include $@
-   $(MAKE) -C interfaces $@
-   $(MAKE) -C backend/replication/libpqwalreceiver $@
-   $(MAKE) -C bin $@
-   $(MAKE) -C pl $@
-   $(MAKE) -C makefiles $@
-   $(MAKE) -C test/regress $@
+$(recurse)
 
 install: install-local
 
@@ -46,31 +47,11 @@ uninstall-local:
    rm -f $(addprefix '$(DESTDIR)$(pgxsdir)/$(subdir)'/, Makefile.global Makefile.port Makefile.shlib nls-global.mk)
 
 clean:
-   $(MAKE) -C port $@
-   $(MAKE) -C timezone $@
-   $(MAKE) -C backend $@
-   $(MAKE) -C backend/snowball $@
-   $(MAKE) -C include $@
-   $(MAKE) -C interfaces $@
-   $(MAKE) -C backend/replication/libpqwalreceiver $@
-   $(MAKE) -C bin $@
-   $(MAKE) -C pl $@
-   $(MAKE) -C makefiles $@
    $(MAKE) -C test $@
    $(MAKE) -C tutorial NO_PGXS=1 $@
    $(MAKE) -C test/thread $@
 
 distclean maintainer-clean:
-   $(MAKE) -C port $@
-   $(MAKE) -C timezone $@
-   $(MAKE) -C backend $@
-   $(MAKE) -C backend/snowball $@
-   $(MAKE) -C include $@
-   $(MAKE) -C interfaces $@
-   $(MAKE) -C backend/replication/libpqwalreceiver $@
-   $(MAKE) -C bin $@
-   $(MAKE) -C pl $@
-   $(MAKE) -C makefiles $@
    $(MAKE) -C test $@
    $(MAKE) -C tutorial NO_PGXS=1 $@
    $(MAKE) -C test/thread $@
index 5d308453ced325458e943d4bcdc48437a40717cc..d290116f8cdbbadbc8869cedfd1e57afe283064e 100644 (file)
@@ -18,7 +18,9 @@
 #
 # Meta configuration
 
-.PHONY: all install install-strip installdirs uninstall clean distclean maintainer-clean distprep check installcheck maintainer-check coverage html man installcheck-parallel world install-world installcheck-world
+standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check installcheck
+
+.PHONY: $(standard_targets) install-strip maintainer-check html man installcheck-parallel
 
 # make `all' the default target
 all:
@@ -538,6 +540,48 @@ install-strip:
        install
 
 
+##########################################################################
+#
+# Recursive make support
+# ----------------------
+# Instead of recursing through subdirectories with a for loop or
+# repeated $(MAKE) -C whatever calls, this is a little smarter: it
+# allows parallel make across directories and lets make -k and -q work
+# correctly.
+
+# This function is only for internal use below.  It should be called
+# with $(eval).  It will set up a target so that it recurses into
+# subdirectories.
+# $1: target name, e.g., all
+# $2: list of subdirs
+# $3: target to run in subdir, usually same as $1
+define _create_recursive_target
+.PHONY: $(patsubst %,$(1)-%-recursive,$(2))
+$(1): $(patsubst %,$(1)-%-recursive,$(2))
+$(2:%=$(1)-%-recursive):
+   $$(MAKE) -C $$(patsubst $(1)-%-recursive,%,$$@) $(3)
+endef
+# Note that the use of $$ on the last line above is important; we want
+# those variables/functions to be evaluated when the rule is run, not
+# when the $(eval) is run to create the rule.  In the case of
+# $$(MAKE), this is necessary to get make -q working.
+
+# Call this function in a makefile.  In the normal case it doesn't
+# need any arguments.
+# $1: targets to make recursive (defaults to list of standard targets)
+# $2: list of subdirs (defaults to SUBDIRS variable)
+# $3: target to run in subdir (defaults to $1)
+recurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(eval $(call _create_recursive_target,$(target),$(if $2,$2,$(SUBDIRS)),$(if $3,$3,$(target)))))
+
+# We need the $(eval) function and order-only prerequisites, which are
+# available in GNU make 3.80.  That also happens to be the version
+# where the .VARIABLES variable was introduced, so this is a simple
+# check.
+ifndef .VARIABLES
+$(error GNU make 3.80 or newer is required.  You are using version $(MAKE_VERSION))
+endif
+
+
 ##########################################################################
 #
 # Automatic dependency generation
@@ -640,7 +684,6 @@ lcov.info: $(gcda_files)
    $(GCOV) -b -f -p -o . $(GCOVFLAGS) $*.c >$*.c.gcov.out
 
 coverage: $(gcda_files:.gcda=.c.gcov) lcov.info
-   $(if $(SUBDIRS),for dir in $(SUBDIRS); do $(MAKE) -C $$dir coverage || exit; done)
 
 .PHONY: coverage-html
 coverage-html: coverage
index 3e5387fb717f0770ad9ffa4bb45f6e0d957dc9b9..b6dea47f905b16b48dce3b5cccd091255cc8fd48 100644 (file)
@@ -22,6 +22,7 @@
 # OBJS                  List of object files to include in library
 # SHLIB_LINK            If shared library relies on other libraries,
 #                       additional stuff to put in its link command
+# SHLIB_PREREQS         Order-only prerequisites for library build target
 # SHLIB_EXPORTS         (optional) Name of file containing list of symbols to
 #                       export, in the format "function_name  number"
 #
@@ -340,7 +341,7 @@ all-static-lib: $(stlib)
 all-shared-lib: $(shlib)
 
 ifndef haslibarule
-$(stlib): $(OBJS)
+$(stlib): $(OBJS) | $(SHLIB_PREREQS)
    $(LINK.static) $@ $^
    $(RANLIB) $@
 endif #haslibarule
@@ -351,7 +352,7 @@ ifeq (,$(filter cygwin win32,$(PORTNAME)))
 ifneq ($(PORTNAME), aix)
 
 # Normal case
-$(shlib): $(OBJS)
+$(shlib): $(OBJS) | $(SHLIB_PREREQS)
    $(LINK.shared) -o $@ $(OBJS) $(LDFLAGS) $(LDFLAGS_SL) $(SHLIB_LINK)
 ifdef shlib_major
 # If we're using major and minor versions, then make a symlink to major-version-only.
@@ -382,7 +383,7 @@ endif
 else # PORTNAME == aix
 
 # AIX case
-$(shlib) $(stlib): $(OBJS)
+$(shlib) $(stlib): $(OBJS) | $(SHLIB_PREREQS)
    $(LINK.static) $(stlib) $^
    $(RANLIB) $(stlib)
    $(MKLDEXPORT) $(stlib) >$(exports_file)
@@ -408,10 +409,10 @@ else
 DLL_DEFFILE = lib$(NAME)dll.def
 endif
 
-$(shlib): $(OBJS) $(DLL_DEFFILE)
+$(shlib): $(OBJS) $(DLL_DEFFILE) | $(SHLIB_PREREQS)
    $(DLLWRAP) -o $@ --dllname $(shlib) $(DLLWRAP_FLAGS) --def $(DLL_DEFFILE) $(OBJS) $(LDFLAGS) $(LDFLAGS_SL) $(SHLIB_LINK)
 
-$(stlib): $(shlib) $(DLL_DEFFILE)
+$(stlib): $(shlib) $(DLL_DEFFILE) | $(SHLIB_PREREQS)
    $(DLLTOOL) --dllname $(shlib) $(DLLTOOL_LIBFLAGS) --def $(DLL_DEFFILE) --output-lib $@
 
 endif # PORTNAME == cygwin || PORTNAME == win32
index bed086c6f795be02e0efc60a0020109a5ff20d11..9a0f2e21e56d9183805d8d2336163db1a7f3d518 100644 (file)
@@ -122,7 +122,9 @@ submake-schemapg:
 
 .PHONY: submake-schemapg
 
-catalog/schemapg.h: submake-schemapg
+catalog/schemapg.h: | submake-schemapg
+
+$(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport
 
 
 # The postgres.o target is needed by the rule in Makefile.global that
index 5ba8822b4f7cf96569bfd2aa837f5bf1715ba0b3..4e0a5da3334de8807b0a73681c5b3d16ae2c4ba9 100644 (file)
@@ -34,15 +34,13 @@ objfiles.txt: Makefile $(SUBDIROBJS) $(OBJS)
 expand_subsys = $(foreach file,$(1),$(if $(filter %/objfiles.txt,$(file)),$(patsubst ../../src/backend/%,%,$(addprefix $(top_builddir)/,$(shell cat $(file)))),$(file)))
 
 # Parallel make trickery
-$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
+$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
 
 .PHONY: $(SUBDIRS:%=%-recursive)
 $(SUBDIRS:%=%-recursive):
    $(MAKE) -C $(subst -recursive,,$@) all
 
+$(call recurse,clean)
 clean: clean-local
 clean-local:
-ifdef SUBDIRS
-   for dir in $(SUBDIRS); do $(MAKE) -C $$dir clean || exit; done
-endif
    rm -f $(subsysfilename) $(OBJS)
index c310b3ba48ff8611e30f66ca60fb4d15caafe65f..774adaa24d400b94ca2ab344c20ba8eabbf47a65 100644 (file)
@@ -16,9 +16,10 @@ override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS = libpqwalreceiver.o
 SHLIB_LINK = $(libpq)
+SHLIB_PREREQS = submake-libpq
 NAME = libpqwalreceiver
 
-all: submake-libpq all-shared-lib
+all: all-shared-lib
 
 include $(top_srcdir)/src/Makefile.shlib
 
index 3cdc45708e3c5fb381984845f0433fd1d12d589d..0848d9633568da13aaa83959ef1c2aaf0241dc50 100644 (file)
@@ -26,6 +26,8 @@ SUBDIRS = \
    utf8_and_sjis utf8_and_win utf8_and_uhc \
    utf8_and_euc2004 utf8_and_sjis2004 euc2004_sjis2004
 
+$(recurse)
+
 # conversion_name source_encoding destination_encoding function object
 CONVERSIONS = \
        ascii_to_mic    SQL_ASCII MULE_INTERNAL ascii_to_mic ascii_and_mic \
@@ -162,7 +164,6 @@ CONVERSIONS = \
        shift_jis_2004_to_euc_jis_2004 SHIFT_JIS_2004 EUC_JIS_2004 shift_jis_2004_to_euc_jis_2004 euc2004_sjis2004
 
 all: $(SQLSCRIPT)
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
 
 $(SQLSCRIPT): Makefile
 ifeq ($(enable_shared), yes)
@@ -205,15 +206,12 @@ $(REGRESSION_SCRIPT): Makefile
 
 install: $(SQLSCRIPT) installdirs
    $(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
 
 installdirs:
    $(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(pkglibdir)'
 
 uninstall:
    rm -f '$(DESTDIR)$(datadir)/$(SQLSCRIPT)'
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
 
 clean distclean maintainer-clean:
    rm -f $(SQLSCRIPT)
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
index 63b32e4598bfdc84a248b786b628ffd59ae3937f..c81b6654817c2e7c7fa491de083a747a7d479d43 100644 (file)
@@ -19,5 +19,4 @@ ifeq ($(PORTNAME), win32)
 SUBDIRS+=pgevent
 endif
 
-all install installdirs uninstall distprep clean distclean maintainer-clean:
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
+$(recurse)
index 99c8b1bca409a3d3de88a9aa3cd8ec95542a3259..903fbc10970b980694454d039b426e283d29bba8 100644 (file)
@@ -20,9 +20,9 @@ override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS=  initdb.o encnames.o pqsignal.o $(WIN32RES)
 
-all: submake-libpgport initdb
+all: initdb
 
-initdb: $(OBJS)
+initdb: $(OBJS) | submake-libpgport
    $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 # We used to pull in all of libpq to get encnames and pqsignal, but that
index 732144dde6c460967573b003e169587edfe0be14..c7e5a023744cb170e1085d08bf10ead9abf689cc 100644 (file)
@@ -31,9 +31,9 @@ override CPPFLAGS += -DVAL_LDFLAGS_EX="\"$(LDFLAGS_EX)\""
 override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\""
 override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\""
 
-all: submake-libpgport pg_config
+all: pg_config
 
-pg_config: $(OBJS)
+pg_config: $(OBJS) | submake-libpgport
    $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
index bcdf741fdc56819433deb78da259828d6fdafe78..180c5ebfe8d0a08c375bbba55e40280995b8eacd 100644 (file)
@@ -17,9 +17,9 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS= pg_controldata.o pg_crc.o $(WIN32RES)
 
-all: submake-libpgport pg_controldata
+all: pg_controldata
 
-pg_controldata: $(OBJS)
+pg_controldata: $(OBJS) | submake-libpgport
    $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 pg_crc.c: $(top_srcdir)/src/backend/utils/hash/pg_crc.c
index 0d49509724e43be8db0dbe1e47264cb2187ccf60..992799c2155d7a938f0c92f7bb46f8b8bd24733a 100644 (file)
@@ -20,9 +20,9 @@ override CPPFLAGS := -DDEF_PGPORT=$(DEF_PGPORT) -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS=  pg_ctl.o $(WIN32RES)
 
-all: submake-libpq submake-libpgport pg_ctl
+all: pg_ctl
 
-pg_ctl: $(OBJS) $(libpq_builddir)/libpq.a
+pg_ctl: $(OBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
index f4c716ee2fcd0f63d7b194c6915e2a81b952f00c..0367466f845e1cdc21ad0581d92790288278da2b 100644 (file)
@@ -27,15 +27,15 @@ KEYWRDOBJS = keywords.o kwlookup.o
 kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
    rm -f $@ && $(LN_S) $< .
 
-all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall
+all: pg_dump pg_restore pg_dumpall
 
-pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a 
+pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
+pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-pg_dumpall: pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
+pg_dumpall: pg_dumpall.o dumputils.o $(KEYWRDOBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
index 67ba562949f2b957a3d47220cf42606708bf7bcc..ad56a115033819d4faa44cec1de7f97590ef300a 100644 (file)
@@ -17,9 +17,9 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS= pg_resetxlog.o pg_crc.o $(WIN32RES)
 
-all: submake-libpgport pg_resetxlog
+all: pg_resetxlog
 
-pg_resetxlog: $(OBJS)
+pg_resetxlog: $(OBJS) | submake-libpgport
    $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 pg_crc.c: $(top_srcdir)/src/backend/utils/hash/pg_crc.c
index 9e1c3cd6f77b21df04c8f9cb23fd7b55db41b737..a30c668424018bbb01204f5189dec494ca0d9dfd 100644 (file)
@@ -29,9 +29,9 @@ OBJS= command.o common.o help.o input.o stringutils.o mainloop.o copy.o \
 FLEXFLAGS = -Cfe
 
 
-all: submake-libpq submake-libpgport psql
+all: psql
 
-psql: $(OBJS) $(libpq_builddir)/libpq.a
+psql: $(OBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 help.o: sql_help.h
index 4248f3bedd94ec7f50e9703e5fac2466674a45b8..d0b0c1c20e094ee72d32b182b2e1fa51e1b2121b 100644 (file)
@@ -20,20 +20,20 @@ PROGRAMS = createdb createlang createuser dropdb droplang dropuser clusterdb vac
 
 override CPPFLAGS := -I$(top_srcdir)/src/bin/pg_dump -I$(top_srcdir)/src/bin/psql -I$(libpq_srcdir) $(CPPFLAGS)
 
-all: submake-libpq $(PROGRAMS)
+all: $(PROGRAMS)
 
 %: %.o $(WIN32RES)
    $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-createdb: createdb.o common.o dumputils.o kwlookup.o keywords.o
-createlang: createlang.o common.o print.o mbprint.o
-createuser: createuser.o common.o dumputils.o kwlookup.o keywords.o
-dropdb: dropdb.o common.o dumputils.o kwlookup.o keywords.o
-droplang: droplang.o common.o print.o mbprint.o
-dropuser: dropuser.o common.o dumputils.o kwlookup.o keywords.o
-clusterdb: clusterdb.o common.o dumputils.o kwlookup.o keywords.o
-vacuumdb: vacuumdb.o common.o
-reindexdb: reindexdb.o common.o dumputils.o kwlookup.o keywords.o
+createdb: createdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
+createlang: createlang.o common.o print.o mbprint.o | submake-libpq
+createuser: createuser.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
+dropdb: dropdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
+droplang: droplang.o common.o print.o mbprint.o | submake-libpq
+dropuser: dropuser.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
+clusterdb: clusterdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
+vacuumdb: vacuumdb.o common.o | submake-libpq
+reindexdb: reindexdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq
 
 dumputils.c keywords.c: % : $(top_srcdir)/src/bin/pg_dump/%
    rm -f $@ && $(LN_S) $< .
index f208a28919b1d98fa3b5f9b666ff988632903433..2c034bc79238868bbc18266de5865c8a57ff4380 100644 (file)
@@ -14,5 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 SUBDIRS = libpq ecpg
 
-all install installdirs uninstall distprep clean distclean maintainer-clean:
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
+$(recurse)
index 71bfff672d7c77c622db949c1f5dbc82dd6cd196..d955ceed1c99a3d8d0aeaf6b68d07924bff7530b 100644 (file)
@@ -2,19 +2,13 @@ subdir = src/interfaces/ecpg
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-all install installdirs uninstall distprep:
-   $(MAKE) -C include $@
-   $(MAKE) -C pgtypeslib $@
-   $(MAKE) -C ecpglib $@
-   $(MAKE) -C compatlib $@
-   $(MAKE) -C preproc $@
+SUBDIRS = include pgtypeslib ecpglib compatlib preproc
+
+$(recurse)
+
+all-compatlib-recursive: all-ecpglib-recursive
 
 clean distclean maintainer-clean:
-   $(MAKE) -C include $@
-   $(MAKE) -C pgtypeslib $@
-   $(MAKE) -C ecpglib $@
-   $(MAKE) -C compatlib $@
-   $(MAKE) -C preproc $@
    $(MAKE) -C test clean
 
 check checktcp installcheck: all
index d211b7d20a7e3917ccfb7448ba70a9946f869c6a..eb9a76ae74beea5b2d6a31a5e78e54cd0618c99d 100644 (file)
@@ -23,6 +23,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
 
 SHLIB_LINK = -L../ecpglib -lecpg -L../pgtypeslib -lpgtypes $(libpq) \
    $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS)
+SHLIB_PREREQS = submake-ecpglib submake-pgtypeslib
 
 SHLIB_EXPORTS = exports.txt
 
@@ -33,6 +34,14 @@ OBJS= informix.o $(filter snprintf.o, $(LIBOBJS))
 
 all: all-lib
 
+.PHONY: submake-ecpglib submake-pgtypeslib
+
+submake-ecpglib:
+   $(MAKE) -C $(top_builddir)/src/interfaces/ecpg/ecpglib all
+
+submake-pgtypeslib:
+   $(MAKE) -C $(top_builddir)/src/interfaces/ecpg/pgtypeslib all
+
 # Shared library stuff
 include $(top_srcdir)/src/Makefile.shlib
 
index 7d134acd7f37f6bbd8c47d73f6fe6d3540008283..9a29d150c7e4e849c501df09f72dc9b914196ff8 100644 (file)
@@ -34,6 +34,7 @@ OBJS += thread.o
 endif
 
 SHLIB_LINK = -L../pgtypeslib -lpgtypes $(libpq) $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS)
+SHLIB_PREREQS = submake-libpq submake-pgtypeslib
 
 SHLIB_EXPORTS = exports.txt
 
@@ -42,12 +43,10 @@ ifeq ($(PORTNAME), win32)
 SHLIB_LINK += -lshfolder
 endif
 
-all: libpq pgtypeslib all-lib
+all: all-lib
 
-libpq:
-   $(MAKE) -C $(top_builddir)/src/interfaces/libpq all
-
-pgtypeslib:
+.PHONY: submake-pgtypeslib
+submake-pgtypeslib:
    $(MAKE) -C $(top_builddir)/src/interfaces/ecpg/pgtypeslib all
 
 # Shared library stuff
index 8978eeb241ffbf04c8ffa9a89efb1014b69a69cf..e8a6916faa8ce190a5368685eaa779b692b7f183 100644 (file)
@@ -30,11 +30,14 @@ OBJS=   preproc.o type.o ecpg.o output.o parser.o \
    keywords.o c_keywords.o ecpg_keywords.o kwlookup.o ../ecpglib/typename.o descriptor.o variable.o \
    $(WIN32RES)
 
-all: submake-libpgport ecpg
+all: ecpg
 
-ecpg: $(OBJS)
+ecpg: $(OBJS) | submake-libpgport
    $(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $^ $(LIBS) $(PTHREAD_LIBS) -o $@$(X)
 
+../ecpglib/typename.o: ../ecpglib/typename.c
+   $(MAKE) -C $(dir $@) $(notdir $@)
+
 # pgc is compiled as part of preproc
 preproc.o: pgc.c
 
index c625c0de508fa94e4a8892d3e61a8ccee17ed899..ef630fe8d2e1308b5ac90a53527764f6a47e0eba 100644 (file)
@@ -26,12 +26,4 @@ ifeq ($(with_tcl), yes)
 SUBDIRS += tcl
 endif
 
-all install installdirs uninstall distprep clean distclean maintainer-clean:
-   @for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
-
-# We'd like check operations to run all the subtests before failing.
-check installcheck:
-   @CHECKERR=0; for dir in $(SUBDIRS); do \
-       $(MAKE) -C $$dir $@ || CHECKERR=$$?; \
-   done; \
-   exit $$CHECKERR
+$(recurse)
index b2b5b16153c50b3df0746baf65edbddade1a6506..0755304820ce0b9f07c6023170313b4cffe3d128 100644 (file)
@@ -50,9 +50,9 @@ EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \
 
 # Build regression test driver
 
-all: submake-libpgport pg_regress$(X)
+all: pg_regress$(X)
 
-pg_regress$(X): pg_regress.o pg_regress_main.o
+pg_regress$(X): pg_regress.o pg_regress_main.o | submake-libpgport
    $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@
 
 # dependencies ensure that path changes propagate
@@ -131,8 +131,6 @@ $(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX): $(top_builddir
 
 # Tablespace setup
 
-all: tablespace-setup
-
 .PHONY: tablespace-setup
 tablespace-setup:
    rm -rf ./testtablespace
@@ -145,13 +143,13 @@ tablespace-setup:
 
 pg_regress_call = ./pg_regress --inputdir=$(srcdir) --dlpath=. --multibyte=$(MULTIBYTE) $(NOLOCALE)
 
-check: all
+check: all tablespace-setup
    $(pg_regress_call) --temp-install=./tmp_check --top-builddir=$(top_builddir) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) $(TEMP_CONF)
 
-installcheck: all
+installcheck: all tablespace-setup
    $(pg_regress_call) --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule
 
-installcheck-parallel: all
+installcheck-parallel: all tablespace-setup
    $(pg_regress_call) --psqldir=$(PSQLDIR) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT)
 
 standbycheck: all
@@ -163,10 +161,10 @@ runcheck: check
 runtest: installcheck
 runtest-parallel: installcheck-parallel
 
-bigtest: all
+bigtest: all tablespace-setup
    $(pg_regress_call) --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule numeric_big 
 
-bigcheck: all
+bigcheck: all tablespace-setup
    $(pg_regress_call) --temp-install=./tmp_check --top-builddir=$(top_builddir) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) numeric_big
 
 
index a20ddb043af0d18860569082086a9c15eeb4df0a..2cecaec5e63bd9a9b759670382890f41a16ed2c2 100644 (file)
@@ -35,7 +35,7 @@ endif
 include $(top_srcdir)/src/backend/common.mk
 
 ifeq (,$(with_system_tzdata))
-all: submake-libpgport zic
+all: zic
 endif
 
 # We could do this test in the action section:
@@ -46,7 +46,7 @@ ifeq (,$(ZIC))
 ZIC= ./zic
 endif
 
-zic: $(ZICOBJS)
+zic: $(ZICOBJS) | submake-libpgport
    $(CC) $(CFLAGS) $(ZICOBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 install: all installdirs
index db3c8f9a9dfa80aeaa68e1d2df545c84d6f1a905..ac9f48012431a85146a291fe7f1d76137c671819 100644 (file)
@@ -16,9 +16,9 @@ override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS= findoidjoins.o
 
-all: submake-libpq submake-libpgport findoidjoins
+all: findoidjoins
 
-findoidjoins: findoidjoins.o $(libpq_builddir)/libpq.a
+findoidjoins: findoidjoins.o | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) findoidjoins.o $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 clean distclean maintainer-clean:
index b0fd13b6926e5b829b596d4410df1d9d74f40954..252c087898b5cffe8d172a1fdfe7635c90b6f5e2 100644 (file)
@@ -16,9 +16,9 @@ override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS= test_fsync.o
 
-all: submake-libpq submake-libpgport test_fsync
+all: test_fsync
 
-test_fsync: test_fsync.o $(libpq_builddir)/libpq.a
+test_fsync: test_fsync.o | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) test_fsync.o $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 clean distclean maintainer-clean: