>>> "Eric" == Eric Blake <[EMAIL PROTECTED]> 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 PROTECTED]> * 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