Hash :
d7c1679b
Author :
Date :
2010-10-03T12:29:40
Fix and document rules to not touch the tree with `make -n'. * doc/automake.texi (Multiple Outputs): Document the problem of modifications during dry-run execution, propose solution. * NEWS: Update. * automake.in (lang_vala_finish_target): Split recipe so the stamp file is not removed with GNU `make -n'. (lang_yacc_target_hook): Separate removal of parser output file and header remaking. * lib/am/lisp.am ($(am__ELCFILES)): Determine whether -n was passed to make, take care not to remove any files in that case. * lib/am/remake-hdr.am (%CONFIG_H%): Separate removal of %STAMP% file from induced remaking of config header. * tests/autohdrdry.test, tests/lispdry.test, tests/yaccdry.test: New tests. * tests/Makefile.am (TESTS): Update. Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
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
## automake - create Makefile.in from Makefile.am
## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2003, 2004, 2005,
## 2008, 2009, 2010 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 <http://www.gnu.org/licenses/>.
## Explicitly look in srcdir for benefit of non-GNU makes.
%CONFIG_H%: %STAMP%
## Recover from removal of CONFIG_HEADER
@if test ! -f $@; then rm -f %STAMP%; else :; fi
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) %STAMP%; else :; fi
%STAMP%: %CONFIG_H_DEPS% $(top_builddir)/config.status
@rm -f %STAMP%
cd $(top_builddir) && $(SHELL) ./config.status %CONFIG_H_PATH%
## Only the first file of AC_CONFIG_HEADERS is assumed to be generated
## by autoheader.
if %?FIRST%
%CONFIG_HIN%: %MAINTAINER-MODE% $(am__configure_deps) %FILES%
## Cater to parallel BSD make.
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
## Whenever $(AUTOHEADER) has run, we must make sure that
## ./config.status will rebuild config.h. The dependency from %STAMP%
## on %CONFIG_H_DEPS% (which contains config.hin) is not enough to
## express this.
##
## There are some tricky cases where this rule will build a
## config.hin which has the same timestamp as %STAMP%, in which case
## ./config.status will not be rerun (meaning that users will use an
## out-of-date config.h without knowing it). One situation where this
## can occur is the following:
## 1. the user updates some configure dependency (let's say foo.m4)
## and runs `make'
## 2. the rebuild rules detect that a foo.m4 has changed,
## run aclocal, autoconf, automake, and then run ./config.status.
## (Note that autoheader hasn't been called yet, so ./config.status
## outputs a config.h from an obsolete config.hin.)
## 3. Once Makefile has been regenerated, make continues, and
## discovers that config.h is a dependency of the `all' rule.
## Because config.h depends on stamp-h1, stamp-h1 depends on
## config.hin, and config.hin depends on aclocal.m4, make runs
## autoheader to rebuild config.hin.
## Now make ought to call ./config.status once again to rebuild
## config.h from the new config.hin, but if you have a sufficiently
## fast box, steps 2 and 3 will occur within the same second: the
## config.h/stamp-h1 generated from the outdated config.hin will have
## the same mtime as the new config.hin. Hence make will think that
## config.h is up to date.
##
## A solution is to erase %STAMP% here so that the %STAMP% rule
## is always triggered after the this one.
rm -f %STAMP%
## Autoheader has the bad habit of not changing the timestamp if
## config.hin is unchanged, which breaks Make targets. Since what
## must not changed gratuitously is config.h, which is already handled
## by config.status, there is no reason to make things complex for
## config.hin.
touch $@
endif %?FIRST%