Tool for debugging makefiles

DebuggingMakefile

Debugging Problem Overview


I have a large legacy codebase with very complicated makefiles, with lots of variables. Sometimes I need to change them, and I find that it's very difficult to figure out why the change isn't working the way I expect. What I'd like to find is a tool that basically does step-through-debugging of the "make" process, where I would give it a directory, and I would be able to see the value of different variables at different points in the process. None of the debug flags to make seem to show me what I want, although it's possible that I'm missing something. Does anyone know of a way to do this?

Debugging Solutions


Solution 1 - Debugging

Have you been looking at the output from running make -n and make -np, and the biggie make -nd?

Are you using a fairly recent version of gmake?

Have you looked at the free chapter on Debugging Makefiles available on O'Reilly's site for their excellent book "Managing Projects with GNU Make" (Amazon Link).

Solution 2 - Debugging

I'm sure that remake is what you are looking for.

From the homepage:

> remake is a patched and modernized version of GNU make utility that adds improved error reporting, the ability to trace execution in a comprehensible way, and a debugger.

It has gdb-like interface and is supported by mdb-mode in (x)emacs which means breakponts, watches etc. And there's DDD if you don't like (x)emacs

Solution 3 - Debugging

From the man page on make command-line options:

-n, --just-print, --dry-run, --recon  
Print the commands that would be executed, but do not execute them.  

-d  Print debugging information in addition to normal processing.  
The debugging information says  
which files are being considered for remaking,  
which file-times are being compared and with what results,  
which files actually need  to  be  remade,  
which implicit  rules are considered and which are applied---  
everything interesting about how make decides what to do.  

--debug[=FLAGS] Print debugging information in addition to normal processing.  
If the FLAGS are omitted, then the behaviour is the same as if -d was specified.  
FLAGS may be:  
'a' for all debugging output same as using -d,  
'b' for basic debugging,  
'v' for more verbose basic debugging,  
'i' for showing implicit rules,  
'j' for details on invocation of commands, and  
'm' for debugging while remaking makefiles.  

Solution 4 - Debugging

I'm not aware of any specific flag that does exactly what you want, but

--print-data-base
sounds like it might be useful.

Solution 5 - Debugging

Solution 6 - Debugging

There is a GNU make debugger project at http://gmd.sf.net which looks quite useful. The main feature supported by gmd is breakpointing, which may be more useful than stepping. To use this, you download gmd from http://gmd.sf.net and gmsl from http://gmsl.sf.net, and do an 'include gmd' in your makefile.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmbyrne215View Question on Stackoverflow
Solution 1 - DebuggingRob WellsView Answer on Stackoverflow
Solution 2 - DebuggingRajishView Answer on Stackoverflow
Solution 3 - DebuggingGuruMView Answer on Stackoverflow
Solution 4 - Debuggingargv0View Answer on Stackoverflow
Solution 5 - DebuggingmavijanaView Answer on Stackoverflow
Solution 6 - DebuggingHoward Lee HarknessView Answer on Stackoverflow