是否有命令行方法make
可以找出未更新目标的哪些先决条件?
Answers:
make -d
应该给你更多比足够的信息来调试你的makefile。
请注意:分析输出将花费一些时间和精力,但是将输出加载到您喜欢的编辑器中并进行搜索将大有帮助。
如果您指定感兴趣的特定目标,则可以大大减少调试输出的数量。因此,如果您仅对dodgy
目标感兴趣,而不是仅仅感兴趣的目标,那么make -d
可以尝试:
make clean
make -d dodgy
(假设您clean
当然有一个目标)。
的make --debug
是相同的make -d
,但你也可以指定:
make --debug=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'.
-r
旁边使用flag -d
。
还有一个带有调试器和更好的跟踪/错误输出的GNU make:Remake
两者虽然仍然相关,但都有些陈旧。
我通常不像以前的回答者所说的那样使用-d。
我要么:
以下是我用于打印值的一些代码:
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
我正在使用make gnu make模板来定义每个目标的make规则;
模板就像编写规则的宏一样,在此进行解释 https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
当您的make系统包含一个核心makefile来生成每个项目类型的所有规则时,此功能很有用;如果它说要做一个共享库,那么它将编写规则以编译一个共享库;其他类型的目标。
在此示例中:如果在make命令行中添加SHOW_RULES = 1,则它还会显示由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
有关我的make文件的更多信息,请访问:http : //mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
echo
在每个目标上都进行一些调试来弄清楚这一点吗?