Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging GNU make

Is there a command line way in make to find out which of the prerequisites of a target is not updated?

like image 328
mithuna Avatar asked Nov 17 '09 00:11

mithuna


People also ask

Can you debug a makefile?

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.

How do I add debug prints in 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.

What is $@ in makefile?

The variable $@ represents the name of the target and $< represents the first prerequisite required to create the output file.


1 Answers

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'. 
like image 99
paxdiablo Avatar answered Sep 22 '22 23:09

paxdiablo