(当然,假设您有一个clean目标)。 make --debug与make -d相同,但您还可以指定:
make --debug=FLAGS
其中标志可以是:
a用于所有调试(与make -d和make --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'.
# 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
# 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
7条答案
按热度按时间falq053o1#
应该会为您提供 * 更多 * 信息来调试makefile。
请注意:分析输出需要花费一些时间和精力,但是将输出加载到您最喜欢的编辑器中并进行搜索会有很大帮助。
如果指定感兴趣的特定目标,可以大大减少调试输出的数量。因此,如果您只对
dodgy
目标感兴趣,而不是只对make -d
感兴趣,因为make -d
可能会产生上百种不同的结果,请尝试:(当然,假设您有一个
clean
目标)。make --debug
与make -d
相同,但您还可以指定:其中标志可以是:
a
用于所有调试(与make -d
和make --debug
相同)。b
用于基本调试。v
用于稍微更详细的基本调试。i
表示隐式规则。j
获取调用信息。m
以获取生成文件重拍期间的信息。看起来
make --debug=b
是您所需的最佳选择,如以下脚本所示:lpwwtiir2#
你在寻找Make的“预演”吗?它会打印出make正在做什么,而不是实际做什么,让你看到发生了什么。
该标志为
-n
,请像make -n
一样使用它。clj7thdc3#
GNU make也有调试器和更好的跟踪/错误输出:Remake
这两个问题虽然仍然相关,但都有点老了。
v2g6jxz64#
你的问题有点不清楚。如果你想知道哪些必备文件最近没有被修改过,可以使用ls -l来查看它们的修改时间。如果你想知道make正在做什么,可以尝试这样做:
oxiaedzo5#
我通常不会像前面的回答者所说的那样使用-d。
本人:
1.使用-p来打印数据库,查看已经创建了哪些规则。如果你有第二个扩展规则,并且正在动态创建规则,特别是递归make,这是很方便的。
1.大量使用$(info)函数。
1.使用DrDobbs文章Debugging Makefiles中介绍的技巧和窍门
下面是我用来打印输出值的一些代码:
niknxzdl6#
有几次我还使用了JohnGraham-Cumming的this(旧的,但仍在工作)交互式make调试器
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)。
更多关于我的make文件的信息:http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html