1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
  
     | 
    
      #! /bin/sh
# Copyright (C) 2003-2018 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 <https://www.gnu.org/licenses/>.
# 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  <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.
. test-init.sh
cat >Makefile <<\EOF
a :: b
	echo rule1 >> $@
a :: c
	echo rule2 >> $@
EOF
touch b c
$sleep
: > a
$MAKE
test x"$(cat a)" = x
$sleep
touch b
$MAKE
test "$(cat a)" = "rule1"
# Ensure a is strictly newer than b, so HP-UX make does not execute rule2.
$sleep
: > 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
:
 
     |