From 69f7791509c523fe8b199a432b72dca6a5ce3caa Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Mon, 29 Apr 2013 15:22:10 +0200 Subject: [PATCH] header-vars: recognize more make flags ('-k' in particular) * lib/am/header-vars.am (am__running_with_option): Here. Few improvements to comments, while at it. (am__make_keepgoing): New, tell whther make is being runt with the '-k' option. * t/make-keepgoing.tap: New test. * t/list-of-tests.mk: Add it. * t/make-dryrun.tap: Minor edits to keep it more in sync with the new test. Signed-off-by: Stefano Lattarini --- lib/am/header-vars.am | 13 +++-- t/list-of-tests.mk | 1 + t/make-dryrun.tap | 7 +-- t/make-keepgoing.tap | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 7 deletions(-) create mode 100755 t/make-keepgoing.tap diff --git a/lib/am/header-vars.am b/lib/am/header-vars.am index c0a5f0c..4ad1783 100644 --- a/lib/am/header-vars.am +++ b/lib/am/header-vars.am @@ -38,15 +38,15 @@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ { \ case $${am__target_option-} in \ - n) ;; \ + ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${am__target_option-}' specified" >&2; \ exit 1;; \ esac; \ am__has_opt=no; \ if $(am__is_gnu_make); then \ -## GNU make: $(MAKEFLAGS) is quite tricky there, and the older -## $(MFLAGS) variable behaves much better. +## GNU make: $(MAKEFLAGS) is quite tricky there, while the older variable +## $(MFLAGS) behaves much better. So use the latter. for am__flg in $$MFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ @@ -61,7 +61,7 @@ am__make_running_with_option = \ ## to " TESTS=foo\ nap", so that the simpler loop below (on word-splitted ## $$MAKEFLAGS) would see a "make flag" equal to "nap", and would wrongly ## misinterpret that as and indication that make is running in dry mode. -## This has already happened in practice. So we need this unpleasant hack. +## This has already happened in practice. So we need this hack. *\\[\ \ ]*) \ ## Extra indirection with ${am__bs} required by FreeBSD 8.x make. ## Not sure why (so sorry for the cargo-cult programming here). @@ -97,6 +97,11 @@ am__make_running_with_option = \ ## their recipes contain the "$(MAKE)" string (GNU and Solaris make). am__make_dryrun = { am__target_option=n; $(am__make_running_with_option); } +## Shell code that determines whether make is running in "keep-going mode" +## ("make -k") or not. Useful in rules that must recursively descend into +## subdirectories, and decide whther to stop at the first error or not. +am__make_keepgoing = { am__target_option=k; $(am__make_running_with_option); } + ## Some derived variables that have been found to be useful. pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index fbe2b56..51a3272 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -667,6 +667,7 @@ t/maken.sh \ t/maken3.sh \ t/makevars.sh \ t/make-dryrun.tap \ +t/make-keepgoing.tap \ t/make-is-gnu.sh \ t/man.sh \ t/man2.sh \ diff --git a/t/make-dryrun.tap b/t/make-dryrun.tap index a7597a3..a6470b6 100755 --- a/t/make-dryrun.tap +++ b/t/make-dryrun.tap @@ -18,7 +18,7 @@ . test-init.sh -plan_ 18 +plan_ 20 if echo "all: ; +@printf %sbb%s aa cc" | $MAKE -n -f - | grep aabbcc; then make_plus_silence () { return 0; } @@ -26,7 +26,7 @@ else make_plus_silence () { return 1; } fi -mkdir none +mkdir none # Also used later. if echo nil: | $MAKE -I none -f -; then make_supports_option_I () { return 0; } else @@ -59,7 +59,6 @@ check_make () case $1 in -C) condition=$2 skip_reason=$3; shift; shift;; -M) msg=$2; shift;; - -X) directive=TODO;; --) shift; break;; *) break;; esac @@ -136,7 +135,9 @@ check_metachars MYFLAGS='-knf2\ n\ \\n' check_metachars MYFLAGS="(&) | ; \" \` '" check_metachars MYFLAGS=" ' # ' " check_metachars MYFLAGS='$(foo)' +check_metachars MYFLAGS='$(foo -n)' check_metachars MYFLAGS='`touch bad`' +check_metachars MYFLAGS='`touch --dry-run bad`' # ---------------------------------------------------------------------- diff --git a/t/make-keepgoing.tap b/t/make-keepgoing.tap new file mode 100755 index 0000000..a81bf6c --- /dev/null +++ b/t/make-keepgoing.tap @@ -0,0 +1,134 @@ +#! /bin/sh +# Copyright (C) 2013 Free Software Foundation, Inc. +# +# This program 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. +# +# This program 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 this program. If not, see . + +# Check that $(am__make_keepgoing) works as expected. + +. test-init.sh + +plan_ 20 + +mkdir kool # Also used later. +if echo nil: | $MAKE -I kool -f -; then + make_supports_option_I () { return 0; } +else + make_supports_option_I () { return 1; } +fi + +echo AC_OUTPUT >> configure.ac + +cat > Makefile.am <<'END' +all: + @echo 'Default target $@ should not be called'>&2; exit 1; +k-y: + @echo ":: $$MAKEFLAGS ::" ;: For debugging. + $(am__make_keepgoing) +k-n: + @echo ":: $$MAKEFLAGS ::" ;: For debugging. + ! $(am__make_keepgoing) +END + +check_make () +{ + r=ok msg= mode= condition=: directive= reason= skip_reason= + case $1 in + k-[yn]) mode=$1;; + *) fatal_ "check_run: invalid usage";; + esac + shift + while test $# -gt 0; do + case $1 in + -C) condition=$2 skip_reason=$3; shift; shift;; + -M) msg=$2; shift;; + -X) directive=TODO;; + --) shift; break;; + *) break;; + esac + shift + done + msg=${mode}${msg:+" [$msg]"} + if $condition; then + $MAKE "$mode" ${1+"$@"} || r='not ok' + else + directive=SKIP reason=$skip_reason + fi + result_ "$r" -D "$directive" -r "$reason" "$msg" + unset r msg mode condition directive reason skip_reason +} + +# ---------------------------------------------------------------------- + +$ACLOCAL || fatal_ "aclocal failed" +$AUTOCONF || fatal_ "autoconf failed" +$AUTOMAKE || fatal_ "automake failed" +./configure || fatal_ "configure failed" + +# ---------------------------------------------------------------------- + +check_make k-n + +# Test against a possible regressions similar to those that affected +# detection of dry mode ("make -n"). +check_make k-n TESTS="k.test k2.test" +check_make k-n TESTS="k1 k k2" AM_MAKEFLAGS="TESTS='k1 k2'" +check_make k-n TESTS="k1 k k2" AM_MAKEFLAGS='TESTS="k1 k k2"' +check_make k-n FOOFLAGS="-k -k -nkf2 k -ks --keep -k" +check_make k-n MYFLAGS="-k --keepgoing -k --keep-run -k" + +# ---------------------------------------------------------------------- + +check_make k-y -k +check_make k-y -C using_gmake "\$MAKE is not GNU make" --keep-going + +# ---------------------------------------------------------------------- + +# Related to automake bug#12554: the "k" in "kool" used to confound +# am__make_keepgoing into thinking the '-k' option had been passed. + +pr='bug#12554' + +check_make k-n -C make_supports_option_I "-I make option unsupported" \ + -M "$pr" -I kool + +check_make k-n -C using_gmake "\$MAKE is not GNU make" \ + -M "$pr" -I kool --include keep-going + +check_make k-y -C make_supports_option_I "-I make option unsupported" \ + -M "$pr" -I kool -k + +check_make k-y -C using_gmake "\$MAKE is not GNU make" \ + -M "$pr" --keep-going -I kool --include keep-going + +# ---------------------------------------------------------------------- + +# Test for when shell metacharacters or backslashes are in $(MAKEFLAGS). + +check_metachars () +{ + check_make k-n -M "metachars" "$@" +} + +check_metachars MYFLAGS="-k \"k\" '-k' --keep-going -k" +check_metachars MYFLAGS='-knf2\ k\ \\k' +check_metachars MYFLAGS="(&) | ; \" \` '" +check_metachars MYFLAGS=" ' # ' " +check_metachars MYFLAGS='$(foo)' +check_metachars MYFLAGS='$(foo -k)' +check_metachars MYFLAGS='`touch bad`' +check_metachars MYFLAGS='`touch --keep-going bad`' + +# ---------------------------------------------------------------------- + +: -- 2.7.4