debuggingGNU make
是否有一个命令行的方式来找出哪个目标的先决条件没有更新?
make -d
应该给你足够的信息来debugging你的makefile。
被警告:分析输出需要花费一些时间和精力,但是将输出加载到你最喜欢的编辑器中,search会有很大的帮助。
如果你指定了你感兴趣的特定目标,那么你可以大大减lessdebugging输出的数量。所以如果你只关心dodgy
目标,而不是简单的make -d
,那么可能会产生上百种不同的结果,试试:
make clean make -d dodgy
(假设你有一个clean
目标,当然)。
make --debug
和make -d
是一样的,但是你也可以指定:
make --debug=FLAGS
旗帜可以是:
-
a
用于所有的debugging(与make -d
和make --debug
)。 -
b
进行基本的debugging。 -
v
稍微更详细的基本debugging。 -
i
为隐式规则。 -
j
为调用信息。 -
m
在makefile文件重制的信息。
它看起来像make --debug=b
是你所需要的最好的select,如以下成绩单所示:
pax@paxbox> cat makefile c:ab touch c pax@paxbox> touch ab ; 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的“空转”吗? 它会打印出正在做什么而没有真正做到这一点,让你看看会发生什么。
标志是-n
,像make -n
一样使用它。
你的问题有点不清楚。 如果您想查看哪些先决条件文件最近未被修改,请使用ls -l来查看它们的修改时间。 如果你想看看正在做什么,试试这个:
#制作会宣布何时制作这个目标,为什么。 sometarget:preq1 preq2 preq3 @echo制作$ @ @echo以下preqs比目标新:$? 做事
还有GNU make使用debugging器和更好的跟踪/错误输出: 重新制作
screencast: http ://showmedo.com/videotutorials/video?name = linuxBernsteinMakeDebug1&fromSeriesID =40
通常我所做的不是像以前的回答者那样使用-d。
我也是:
- 使用-p打印数据库,查看已创build的规则。 如果你有第二个扩展规则,并且正在创build规则,这是非常方便的,尤其是recursion的make。
- 大量使用$(info)函数。
- 使用这个DrDobbs文章debuggingMakefile中描述的技巧和窍门
以下是我用于打印值的一些代码:
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
很多时候,我也用这个 (旧的,但仍然工作)交互作出约翰·格雷厄姆·卡明的debugging器
我正在使用make gnu make模板来定义每个目标的make规则;
模板就像编写规则的macros,它们在这里解释https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
当你有一个make系统包含一个核心的makefile来为每个项目types生成所有规则的时候,这个特性是很有用的。 如果它说要做一个共享库,那么它会写规则来编译一个共享库; 等等其他types的目标。
在这个例子中:如果将SHOW_RULES = 1添加到make命令行,它还会显示由PROGRAM_target_setup_template生成的规则文本; 随着自己生成的规则(与评估)。
# 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 …)打印模板replace的结果; (eval将会调用输出的parsing并添加到当前的make文件中)
更多关于我的make文件在这里: http : //mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html