summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--implicit.c22
-rw-r--r--tests/ChangeLog4
-rw-r--r--tests/scripts/features/patternrules32
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 <boris@kolpackov.net>
+
+ * 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 <boris@kolpackov.net>
* 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 <boris@kolpackov.net>
+
+ * scripts/features/patternrules: Add a test for Savannah bug #12267.
+
2005-03-09 Boris Kolpackov <boris@kolpackov.net>
* 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;