]> git.ipfire.org Git - thirdparty/make.git/commitdiff
[SV 65917] Mark also_make targets as updated in make -n
authorPaul Smith <psmith@gnu.org>
Mon, 5 Aug 2024 03:48:51 +0000 (23:48 -0400)
committerPaul Smith <psmith@gnu.org>
Mon, 5 Aug 2024 03:53:26 +0000 (23:53 -0400)
Suggested patch by Hannes Domani <ssbssa@yahoo.de>

* src/remake.c (notice_finished_file): When run with -n, mark
also_make targets as updated.
* tests/scripts/options/dash-n: Test pattern and grouped targets.

AUTHORS
src/remake.c
tests/scripts/options/dash-n

diff --git a/AUTHORS b/AUTHORS
index d319855a0aae6ef90779fa52e8c828a2020dc5df..a3d1aeac2345535d5931a8ac191bf5c96a191575 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -64,6 +64,7 @@ Other contributors:
   Jeremy Devenport <jeremy.devenport@gmail.com>
   Pete Dietl <petedietl@gmail.com>
   Aaron Digulla <digulla@fh-konstanz.de>
+  Hannes Domani <ssbssa@yahoo.de>
   Martin Dorey <martin.dorey@hds.com>
   Christian Eggers <ceggers@arri.de>
   Paul Eggert <eggert@twinsun.com>
index b19c67c23a46a30117d060ceff968617de1b407e..50d8f7ec72417e656e664dcb6edb87cf0086a041 100644 (file)
@@ -1112,11 +1112,17 @@ notice_finished_file (struct file *file)
           d->file->update_status = file->update_status;
 
           if (ran && !d->file->phony)
-            /* Fetch the new modification time.
-               We do this instead of just invalidating the cached time
-               so that a vpath_search can happen.  Otherwise, it would
-               never be done because the target is already updated.  */
-            f_mtime (d->file, 0);
+            {
+              /* Fetch the new modification time.
+                 We do this instead of just invalidating the cached time
+                 so that a vpath_search can happen.  Otherwise, it would
+                 never be done because the target is already updated.  */
+              f_mtime (d->file, 0);
+
+              if (just_print_flag)
+                /* Nothing got updated, but pretend it did.  */
+                d->file->last_mtime = NEW_MTIME;
+            }
         }
 
       /* If the target was created by an implicit rule, and it was updated,
index ca3b43d67c6da4a2094dee63c7f759ce6b3d8bb9..91b8781aba7ad203d569a693ce19b73fcb1f3e9b 100644 (file)
@@ -15,8 +15,6 @@ intermediate: orig ; echo >> $@
 
 run_make_test(undef, '-Worig -n', "echo >> intermediate\necho >> final\n");
 
-rmfiles(qw(orig intermediate final));
-
 # We consider the actual updated timestamp of targets with all
 # recursive commands, even with -n.  Switching this to the new model
 # is non-trivial because we use a trick below to change the log content
@@ -65,10 +63,6 @@ close(DASH_N_LOG);
 
 &compare_output("touch b\ntouch a\n", &get_logfile(1));
 
-# CLEANUP
-
-unlink(qw(a b c));
-
 # Ensure -n continues to be included with recursive/re-execed make
 # See Savannah bug #38051
 
@@ -81,7 +75,6 @@ foo: ; \@\$(MAKE) -f "$submake" bar
 EOF
 close(MAKEFILE);
 
-
 # The bar target should print what would happen, but not actually run
 open(MAKEFILE, "> $submake");
 print MAKEFILE <<'EOF';
@@ -95,6 +88,71 @@ close(MAKEFILE);
 $answer = subst_make_string("#MAKEPATH# -f \"$submake\" bar\ntouch inc\necho n --no-print-directory\n");
 &compare_output($answer, &get_logfile(1));
 
-unlink('inc');
+# SV 65917: Verify handling of -n with multi-target pattern rules
+
+# This is what the makefile below would run
+utouch(-12, qw(alpha.p));
+utouch(-10, qw(alpha.x alpha.y));
+utouch(-8, qw(beta.p));
+utouch(-6, qw(beta.x beta.y));
+utouch(-4, qw(alpha.q));
+utouch(-2, qw(beta.q));
+
+# Now make some things out of date
+touch(qw(alpha.p));
+
+run_make_test(q!
+.SUFFIXES:
+.RECIPEPREFIX := >
+
+all: alpha.q beta.q
+
+alpha.p beta.p:
+> touch $@
+
+%.x %.y: %.p
+> touch $*.x $*.y
+
+alpha.q: alpha.x alpha.y beta.y
+> touch $@
+
+beta.q: beta.x beta.y alpha.y
+> touch $@
+!,
+    '-n', "touch alpha.x alpha.y\ntouch alpha.q\ntouch beta.q\n");
+
+# This is what the makefile below would run
+utouch(-12, qw(quark.p));
+utouch(-10, qw(quark.x quark.y));
+utouch(-8, qw(meson.p));
+utouch(-6, qw(meson.x meson.y));
+utouch(-4, qw(quark.q));
+utouch(-2, qw(meson.q));
+
+# Now make some things out of date
+touch(qw(quark.p));
+
+run_make_test(q!
+.SUFFIXES:
+.RECIPEPREFIX := >
+
+all: quark.q meson.q
+
+quark.p meson.p:
+> touch $@
+
+quark.x quark.y &: quark.p
+> touch quark.x quark.y
+
+meson.x meson.y &: meson.p
+> touch meson.x meson.y
+
+quark.q: quark.x quark.y meson.y
+> touch $@
+
+meson.q: meson.x meson.y quark.y
+> touch $@
+!,
+    '-n', "touch quark.x quark.y\ntouch quark.q\ntouch meson.q\n");
 
 1;