Subject: Re: make -k fails on cygwin
From: Alexandre Duret-Lutz <[email-masked]>
To: Eric Blake <[email-masked]>
Cc: Jim Meyering <[email-masked]>, [email-masked], [email-masked], [email-masked]
Date: Sat, 15 Jan 2005 14:35:11 +0100

>>> "Eric" == Eric Blake <[email-masked]> writes:

 Eric> `info make' also has a page dedicated to "Phony Targets"
 Eric> that discusses the more portable way to have a recursive
 Eric> target,

Not really: this only describes how one can setup recursive
targets with GNU make.  Option -C is neither portable nor
standard.

How about the following patch to Automake?  

The very last paragraph of check4.test shows how I was able to
reproduce the problem with GNU make (without cygwin
modifications).

2005-01-15  Alexandre Duret-Lutz  <[email-masked]>

	* lib/am/subdirs.am ($(RECURSIVE_TARGETS), mostlyclean-recursive,
	clean-recursive, distclean-recursive, maintainer-clean-recursive):
	Process all words of $MAKEFLAGS when checking for -k.
	* tests/check4.test: New file.
	* tests/Makefile.am (TESTS): Add check4.test.
	Report from Eric Blake.

Index: lib/am/subdirs.am
===================================================================
RCS file: /cvs/automake/automake/lib/am/subdirs.am,v
retrieving revision 1.56
diff -u -r1.56 subdirs.am
--- lib/am/subdirs.am	6 Jul 2003 19:30:46 -0000	1.56
+++ lib/am/subdirs.am	15 Jan 2005 13:23:12 -0000
@@ -1,5 +1,5 @@
 ## automake - create Makefile.in from Makefile.am
-## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
+## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005
 ## Free Software Foundation, Inc.
 
 ## This program is free software; you can redistribute it and/or modify
@@ -30,7 +30,15 @@
 # (2) otherwise, pass the desired values on the `make' command line.
 
 $(RECURSIVE_TARGETS):
-	@set fnord $$MAKEFLAGS; amf=$$2; \
+## Using $failcom allows "-k" to keep its natural meaning when running a
+## recursive rule.
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
 	dot_seen=no; \
 	target=`echo $@ | sed s/-recursive//`; \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
@@ -42,9 +50,7 @@
 	    local_target="$$target"; \
 	  fi; \
 	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-## This trick allows "-k" to keep its natural meaning when running a
-## recursive rule.
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
@@ -67,7 +73,15 @@
 ## bombs.
 mostlyclean-recursive clean-recursive distclean-recursive \
 maintainer-clean-recursive:
-	@set fnord $$MAKEFLAGS; amf=$$2; \
+## Using $failcom allows "-k" to keep its natural meaning when running a
+## recursive rule.
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
 	dot_seen=no; \
 ## For distclean and maintainer-clean we make sure to use the full
 ## list of subdirectories.  We do this so that `configure; make
@@ -93,7 +107,5 @@
 	    local_target="$$target"; \
 	  fi; \
 	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-## This trick allows "-k" to keep its natural meaning when running a
-## recursive rule.
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	  || eval $$failcom; \
 	done && test -z "$$fail"
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.565.2.11
diff -u -r1.565.2.11 Makefile.am
--- tests/Makefile.am	1 Jan 2005 14:00:43 -0000	1.565.2.11
+++ tests/Makefile.am	15 Jan 2005 13:23:12 -0000
@@ -74,6 +74,7 @@
 check.test \
 check2.test \
 check3.test \
+check4.test \
 checkall.test \
 clean.test \
 clean2.test \
Index: tests/check4.test
===================================================================
RCS file: tests/check4.test
diff -N tests/check4.test
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ tests/check4.test	15 Jan 2005 13:23:12 -0000
@@ -0,0 +1,88 @@
+#! /bin/sh
+# Copyright (C) 2005  Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Automake; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Make sure `make -k check' processes all directories.
+
+. ./defs || exit 1
+
+set -e
+
+cat >> configure.in << 'END'
+AC_CONFIG_FILES([dir/Makefile])
+AC_OUTPUT
+END
+
+mkdir dir
+
+cat > Makefile.am <<'END'
+SUBDIRS = dir
+TESTS = ok.sh
+END
+
+echo TESTS = fail.sh >dir/Makefile.am
+
+cat >ok.sh <<'END'
+#!/bin/sh
+:
+END
+
+cat >dir/fail.sh <<'END'
+#!/bin/sh
+exit 1
+END
+
+chmod +x ok.sh dir/fail.sh
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+./configure --prefix `pwd`/inst
+$MAKE check >stdout && exit 1
+cat stdout
+grep 'FAIL: fail.sh' stdout
+grep 'PASS: ok.sh' stdout && exit 1
+
+# The exit status of `make -k' can be anything
+# (depending on the Make implementation)
+$MAKE -k check >stdout || :
+cat stdout
+grep 'FAIL: fail.sh' stdout
+grep 'PASS: ok.sh' stdout
+
+# should also works when -k is not in first position
+$MAKE -s -k check >stdout || :
+cat stdout
+grep 'FAIL: fail.sh' stdout
+grep 'PASS: ok.sh' stdout
+
+# The rest of the test is for GNU Make.
+
+# Use --version AND -v, because SGI Make doesn't fail on --version.
+# Also grep for GNU because newer versions of FreeBSD make do
+# not complain about `--version' (they seem to silently ignore it).
+($MAKE --version -v | grep GNU) || exit 0
+
+# Try with a long-option that do not have a short option equivalent
+# (here, --no-print-directory).  That should cause all options to
+# appear verbatim in MAKEFLAGS.
+$MAKE --no-print-directory -k check >stdout || :
+cat stdout
+grep 'FAIL: fail.sh' stdout
+grep 'PASS: ok.sh' stdout

-- 
Alexandre Duret-Lutz

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/