调试GNU make

mit*_*una 71 debugging makefile gnu-make

是否有命令行方式make来找出目标的哪些先决条件未更新?

pax*_*blo 98

make -d
Run Code Online (Sandbox Code Playgroud)

应该给你更多比足够的信息来调试你的makefile.

请注意:分析输出需要花费一些时间和精力,但是将输出加载到您喜欢的编辑器中并进行搜索会有很多帮助.

如果指定了您感兴趣的特定目标,则可以大大减少调试输出的数量.因此,如果您只对dodgy目标感兴趣,而不是只make -d对可能产生一百种不同的目标感兴趣,请尝试:

make clean
make -d dodgy
Run Code Online (Sandbox Code Playgroud)

(假设你clean当然有目标).

make --debug是相同的,make -d但你也可以指定:

make --debug=FLAGS
Run Code Online (Sandbox Code Playgroud)

标志可以是:

  • a用于所有调试(与make -d和相同make --debug).
  • b 用于基本调试.
  • v 稍微冗长的基本调试.
  • i 对于隐式规则.
  • j 用于调用信息.
  • m 在makefile重制期间获取信息.

它看起来make --debug=b是您需要的最佳选择,如以下记录所示:

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'.
Run Code Online (Sandbox Code Playgroud)

  • 另一个建议是,如果你想摆脱内置的隐式规则,你可以在`-d`旁边使用`-r`标志. (7认同)

Lir*_*una 23

你在寻找Make的"干跑"吗?它将打印出make正在做的事情而不实际这样做,让你看看会发生什么.

国旗是-n,使用它make -n.


小智 8

还有GNU make带有调试器和更好的跟踪/错误输出:Remake

截屏视频:http://showmedo.com/videotutorials/video?name = linuxBernsteinMakeDebug1&fromSeriesID = 40


Bet*_*eta 7

你的问题有点不清楚.如果要查看最近未修改的先决条件文件,请使用ls -l查看其修改时间.如果你想看看make是做什么的,试试这个:

# Make will announce when it is making this target, and why.
sometarget: preq1 preq2 preq3
    @echo making $@
    @echo The following preqs are newer than the target: $?
    do_things


Geo*_*dré 6

我通常做的不是像以前的回答者那样使用-d.

我要么:

  1. 使用-p打印数据库,以查看已创建的规则.如果你有第二个扩展规则并且即时创建规则,特别是递归make,这很方便.
  2. 大量使用$(info)功能.
  3. 使用本DrDobbs文章Debugging Makefiles中描述的提示和技巧

下面是我用于打印输出值的一些代码:

define pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef

define pva
$(foreach t,$(1),$(call pv,$(t)))
endef

define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
Run Code Online (Sandbox Code Playgroud)