summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Duret-Lutz <adl@gnu.org>2003-10-27 21:17:15 +0000
committerAlexandre Duret-Lutz <adl@gnu.org>2003-10-27 21:17:15 +0000
commitadb20140a22852c86dd8cb2eff2bc3d88381db14 (patch)
treea0702a8e66cbbd5a25250cb8d1f895faf378dba7
parent0768132f844f8b420765732b5c55472ed30940e9 (diff)
downloadautomake-adb20140a22852c86dd8cb2eff2bc3d88381db14.tar.gz
* lib/am/remake-hdr.am ($(srcdir)/%CONFIG_HIN%): Erase %STAMP%.
* tests/Makefile.am (TESTS): Add autohdr3.test * tests/autohdr3.test: New file.
-rw-r--r--ChangeLog4
-rw-r--r--lib/am/remake-hdr.am33
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/Makefile.in1
-rwxr-xr-xtests/autohdr3.test52
5 files changed, 90 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e3ce68e00..b7d2dfd42 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2003-10-27 Alexandre Duret-Lutz <adl@gnu.org>
+ * lib/am/remake-hdr.am ($(srcdir)/%CONFIG_HIN%): Erase %STAMP%.
+ * tests/Makefile.am (TESTS): Add autohdr3.test
+ * tests/autohdr3.test: New file.
+
* automake.in (handle_configure): Rename am__configure_deps
as am__aclocal_m4_deps and include $(ACLOCAL_M4_SOURCES) and
$configure_ac. Define am__configure_deps as am__aclocal_m4_deps
diff --git a/lib/am/remake-hdr.am b/lib/am/remake-hdr.am
index 1ae7c0f27..067c34844 100644
--- a/lib/am/remake-hdr.am
+++ b/lib/am/remake-hdr.am
@@ -38,7 +38,38 @@
if %?FIRST_CONFIG_HIN%
$(srcdir)/%CONFIG_HIN%: %MAINTAINER-MODE% $(am__configure_deps) %FILES%
cd $(top_srcdir) && $(AUTOHEADER)
-## Autoheader has the bad habit of not changing the time stamp if
+## 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 his.
+##
+## 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 in
+## out-of-date config.h without knowing it). One situation where this
+## can occurs is the following:
+## 1. the user updates some configure dependency (let's say foo.m4)
+## and run `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
+## discover 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
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e6063031a..e5646c26e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -46,6 +46,7 @@ ar.test \
asm.test \
autohdr.test \
autohdr2.test \
+autohdr3.test \
autohdr4.test \
auxdir.test \
auxdir2.test \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index f7e88e2c0..9dcff8f22 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -158,6 +158,7 @@ ar.test \
asm.test \
autohdr.test \
autohdr2.test \
+autohdr3.test \
autohdr4.test \
auxdir.test \
auxdir2.test \
diff --git a/tests/autohdr3.test b/tests/autohdr3.test
new file mode 100755
index 000000000..fefc95744
--- /dev/null
+++ b/tests/autohdr3.test
@@ -0,0 +1,52 @@
+#!/bin/sh
+# Copyright (C) 2003 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake 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.
+#
+# GNU Automake 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 Automake; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Check rebuild rules for autoheader.
+
+required=GNUmake
+. ./defs
+
+set -e
+
+cat >>configure.in <<EOF
+m4_include([foo.m4])
+AC_CONFIG_HEADERS([config.h:config.hin])
+AC_OUTPUT
+EOF
+
+: > Makefile.am
+: > foo.m4
+
+$ACLOCAL
+$AUTOCONF
+$AUTOHEADER
+$AUTOMAKE
+
+./configure
+$MAKE
+
+$sleep
+echo 'AC_DEFINE([GREPME], 1, [Doc for GREPME])' > foo.m4
+
+$MAKE
+grep GREPME config.hin
+grep GREPME config.h
+
+$MAKE distcheck