Process EXTRA_INSTALL serially, during the first temp-install.
authorNoah Misch
Mon, 31 Dec 2018 21:54:38 +0000 (13:54 -0800)
committerNoah Misch
Mon, 31 Dec 2018 21:57:57 +0000 (13:57 -0800)
This closes a race condition in "make -j check-world"; the symptom was
EEXIST errors.  Back-patch to v10, before which parallel check-world had
worse problems.

Discussion: https://postgr.es/m/20181224221601[email protected]

GNUmakefile.in
src/Makefile.global.in
src/makefiles/pgxs.mk

index dc76a5d11dd88e4c921964c840517a6d93dde3b9..1baf6860e8b4650f0fbeb7b980e34d8859d67ca3 100644 (file)
@@ -63,10 +63,12 @@ distclean maintainer-clean:
    @rm -rf autom4te.cache/
    rm -f config.cache config.log config.status GNUmakefile
 
+check check-tests installcheck installcheck-parallel installcheck-tests: CHECKPREP_TOP=src/test/regress
 check check-tests installcheck installcheck-parallel installcheck-tests:
    $(MAKE) -C src/test/regress $@
 
 $(call recurse,check-world,src/test src/pl src/interfaces/ecpg contrib src/bin,check)
+$(call recurse,checkprep,  src/test src/pl src/interfaces/ecpg contrib src/bin)
 
 $(call recurse,installcheck-world,src/test src/pl src/interfaces/ecpg contrib src/bin,installcheck)
 
index 3e56ef013b4ed3e168cc551d7f5244b35cb9cc21..9fe3b4d678c5ff6ae9a536327120fd398838b3d1 100644 (file)
@@ -19,7 +19,7 @@
 #
 # Meta configuration
 
-standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check installcheck init-po update-po
+standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check checkprep installcheck init-po update-po
 # these targets should recurse even into subdirectories not being built:
 standard_always_targets = distprep clean distclean maintainer-clean
 
@@ -344,11 +344,17 @@ ifeq ($(MAKELEVEL),0)
    rm -rf '$(abs_top_builddir)'/tmp_install
    $(MKDIR_P) '$(abs_top_builddir)'/tmp_install/log
    $(MAKE) -C '$(top_builddir)' DESTDIR='$(abs_top_builddir)'/tmp_install install >'$(abs_top_builddir)'/tmp_install/log/install.log 2>&1
+   $(MAKE) -j1 $(if $(CHECKPREP_TOP),-C $(CHECKPREP_TOP),) checkprep >>'$(abs_top_builddir)'/tmp_install/log/install.log 2>&1
 endif
-   $(if $(EXTRA_INSTALL),for extra in $(EXTRA_INSTALL); do $(MAKE) -C '$(top_builddir)'/$$extra DESTDIR='$(abs_top_builddir)'/tmp_install install >>'$(abs_top_builddir)'/tmp_install/log/install.log 2>&1 || exit; done)
 endif
 endif
 
+# Tasks to run serially at the end of temp-install.  Some EXTRA_INSTALL
+# entries appear more than once in the tree, and parallel installs of the same
+# file can fail with EEXIST.
+checkprep:
+   $(if $(EXTRA_INSTALL),for extra in $(EXTRA_INSTALL); do $(MAKE) -C '$(top_builddir)'/$$extra DESTDIR='$(abs_top_builddir)'/tmp_install install || exit; done)
+
 PROVE = @PROVE@
 # There are common routines in src/test/perl, and some test suites have
 # extra perl modules in their own directory.
index ff7f5297e7e128068a98f3985c5a1e321fc033cc..a7b34c69374702cadaa6577d3e637f5d240df890 100644 (file)
@@ -285,7 +285,7 @@ else
 check: submake $(REGRESS_PREP)
    $(pg_regress_check) $(REGRESS_OPTS) $(REGRESS)
 
-temp-install: EXTRA_INSTALL+=$(subdir)
+checkprep: EXTRA_INSTALL+=$(subdir)
 endif
 endif # REGRESS