debuggingGNU make

是否有一个命令行的方式来找出哪个目标的先决条件没有更新?

 make -d 

应该给你足够的信息来debugging你的makefile。

被警告:分析输出需要花费一些时间和精力,但是将输出加载到你最喜欢的编辑器中,search会有很大的帮助。

如果你指定了你感兴趣的特定目标,那么你可以大大减lessdebugging输出的数量。所以如果你只关心dodgy目标,而不是简单的make -d ,那么可能会产生上百种不同的结果,试试:

 make clean make -d dodgy 

(假设你有一个clean目标,当然)。

make --debugmake -d是一样的,但是你也可以指定:

 make --debug=FLAGS 

旗帜可以是:

  • a用于所有的debugging(与make -dmake --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。

我也是:

  1. 使用-p打印数据库,查看已创build的规则。 如果你有第二个扩展规则,并且正在创build规则,这是非常方便的,尤其是recursion的make。
  2. 大量使用$(info)函数。
  3. 使用这个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