]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Fixed Savannah bug #12267.
authorBoris Kolpackov <boris@kolpackov.net>
Thu, 10 Mar 2005 09:14:09 +0000 (09:14 +0000)
committerBoris Kolpackov <boris@kolpackov.net>
Thu, 10 Mar 2005 09:14:09 +0000 (09:14 +0000)
ChangeLog
implicit.c
tests/ChangeLog
tests/scripts/features/patternrules

index 58b650c579e94cecd5f22144239d11e0083773d8..d041dca655ffa3ff44af4e0de229ebb5dbf98588 100644 (file)
--- 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
index ab3879b4e09dfac7251041b8ee9b0d10d6a05fe3..338a29fb534845b1ab6026c5dbae0abba68ab8a2 100644 (file)
@@ -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)
index 7fa8f867ae7fb8bf8d29d9e568275b09b9d2f89e..ae255a266e75365805f33f469adb8c0404e612c8 100644 (file)
@@ -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
index 3202a672c94c419d1b937b2cecd32897b55cd09f..ee29c4e7f14cbd0bc69deb9daf7b93ab90a5551f 100644 (file)
@@ -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;