Fixed bug #14334 by propagate the change of modification time to all the

double-colon entries only if it is the last one to be updated.
This commit is contained in:
Boris Kolpackov 2005-12-07 11:33:38 +00:00
parent 1fd3f9d79c
commit a34b85490d
4 changed files with 65 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2005-12-07 Boris Kolpackov <boris@kolpackov.net>
* remake.c (notice_finished_file): Propagate the change of
modification time to all the double-colon entries only if
it is the last one to be updated. Fixes bug #14334.
2005-11-17 Boris Kolpackov <boris@kolpackov.net> 2005-11-17 Boris Kolpackov <boris@kolpackov.net>
* function.c (func_flavor): Implement the flavor function which * function.c (func_flavor): Implement the flavor function which

View File

@ -841,7 +841,6 @@ notice_finished_file (struct file *file)
if ((ran && !file->phony) || touched) if ((ran && !file->phony) || touched)
{ {
struct file *f;
int i = 0; int i = 0;
/* If -n, -t, or -q and all the commands are recursive, we ran them so /* If -n, -t, or -q and all the commands are recursive, we ran them so
@ -861,11 +860,34 @@ notice_finished_file (struct file *file)
i = 1; i = 1;
file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME; file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME;
}
/* Propagate the change of modification time to all the double-colon if (file->double_colon)
entries for this file. */ {
for (f = file->double_colon; f != 0; f = f->prev) /* If this is a double colon rule and it is the last one to be
f->last_mtime = file->last_mtime; updated, propagate the change of modification time to all the
double-colon entries for this file.
We do it on the last update because it is important to handle
individual entries as separate rules with separate timestamps
while they are treated as targets and then as one rule with the
unified timestamp when they are considered as a prerequisite
of some target. */
struct file *f;
FILE_TIMESTAMP max_mtime = file->last_mtime;
/* Check that all rules were updated and at the same time find
the max timestamp. We assume UNKNOWN_MTIME is newer then
any other value. */
for (f = file->double_colon; f != 0 && f->updated; f = f->prev)
if (max_mtime != UNKNOWN_MTIME
&& (f->last_mtime == UNKNOWN_MTIME || f->last_mtime > max_mtime))
max_mtime = f->last_mtime;
if (f == 0)
for (f = file->double_colon; f != 0; f = f->prev)
f->last_mtime = max_mtime;
} }
if (ran && file->update_status != -1) if (ran && file->update_status != -1)

View File

@ -1,3 +1,7 @@
2005-12-07 Boris Kolpackov <boris@kolpackov.net>
* scripts/features/double_colon: Add a test for bug #14334.
2005-11-17 Boris Kolpackov <boris@kolpackov.net> 2005-11-17 Boris Kolpackov <boris@kolpackov.net>
* scripts/functions/flavor: Add a test for the flavor function. * scripts/functions/flavor: Add a test for the flavor function.

View File

@ -124,4 +124,32 @@ $answer = "ok\n$make_name: Circular d <- d dependency dropped.\noops\n";
unlink('foo','f1.h','f2.h'); unlink('foo','f1.h','f2.h');
# TEST 9: make sure all rules in s double colon family get executed
# (Savannah bug #14334).
#
&touch('one');
&touch('two');
run_make_test('
.PHONY: all
all: result
result:: one
@echo $^ >>$@
@echo $^
result:: two
@echo $^ >>$@
@echo $^
',
'',
'one
two');
unlink('result','one','two');
# This tells the test driver that the perl test script executed properly.
1; 1;