summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2022-12-17 14:01:02 -0500
committerPaul Smith <psmith@gnu.org>2022-12-18 14:44:17 -0500
commitc0023150f176a91526d88b45eb02334add9059e1 (patch)
tree41a6467e579c52cd7db9a8f6e25ee9ee9157d43a
parenta89eef87e6782179a7ab10824fe0cf3cbe48d3ee (diff)
downloadmake-git-c0023150f176a91526d88b45eb02334add9059e1.tar.gz
* src/job.c (new_job): [SV 63510] Trace phony prerequisite rebuilds
-rw-r--r--src/job.c51
1 files changed, 45 insertions, 6 deletions
diff --git a/src/job.c b/src/job.c
index b78f279c..876898c8 100644
--- 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.