2003-11-11 Alexandre Duret-Lutz <adl@gnu.org>
+ * tests/spy.test: Document overlapping ::-rules incompatibilities,
+ and check only non-overlapping ::-rules.
+
* doc/automake.texi (Texinfo): Define MAKEINFO, MAKEINFOHTML,
MAKEINFOFLAGS, AM_MAKEINFOFLAGS, AM_MAKEINFOHTMLFLAGS, TEXI2DVI,
TEXI2PDF, DVIPS, and TEXINFO_TEX in a table.
# 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 <tromey@cambric>
+# | [ ... ]
+# | * 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
set -e
echo rule1 >> $@
a :: c
echo rule2 >> $@
-a :: b c
- echo rule3 >> $@
EOF
touch b c
-$MAKE
-test "`cat a`" = rule1
-: > a
$sleep
-touch b
-$MAKE
-test "`cat a`" = rule1
: > a
-$sleep
-touch c
$MAKE
-test "`cat a`" = rule2
-: > a
+test "`cat a`" = ''
$sleep
-touch b c
-$MAKE
-test "`cat a`" = rule1
-
-
-: > a
-$sleep
-cat >Makefile <<\EOF
-a :: b c
- echo rule1 >> $@
-a :: c
- echo rule2 >> $@
-a :: b
- echo rule3 >> $@
-EOF
-
touch b
$MAKE
test "`cat a`" = rule1
$sleep
touch c
$MAKE
-test "`cat a`" = rule1
-: > a
-$sleep
-touch b c
-$MAKE
-test "`cat a`" = rule1
+test "`cat a`" = rule2