]> git.ipfire.org Git - thirdparty/make.git/commitdiff
* src/job.c (new_job): [SV 63510] Trace phony prerequisite rebuilds
authorPaul Smith <psmith@gnu.org>
Sat, 17 Dec 2022 19:01:02 +0000 (14:01 -0500)
committerPaul Smith <psmith@gnu.org>
Sun, 18 Dec 2022 19:44:17 +0000 (14:44 -0500)
src/job.c

index b78f279c5a72748009dac3ac2a4a19ae18116855..876898c8436b89929faa1862b6ddd9d89cee2253 100644 (file)
--- a/src/job.c
+++ b/src/job.c
@@ -1893,7 +1893,6 @@ new_job (struct file *file)
      Use message here so that changes to working directories are logged.  */
   if (ISDB (DB_WHY))
     {
-      char *newer = allocated_variable_expand_for_file ("$?", c->file);
       const char *nm;
 
       if (! cmds->fileinfo.filenm)
@@ -1905,11 +1904,51 @@ new_job (struct file *file)
           nm = n;
         }
 
-      OSSS (message, 0,
-            _("%s: update target '%s' due to: %s"), nm, c->file->name,
-              newer[0] == '\0' ? _("target does not exist") : newer);
-
-      free (newer);
+      if (c->file->phony)
+        OSS (message, 0, _("%s: update target '%s' due to: target is .PHONY"),
+             nm, c->file->name);
+      else if (c->file->last_mtime == NONEXISTENT_MTIME)
+        OSS (message, 0,
+             _("%s: update target '%s' due to: target does not exist"),
+             nm, c->file->name);
+      else
+        {
+          char *newer = allocated_variable_expand_for_file ("$?", c->file);
+          if (newer[0] != '\0')
+            {
+              OSSS (message, 0, _("%s: update target '%s' due to: %s"),
+                    nm, c->file->name, newer);
+              free (newer);
+            }
+          else
+            {
+              /* One or more files didn't exist, and didn't get created.  */
+              size_t len = 0;
+              struct dep *d;
+
+              for (d = c->file->deps; d != NULL; d = d->next)
+                if (d->file->last_mtime == NONEXISTENT_MTIME)
+                  len += strlen (d->file->name) + 1;
+
+              if (!len)
+                OSS (message, 0,
+                     _("%s: update target '%s' due to: unknown reasons"),
+                     nm, c->file->name);
+              else
+                {
+                  char *cp = newer = alloca (len);
+                  for (d = c->file->deps; d != NULL; d = d->next)
+                    if (d->file->last_mtime == NONEXISTENT_MTIME)
+                      {
+                        if (cp > newer)
+                          *(cp++) = ' ';
+                        cp = stpcpy (cp, d->file->name);
+                      }
+                  OSSS (message, 0, _("%s: update target '%s' due to: %s"),
+                        nm, c->file->name, newer);
+                }
+            }
+        }
     }
 
   /* The job is now primed.  Start it running.