From f8ebe3bcc5debfcf2bf588aee138944688b682c0 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Mon, 25 Apr 2011 22:21:37 +0300
Subject: [PATCH] Support "make check" in contrib

Added a new option --extra-install to pg_regress to arrange installing
the respective contrib directory into the temporary installation.
This is currently not yet supported for Windows MSVC builds.

Updated the .gitignore files for contrib modules to ignore the
leftovers of a temp-install check run.

Changed the exit status of "make check" in a pgxs build (which still
does nothing) to 0 from 1.

Added "make check" in contrib to top-level "make check-world".
---
 GNUmakefile.in                   |  3 +--
 contrib/btree_gin/.gitignore     |  2 ++
 contrib/btree_gist/.gitignore    |  2 ++
 contrib/citext/.gitignore        |  2 ++
 contrib/cube/.gitignore          |  2 ++
 contrib/dblink/.gitignore        |  2 ++
 contrib/dict_int/.gitignore      |  2 ++
 contrib/dict_xsyn/.gitignore     |  2 ++
 contrib/earthdistance/.gitignore |  2 ++
 contrib/earthdistance/Makefile   |  1 +
 contrib/file_fdw/.gitignore      |  2 ++
 contrib/hstore/.gitignore        |  2 ++
 contrib/intarray/.gitignore      |  2 ++
 contrib/ltree/.gitignore         |  2 ++
 contrib/pg_trgm/.gitignore       |  2 ++
 contrib/pgcrypto/.gitignore      |  2 ++
 contrib/seg/.gitignore           |  2 ++
 contrib/tablefunc/.gitignore     |  2 ++
 contrib/test_parser/.gitignore   |  2 ++
 contrib/tsearch2/.gitignore      |  2 ++
 contrib/unaccent/.gitignore      |  2 ++
 contrib/xml2/.gitignore          |  2 ++
 src/makefiles/pgxs.mk            | 13 +++++++------
 src/test/regress/pg_regress.c    | 25 +++++++++++++++++++++++++
 24 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/GNUmakefile.in b/GNUmakefile.in
index f3c5fe587e9..79b0da42a84 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -60,8 +60,7 @@ check: all
 check installcheck installcheck-parallel:
 	$(MAKE) -C src/test $@
 
-# TODO: add contrib
-$(call recurse,check-world,src/test src/pl src/interfaces/ecpg,check)
+$(call recurse,check-world,src/test src/pl src/interfaces/ecpg contrib,check)
 
 $(call recurse,installcheck-world,src/test src/pl src/interfaces/ecpg contrib,installcheck)
 
diff --git a/contrib/btree_gin/.gitignore b/contrib/btree_gin/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/btree_gin/.gitignore
+++ b/contrib/btree_gin/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/btree_gist/.gitignore b/contrib/btree_gist/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/btree_gist/.gitignore
+++ b/contrib/btree_gist/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/citext/.gitignore b/contrib/citext/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/citext/.gitignore
+++ b/contrib/citext/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/cube/.gitignore b/contrib/cube/.gitignore
index a6484a05e73..cb4c989fff1 100644
--- a/contrib/cube/.gitignore
+++ b/contrib/cube/.gitignore
@@ -1,4 +1,6 @@
 /cubeparse.c
 /cubescan.c
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/dblink/.gitignore b/contrib/dblink/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/dblink/.gitignore
+++ b/contrib/dblink/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/dict_int/.gitignore b/contrib/dict_int/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/dict_int/.gitignore
+++ b/contrib/dict_int/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/dict_xsyn/.gitignore b/contrib/dict_xsyn/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/dict_xsyn/.gitignore
+++ b/contrib/dict_xsyn/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/earthdistance/.gitignore b/contrib/earthdistance/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/earthdistance/.gitignore
+++ b/contrib/earthdistance/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/earthdistance/Makefile b/contrib/earthdistance/Makefile
index 49f6e6675fc..48a7cf8c7c0 100644
--- a/contrib/earthdistance/Makefile
+++ b/contrib/earthdistance/Makefile
@@ -6,6 +6,7 @@ EXTENSION = earthdistance
 DATA = earthdistance--1.0.sql earthdistance--unpackaged--1.0.sql
 
 REGRESS = earthdistance
+REGRESS_OPTS = --extra-install=contrib/cube
 
 LDFLAGS_SL += $(filter -lm, $(LIBS))
 
diff --git a/contrib/file_fdw/.gitignore b/contrib/file_fdw/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/file_fdw/.gitignore
+++ b/contrib/file_fdw/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/hstore/.gitignore b/contrib/hstore/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/hstore/.gitignore
+++ b/contrib/hstore/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/intarray/.gitignore b/contrib/intarray/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/intarray/.gitignore
+++ b/contrib/intarray/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/ltree/.gitignore b/contrib/ltree/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/ltree/.gitignore
+++ b/contrib/ltree/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/pg_trgm/.gitignore b/contrib/pg_trgm/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/pg_trgm/.gitignore
+++ b/contrib/pg_trgm/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/pgcrypto/.gitignore b/contrib/pgcrypto/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/pgcrypto/.gitignore
+++ b/contrib/pgcrypto/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/seg/.gitignore b/contrib/seg/.gitignore
index 102f8b3246d..69e73d20966 100644
--- a/contrib/seg/.gitignore
+++ b/contrib/seg/.gitignore
@@ -1,4 +1,6 @@
 /segparse.c
 /segscan.c
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/tablefunc/.gitignore b/contrib/tablefunc/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/tablefunc/.gitignore
+++ b/contrib/tablefunc/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/test_parser/.gitignore b/contrib/test_parser/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/test_parser/.gitignore
+++ b/contrib/test_parser/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/tsearch2/.gitignore b/contrib/tsearch2/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/tsearch2/.gitignore
+++ b/contrib/tsearch2/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/unaccent/.gitignore b/contrib/unaccent/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/unaccent/.gitignore
+++ b/contrib/unaccent/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/contrib/xml2/.gitignore b/contrib/xml2/.gitignore
index 19b6c5ba425..5dcb3ff9723 100644
--- a/contrib/xml2/.gitignore
+++ b/contrib/xml2/.gitignore
@@ -1,2 +1,4 @@
 # Generated subdirectories
+/log/
 /results/
+/tmp_check/
diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk
index 87ade0a420f..7fb007fb1c3 100644
--- a/src/makefiles/pgxs.mk
+++ b/src/makefiles/pgxs.mk
@@ -281,13 +281,14 @@ endif
 installcheck: submake
 	$(pg_regress_installcheck) $(REGRESS_OPTS) $(REGRESS)
 
-# in-tree test doesn't work yet (no way to install my shared library)
-#check: all submake
-#	$(pg_regress_check) $(REGRESS_OPTS) $(REGRESS)
+ifdef PGXS
 check:
-	@echo "'make check' is not supported."
-	@echo "Do 'make install', then 'make installcheck' instead."
-	@exit 1
+	@echo '"$(MAKE) check" is not supported.'
+	@echo 'Do "$(MAKE) install", then "$(MAKE) installcheck" instead.'
+else
+check: all submake
+	$(pg_regress_check) --extra-install=$(subdir) $(REGRESS_OPTS) $(REGRESS)
+endif
 endif # REGRESS
 
 
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 5dba7eb8f22..23ef0a94e5d 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -102,6 +102,7 @@ static bool port_specified_by_user = false;
 static char *dlpath = PKGLIBDIR;
 static char *user = NULL;
 static _stringlist *extraroles = NULL;
+static _stringlist *extra_install = NULL;
 
 /* internal variables */
 static const char *progname;
@@ -1896,6 +1897,7 @@ help(void)
 	printf(_("  --top-builddir=DIR        (relative) path to top level build directory\n"));
 	printf(_("  --port=PORT               start postmaster on PORT\n"));
 	printf(_("  --temp-config=PATH        append contents of PATH to temporary config\n"));
+	printf(_("  --extra-install=DIR       additional directory to install (e.g., contrib\n"));
 	printf(_("\n"));
 	printf(_("Options for using an existing installation:\n"));
 	printf(_("  --host=HOST               use postmaster running on HOST\n"));
@@ -1943,6 +1945,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 		{"use-existing", no_argument, NULL, 20},
 		{"launcher", required_argument, NULL, 21},
 		{"load-extension", required_argument, NULL, 22},
+		{"extra-install", required_argument, NULL, 23},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -2042,6 +2045,9 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 			case 22:
 				add_stringlist_item(&loadextension, optarg);
 				break;
+			case 23:
+				add_stringlist_item(&extra_install, optarg);
+				break;
 			default:
 				/* getopt_long already emitted a complaint */
 				fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2086,6 +2092,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 	if (temp_install)
 	{
 		FILE	   *pg_conf;
+		_stringlist *sl;
 
 		/*
 		 * Prepare the temp installation
@@ -2128,6 +2135,24 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 			exit_nicely(2);
 		}
 
+		for (sl = extra_install; sl != NULL; sl = sl->next)
+		{
+#ifndef WIN32_ONLY_COMPILER
+			snprintf(buf, sizeof(buf),
+					 SYSTEMQUOTE "\"%s\" -C \"%s/%s\" DESTDIR=\"%s/install\" install >> \"%s/log/install.log\" 2>&1" SYSTEMQUOTE,
+					 makeprog, top_builddir, sl->str, temp_install, outputdir);
+#else
+			fprintf(stderr, _("\n%s: --extra-install option not supported on this platform\n", progname));
+			exit_nicely(2);
+#endif
+
+			if (system(buf))
+			{
+				fprintf(stderr, _("\n%s: installation failed\nExamine %s/log/install.log for the reason.\nCommand was: %s\n"), progname, outputdir, buf);
+				exit_nicely(2);
+			}
+		}
+
 		/* initdb */
 		header(_("initializing database system"));
 		snprintf(buf, sizeof(buf),
-- 
GitLab