From d584d0c1c6945e0b498365e7d17f0fe3cb449d04 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 10 Mar 2005 09:14:09 +0000 Subject: Fixed Savannah bug #12267. --- ChangeLog | 6 ++++++ implicit.c | 22 ++++++++++++++++++---- tests/ChangeLog | 4 ++++ tests/scripts/features/patternrules | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 58b650c..d041dca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-03-10 Boris Kolpackov + + * implicit.c (pattern_search): Mark an intermediate target as + precious if it happened to be a prerequisite of some (other) + target. Fixes Savannah bug #12267. + 2005-03-09 Boris Kolpackov * main.c (main): Use o_file instead of o_default when defining diff --git a/implicit.c b/implicit.c index ab3879b..338a29f 100644 --- a/implicit.c +++ b/implicit.c @@ -798,15 +798,29 @@ pattern_search (struct file *file, int archive, of F below are null before we change them. */ struct file *imf = d->intermediate_file; - register struct file *f = enter_file (imf->name); + register struct file *f = lookup_file (imf->name); + + /* We don't want to delete an intermediate file that happened + to be a prerequisite of some (other) target. Mark it as + precious. */ + if (f != 0) + f->precious = 1; + else + f = enter_file (imf->name); + f->deps = imf->deps; f->cmds = imf->cmds; f->stem = imf->stem; f->also_make = imf->also_make; f->is_target = 1; - imf = lookup_file (d->intermediate_pattern); - if (imf != 0 && imf->precious) - f->precious = 1; + + if (!f->precious) + { + imf = lookup_file (d->intermediate_pattern); + if (imf != 0 && imf->precious) + f->precious = 1; + } + f->intermediate = 1; f->tried_implicit = 1; for (dep = f->deps; dep != 0; dep = dep->next) diff --git a/tests/ChangeLog b/tests/ChangeLog index 7fa8f86..ae255a2 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,7 @@ +2005-03-10 Boris Kolpackov + + * scripts/features/patternrules: Add a test for Savannah bug #12267. + 2005-03-09 Boris Kolpackov * scripts/variables/DEFAULT_TARGET: Add a test for Savannah diff --git a/tests/scripts/features/patternrules b/tests/scripts/features/patternrules index 3202a67..ee29c4e 100644 --- a/tests/scripts/features/patternrules +++ b/tests/scripts/features/patternrules @@ -4,6 +4,12 @@ $description = "Test pattern rules."; $details = ""; +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + + # TEST #1: Make sure that multiple patterns where the same target # can be built are searched even if the first one fails # to match properly. @@ -63,5 +69,31 @@ foo.in: ; @: foo.out'); +# TEST #3: make sure intermidite files that also happened to be +# prerequisites are not removed (Savannah bug #12267). +# +run_make_test(' +$(dir)/foo.o: + +$(dir)/foo.y: + @echo $@ + +%.c: %.y + touch $@ + +%.o: %.c + @echo $@ + +.PHONY: install +install: $(dir)/foo.c + +', +"dir=$dir", +"$dir/foo.y +touch $dir/foo.c +$dir/foo.o"); + +unlink("$dir/foo.c"); + # This tells the test driver that the perl test script executed properly. 1; -- cgit v1.2.3