如何跟踪Makefile行号以进行故障排除?

如何跟踪Makefile行号以进行故障排除?,makefile,gnu-make,Makefile,Gnu Make,这与我正在使用的旧PowerMacG5有关。它是活的,因为我用它来测试旧的编译器和big-endian,PowerPC 我试图确定生成文件中的哪一行在查找匹配的`时导致了意外的EOF。我们不使用backtick(我们添加它们是为了测试这个问题);对于一个有1000行的makefile来说,试错和猜测的速度太慢了 当我使用--debug运行make时,它无法打印行号: $ make --debug=a GNU Make 3.82 Built for powerpc-apple-darwin9.8.

这与我正在使用的旧PowerMacG5有关。它是活的,因为我用它来测试旧的编译器和big-endian,PowerPC

我试图确定生成文件中的哪一行在查找匹配的`时导致了意外的EOF。我们不使用backtick(我们添加它们是为了测试这个问题);对于一个有1000行的makefile来说,试错和猜测的速度太慢了

当我使用
--debug
运行make时,它无法打印行号:

$ make --debug=a
GNU Make 3.82
Built for powerpc-apple-darwin9.8.0
...

Reading makefiles...
Reading makefile `GNUmakefile'...
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
Updating makefiles...
...
make--help
似乎没有讨论它:

$ make --help 2>&1 | grep -i line
$
我的第一个问题是,如何让GNU make打印行号

我的第二个问题是,一个程序,只要make对于调试支持来说是如此的跛脚,那么

你可以尝试<代码> make -跟踪<代码>(至少4),或者考虑使用(代码的变体> make /代码>能够调试),如<代码> Remake -X/COD>。p> 对于调试复杂的
Makefile
-s,使用
remake
非常方便

你可以考虑使用其他工具,例如

如果您使用GNUMake,您最好将其升级到一个新版本(并在配置时启用)


Linux:find./makefile_dir-mtime-10,查看更改的文件:foo.c,然后是grep-n foo.c makefile,并查看makefile中的行号。make不会打印这些错误。它们是由贝壳印刷的。就make而言,这里没有错误,因此它不会打印任何跟踪信息

在没有看到makefile的情况下,我们无法确定问题出在
$(shell…script…
语句中,
…script…
有语法错误。我假设您的shell脚本包含在make变量中,这使得很难准确地看到发送到shell的内容以及它是否有语法错误

我同意gnumake对此没有很好的调试:启用调试时,它应该打印有关
shell
函数调用的脚本的详细信息,以及调用脚本的位置(在makefile中)

我认为@Vroomfondel有最好的想法;将
$(info…
消息添加到您的makefile中,类似于
$(shell…
调用,如:

$(info starting shell: $(SCRIPT))
OUT := $(shell $(SCRIPT))

使用二进制搜索,即使在很长的makefile中,您也应该能够非常快速地确定它。

更好的技巧可能是设置
SHELL='bash-x'
您的makefile确实使用了backtick:
SUNCC_VERSION:=$(subst`,',$(SHELL$(CXX)-v2>&1))
。此外,指责make是工具的指导程序有点不公平,因为有时它们自己的责任根本无法很好地协同工作。当
$(shell)
调用发出错误状态时,make没有停止执行,问题在于它有很好的理由不停止执行;在您拥有未知体系结构/OS的情况下,在每个对配置X有效但对Y无效的命令行上停止同样令人不快。作为实际提示,您可以在所有这些
$(shell…)中插入
$(错误停止在此处)
makefile在前100行中所做的欺骗,并进行二进制搜索以找到第一个错误的shell调用。当您找到它时,您可以通过在
$(shell)
之前执行
$(info..)
来发出有罪的调用,以查看移交给bash的字符串的外观。@Vroomfondel-一小时前添加了
subst
命令,以防引起问题。这是其中一个可能发生过4次的领域,就像在make输出中一样。但这是一种相当糟糕的故障排除方法。问题仍然存在:如何在执行时打印每一行。Ad“尝试和错误猜测”:断开的命令行肯定发生在makefile的第一次扫描期间,因此是二进制搜索(即,在文件的50%,然后25%或75%等处插入我建议的错误指令)确保在几次运行中解决问题-无需执行任何规则。这只是几分钟的问题。谢谢
make--trace
remake
产生同样无用的结果。