Hello,

I am working on reconstructing the visual dependency graph of a build using GNU 
Make's --debug output. However, I have run into a limitation when combining 
debugging with the -o (--old-file) option.

When a target is marked as old via -o, GNU Make seems to immediately optimize 
away the traversal of that target's prerequisites. Because these prerequisites 
are not traversed, they are completely omitted from the debug log. This leaves 
the reconstructed visual graph incomplete.

>From an execution standpoint, optimizing out these checks makes perfect sense. 
>However, for tooling and visualization, it creates a blind spot. Could the 
>final decision to consider a target up-to-date (based on -o) be deferred until 
>after its prerequisites have been traversed in the graph?

I tried using the -n (--just-print / dry-run) option as an alternative to see 
the full graph without executing commands, but it has a different limitation: 
rules that update included makefiles are still actively executed under -n.

This leaves a gap in the current options. There appears to be no combination of 
flags that allows a user to safely skip a target's execution while still fully 
discovering and dumping its underlying dependency tree in the debug output.

Here is a minimal example demonstrating the behavior:

$ make --debug -f - -o t1
GNU Make 4.4.1
Built for x86_64-pc-cygwin
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
t1: t2; echo $@
t2:; echo $@
Reading makefiles...
Updating makefiles....
Updating goal targets....
make: 't1' is up to date.

Notice that t2 is never mentioned or evaluated in the debug output above. 
Compare this to a normal run where the full relationship is explicitly printed:

$ make --debug -f -
GNU Make 4.4.1
Built for x86_64-pc-cygwin
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
t1: t2; echo $@
t2:; echo $@
Reading makefiles...
Updating makefiles....
Updating goal targets....
 File 't1' does not exist.
  File 't2' does not exist.
 Must remake target 't2'.
echo t2
t2
 Successfully remade target file 't2'.
Must remake target 't1'.
echo t1
t1
Successfully remade target file 't1'.

Is this immediate pruning of the graph an intentional design constraint for 
performance, or would the maintainers consider a patch/option that forces 
prerequisite traversal even when a target is short-circuited by -o?

I would love to hear your thoughts on whether this use case is currently 
supported through other means, or if a feature request is appropriate here.

Reply via email to