Hi,

Currently "make -jN check" fails during "creating temporary installation"
with:
make[1]: *** read jobs pipe: Invalid argument.  Stop.
make[1]: *** Waiting for unfinished jobs....
make[2]: warning: jobserver unavailable: using -j1.  Add `+' to parent make 
rule.
in install.log.

This is due to pg_regress invoking make while being invoked by make
itself. gnu make internally sets the MAKEFLAGS environment variable to
remember arguments. The problem in this case is that it contains
"--jobserver-fds=4,5" which makes the pg_regress invoked make think its
running as a make child process.

Now the problem obviously can be worked around by using "make -jN &&
make check" instead of "make -j16 check" but I several times now have
spent time trying to figure out what I broke so it sees sensible to
"fix" this.

Any arguments against doing so?

The attached patch also resets the MAKELEVEL environment variable for
good measure. I haven't seen any indication that its needed, but it
feelds safer ;)

Greetings,

Andres Freund

-- 
 Andres Freund                     http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services
>From 53d560d707964017ec0ef8cdd9d4a00632f3feec Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Thu, 29 Nov 2012 14:49:42 +0100
Subject: [PATCH] Unset MAKEFLAGS in pg_regress.c to hide the knowledge that
 its invoked by make from submakes

Make stores some flags in the MAKEFLAGS variable to pass arguments to its own
children. If we are invoked by make that makes the make invoked by us think its
part of the parallel make invoking us and tries to communicate with the
toplevel make. Which fails.
---
 src/test/regress/pg_regress.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 81e7b69..1a25252 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -783,6 +783,18 @@ initialize_environment(void)
 		}
 
 		/*
+		 * make stores some flags in the MAKEFLAGS variable to pass arguments
+		 * to its own children. If we are invoked by make that makes the make
+		 * invoked by us think its part of the parallel make invoking us and
+		 * tries to communicate with the toplevel make. Which fails.
+		 *
+		 * Unset the variable to protect against such problems. We also reset
+		 * MAKELEVEL to be certain the child notice the make above us.
+		 */
+		unsetenv("MAKEFLAGS");
+		unsetenv("MAKELEVEL");
+
+		/*
 		 * Adjust path variables to point into the temp-install tree
 		 */
 		tmp = malloc(strlen(temp_install) + 32 + strlen(bindir));
-- 
1.7.12.289.g0ce9864.dirty

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to