debugging 调试GNU make

eqqqjvef  于 2023-02-19  发布在  其他
关注(0)|答案(7)|浏览(144)

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

falq053o

falq053o1#

make -d

应该会为您提供 * 更多 * 信息来调试makefile。
请注意:分析输出需要花费一些时间和精力,但是将输出加载到您最喜欢的编辑器中并进行搜索会有很大帮助。
如果指定感兴趣的特定目标,可以大大减少调试输出的数量。因此,如果您只对dodgy目标感兴趣,而不是只对make -d感兴趣,因为make -d可能会产生上百种不同的结果,请尝试:

make clean
make -d dodgy

(当然,假设您有一个clean目标)。
make --debugmake -d相同,但您还可以指定:

make --debug=FLAGS

其中标志可以是:

  • a用于所有调试(与make -dmake --debug相同)。
  • b用于基本调试。
  • v用于稍微更详细的基本调试。
  • i表示隐式规则。
  • j获取调用信息。
  • m以获取生成文件重拍期间的信息。

看起来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'.
lpwwtiir

lpwwtiir2#

你在寻找Make的“预演”吗?它会打印出make正在做什么,而不是实际做什么,让你看到发生了什么。
该标志为-n,请像make -n一样使用它。

clj7thdc

clj7thdc3#

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

这两个问题虽然仍然相关,但都有点老了。

v2g6jxz6

v2g6jxz64#

你的问题有点不清楚。如果你想知道哪些必备文件最近没有被修改过,可以使用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
oxiaedzo

oxiaedzo5#

我通常不会像前面的回答者所说的那样使用-d。
本人:
1.使用-p来打印数据库,查看已经创建了哪些规则。如果你有第二个扩展规则,并且正在动态创建规则,特别是递归make,这是很方便的。
1.大量使用$(info)函数。
1.使用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
niknxzdl

niknxzdl6#

有几次我还使用了JohnGraham-Cumming的this(旧的,但仍在工作)交互式make调试器

cpjpxq1n

cpjpxq1n7#

我使用makegnu make模板来定义每个目标的make规则;
模板类似于编写规则的宏,此处将对其进行解释https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
当你的make系统包含一个核心makefile来生成每个项目类型的所有规则时,这个特性是有用的;如果它说做一个共享库,那么它编写规则来编译一个共享库;等等,用于其它类型的目标。
在这个例子中:如果您将SHOW_RULES = 1添加到make命令行,它还将显示PROGRAM_target_setup_template生成的规则文本;以及生成规则本身(使用eval)。

# this one defines the target for real
 $(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog))))

 ifneq "$(SHOW_RULES)" ""
 $(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog))))
 endif
  • $(call ...)调用模板
  • $(info ...)打印模板替换的结果;(eval将调用输出解析并添加到当前make文件)

更多关于我的make文件的信息:http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

相关问题