调试 makefile 的工具

我有一个很大的遗留代码库,带有非常复杂的 makefile,有很多变量。有时候我需要改变它们,我发现很难弄清楚为什么改变没有像我期望的那样起作用。我想要找到的是一个工具,它基本上可以对“ make”进程进行逐步调试,我会给它一个目录,我可以在进程的不同点看到不同变量的值。调试标志似乎都没有显示出我想要的,尽管我可能遗漏了一些东西。有人知道怎么做吗?

71538 次浏览

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).

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

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

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

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.

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.