From: Stefano Lattarini Date: Fri, 15 Jun 2012 14:38:48 +0000 (+0200) Subject: [ng] coverage: support for double-colon rules both in Automake and GNU make X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af3834cf3bd72ce183d2a226763f8b792c86fbed;p=thirdparty%2Fautomake.git [ng] coverage: support for double-colon rules both in Automake and GNU make * t/double-colon-rules.sh: New test. * t/spy-double-colon.sh: Remove as superseded. Signed-off-by: Stefano Lattarini --- diff --git a/t/double-colon-rules.sh b/t/double-colon-rules.sh new file mode 100755 index 000000000..ef7c45a2a --- /dev/null +++ b/t/double-colon-rules.sh @@ -0,0 +1,112 @@ +#! /bin/sh +# Copyright (C) 2003-2012 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 double colon rules work. +# This test not only checks that Automake do not mangle double-colon rules +# seen in input Makefile.am, but also that GNU make support of double-colon +# rules is as reliable and well-working as we expect and need. + +. ./defs || Exit 1 + +echo AC_OUTPUT >> configure.ac + +cat > Makefile.am <<'END' +all-local: + @echo Please select an explicit target; exit 1 + +# No space after 'a'. +a:: b + echo rule1 >> $@ +# Deliberate space after 'a'. +a :: c + echo rule2 >> $@ + +# Overlapping rules should work as well +a2 :: b2 + echo rule21 >> $@ +a2 :: c2 + echo rule22 >> $@ +a2:: b2 c2 + echo rule23 >> $@ +b2 c2: + touch $@ +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE + +grep '::' Makefile.in # For debugging. +test $(grep -c '^a *:: *b *$' Makefile.in) -eq 1 +test $(grep -c '^a *:: *c *$' Makefile.in) -eq 1 +test $(grep -c '^a2 *:: *b2 *$' Makefile.in) -eq 1 +test $(grep -c '^a2 *:: *c2 *$' Makefile.in) -eq 1 +test $(grep -c '^a2 *:: *b2 *c2 *$' Makefile.in) -eq 1 + +./configure + +# Non-overlapping double-colon rules. + +touch b c +$sleep +: > a +$MAKE a +test ! -s a +$sleep +touch b +$MAKE a +test "$(cat a)" = rule1 +: > a +$sleep +touch c +$MAKE a +test "$(cat a)" = rule2 + +: > a +$sleep +touch b c +$MAKE a +test "$(sort a)" = "rule1${nl}rule2" + +rm -f a b c + +# Overlapping double-colon rules. + +$MAKE a2 +test -f a2 +test -f b2 +test -f c2 + +: > a2 +$MAKE a2 +test ! -s a2 +$sleep +touch b2 +$MAKE a2 +test "$(sort a2)" = "rule21${nl}rule23" +: > a2 +$sleep +touch c2 +$MAKE a2 +test "$(sort a2)" = "rule22${nl}rule23" + +: > a2 +$sleep +touch b2 c2 +$MAKE a2 +test "$(sort a2)" = "rule21${nl}rule22${nl}rule23" + +: diff --git a/t/spy-double-colon.sh b/t/spy-double-colon.sh deleted file mode 100755 index 35303283e..000000000 --- a/t/spy-double-colon.sh +++ /dev/null @@ -1,104 +0,0 @@ -#! /bin/sh -# Copyright (C) 2003-2012 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 whether double colon rules work. The Unix V7 make manual -# mentions double-colon rules, but POSIX does not. They seem to be -# supported by all Make implementation as far as we can tell. This test -# case is a spy: we want to detect if there exist implementations where -# these do not work. We might use these rules to simplify the rebuild -# rules (instead of the $? hack). - -# Tom Tromey write: -# | In the distant past we used :: rules extensively. -# | Fran?ois convinced me to get rid of them: -# | -# | Thu Nov 23 18:02:38 1995 Tom Tromey -# | [ ... ] -# | * subdirs.am: Removed "::" rules -# | * header.am, libraries.am, mans.am, texinfos.am, footer.am: -# | Removed "::" rules -# | * scripts.am, programs.am, libprograms.am: Removed "::" rules -# | -# | -# | I no longer remember the rationale for this. It may have only been a -# | belief that they were unportable. - -# On a related topic, the Autoconf manual has the following text: -# | 'VPATH' and double-colon rules -# | Any assignment to 'VPATH' causes Sun 'make' to only execute -# | the first set of double-colon rules. (This comment has been -# | here since 1994 and the context has been lost. It's probably -# | about SunOS 4. If you can reproduce this, please send us a -# | test case for illustration.) - -# We already know that overlapping ::-rule like -# -# a :: b -# echo rule1 >> $@ -# a :: c -# echo rule2 >> $@ -# a :: b c -# echo rule3 >> $@ -# -# do not work equally on all platforms. It seems that in all cases -# Make attempts to run all matching rules. However at least GNU Make, -# NetBSD Make, and FreeBSD Make will detect that $@ was updated by the -# first matching rule and skip remaining matches (with the above -# example that means that unless 'a' was declared PHONY, only "rule1" -# will be appended to 'a' if both b and c have changed). Other -# implementations like OSF1 Make and HP-UX Make do not perform such a -# check and execute all matching rules whatever they do ("rule1", -# "rule2", abd "rule3" will all be appended to 'a' if b and c have -# changed). - -# So it seems only non-overlapping ::-rule may be portable. This is -# what we check now. - -. ./defs || Exit 1 - -cat >Makefile <<\EOF -a :: b - echo rule1 >> $@ -a :: c - echo rule2 >> $@ -EOF - -touch b c -$sleep -: > a -$MAKE -test "`cat a`" = '' -$sleep -touch b -$MAKE -test "`cat a`" = rule1 -: > a -$sleep -touch c -$MAKE -test "`cat a`" = rule2 - -# Unfortunately, the following is not portable to FreeBSD/NetBSD/OpenBSD -# make, see explanation above. - -: > a -$sleep -touch b c -$MAKE -grep rule1 a -grep rule2 a - -: