Is there a command line way in make
to find out which of the prerequisites of a target is not updated?
Debugging makefiles is somewhat of a black art. Unfortunately, there is no such thing as a makefile debugger to examine how a particular rule is being evaluated or a variable expanded. Instead, most debugging is performed with simple print state- ments and by inspection of the makefile.
To use it, just set the list of variables to print on the command line, and include the debug target: $ make V="USERNAME SHELL" debug makefile:2: USERNAME = Owner makefile:2: SHELL = /bin/sh.exe make: debug is up to date. Now you can print variables by simply listing them on the command line.
The variable $@ represents the name of the target and $< represents the first prerequisite required to create the output file.
make -d
should give you more than enough information to debug your makefile.
Be warned: it will take some time and effort to analyze the output but loading the output into your favorite editor and doing searches will assist a lot.
You can greatly reduce the amount of debugging output if you specify the specific target you're interested in. So if you're only interested in the dodgy
target, instead of just make -d
which may make a hundred different things, try:
make clean make -d dodgy
(assuming you have a clean
target of course).
The make --debug
is identical to make -d
but you can also specify:
make --debug=FLAGS
where flags can be:
a
for all debugging (same as make -d
and make --debug
).b
for basic debugging.v
for slightly more verbose basic debugging.i
for implicit rules.j
for invocation information.m
for information during makefile remakes.It looks like make --debug=b
is the best option for what you need, as shown in the following transcript:
pax@paxbox> cat makefile c:a b touch c pax@paxbox> touch a b ; make touch c pax@paxbox> make make: 'c' is up to date. pax@paxbox> touch a ; make --debug=b GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. Blah, blah, blah. Reading makefiles... Updating goal targets.... Prerequisite 'a' is newer than target 'c'. Must remake target 'c'. touch c Successfully remade target file 'c'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With