在make
中,有没有一种命令行方式可以找出目标的先决条件中哪些没有更新?
make -d
这应该为您提供足够的信息来调试您的Makefile。
请注意:分析输出需要一些时间和精力,但将输出加载到您喜欢的编辑器中并进行搜索会有很大帮助。
如果您指定您感兴趣的特定目标,可以大大减少调试输出的数量。因此,如果您只对'dodgy'目标感兴趣,而不是仅使用make -d
(可能有100个不同的东西),请尝试:
make clean
make -d dodgy
(假设当然你已经有了一个干净的目标clean
)。
make --debug
与make -d
是相同的,但您还可以指定:
make --debug=FLAGS
其中flags可以是:
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'.
-d
之后加上-r
标志。 - P Shved您是否正在寻找Make的“试运行”功能?它将打印出make正在执行的内容,而不实际执行,使您可以看到发生了什么。
标志是-n
,使用方法如下:make -n
。
-d
太啰嗦了(甚至 --debug=b
也是)。特别是当你卡在递归 make 上时(呃!)。 - Adam Lindbergdefine pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef
define pva
$(foreach t,$(1),$(call pv,$(t)))
endef
define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
你的问题有点不太清楚。如果您想查看哪些先决条件文件最近没有被修改,请使用ls -l查看它们的修改时间。如果您想查看make正在做什么,请尝试以下操作:
# Make会在制作此目标及其原因时进行公告。 sometarget: preq1 preq2 preq3 @echo making $@ @echo 以下先决条件比目标新:$? 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
关于我的 make 文件的更多信息,请参见这里:http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html