【问题标题】:How to see exactly what make is doing如何准确查看 make 正在做什么
【发布时间】:2014-01-27 14:13:31
【问题描述】:

我有一些用于第三方项目的大型 make 文件,由于链接器问题而无法构建。

通过查看 make 文件,我认为它应该执行如下操作:

LIBS = -lm
CC = gcc
bin = bin
myapp: $(bin)/main.o $(bin)/other.o $(bin)/etc.o
    $(CC) $(bin)/main.o $(bin)/other.o $(bin)/etc.o $(LIBS) -o myapp

gcc bin/main.o bin/other.o bin/etc.o -lm -o myapp

从错误来看,它似乎在以下方面失败:它也没有将任何 .o 文件放在预期的 bin/ 位置,而是将它们留在源目录中......

cc main.o -o myapp

但我找不到任何可能来自的地方。有没有办法通过 make 文件获取某种堆栈跟踪?

我知道 -n 和 -d,但似乎都没有告诉我哪个目标行和文件产生了该命令,或者哪个系列目标导致了那里以及任何 $() 扩展的值(我期望的是唯一的 myapp:我可以在任何 makefile 中找到...)

【问题讨论】:

  • @Evert 这是用于自动工具生成的makefile。
  • @Graeme 谢谢,我没有意识到这一点。 VERBOSE=1 也适用于 cmake 生成的 makefile,但也许 cmake 使用自动工具?
  • cmake 是一种替代方案,并且更跨平台,尽管它可能会创建相同或相似的变量。不过,我在问题中都没有看到!

标签: makefile


【解决方案1】:

查看--debug 选项。从我的手册页:

--debug[=FLAGS]

       Print debugging information in addition to normal processing.  If the
       FLAGS are omitted, then the behavior is the same as if -d was specified.
       FLAGS may be a for all debugging output (same as using -d), b for basic
       debugging, v for more verbose basic debugging, i for showing implicit
       rules, j for details on invocation of commands, and  m  for debugging
       while remaking makefiles.

【讨论】:

  • 我仍然看不到如何找出它在 MakeFile 中的位置?就像我说的我 traied -d 它输出了“寻找规则”,“尝试模式规则”,“尝试隐式特权”的负载,最后只是说“必须重新制作目标'myapp'”并发出命令我显示。我如何找出该命令的来源?我知道它一定找到了“myapp”的规则,但它在哪里说明该规则在文件系统中的位置? (我确实尝试搜索整个源代码树,并在我的问题中找到了规则,但这显然不是正在执行的内容吗?)
  • @FireLancer 我的错,我认为--debug 选项会比-d 提供更多。我的手册页中的第二句话实际上是错误的。不管怎样,看看这个问题 - stackoverflow.com/questions/54753/tool-for-debugging-makefiles, remake 似乎是个好主意。
【解决方案2】:

remake 是一个很好的选择,但在紧要关头,类似以下内容(另存为 debug.mk)也可以提供很好的帮助。它不会像翻拍那样告诉你,但它可能会告诉你足够的开始。

# Use as: MAKEFILES=debug.mk make
OLD_SHELL := $(SHELL)

ifneq (undefined,$(origin X))
override X = -x
endif

SHELL = $(if $@,$(warning Running $@$(if $<, (from: $<))$(if $?, (newer: $?))))$(OLD_SHELL) $(X)

如果您想更多地了解发生了什么,您也可以在那里打印出其他自动变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多