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

时间:2018-01-02 05:44:11

标签: makefile gnu-make

这与How to trace Makefile targets for troubleshooting?我正在研究旧的PowerMac G5有关。它还活着,因为我用它来测试旧的编译器和big-endian,PowerPC。

我正在尝试确定makefile中的哪一行导致 unexpected EOF while looking for matching ``' 。我们的makefile 不使用反引号(我们添加了它们来测试此问题);对于带有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的程序在调试支持方面如此蹩脚?

2 个答案:

答案 0 :(得分:0)

您可以尝试make --trace(至少使用GNU make 4),或者考虑使用remakemake能够调试的变体),{{1} }。

对于调试复杂remake -x - s,使用Makefile非常方便

您可以考虑使用其他build automation工具,例如ninja

如果您使用GNU make,您最好将其升级到更新版本(并在配置时启用Guile extensions)。

答案 1 :(得分:0)

make不会打印这些错误。它们由外壳印刷。就make而言,这里没有错误,因此它不会打印任何跟踪信息。

如果没有看到makefile,我们无法确定,但几乎可以肯定问题出现在@XmlElement(name = "some-value", required = true) protected String someValue; 语句中,其中$(shell ...script...)有语法错误。我假设你的shell脚本包含在make变量中,这使得很难确切地看到发送给shell的内容以及它是否有语法错误。

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

我认为@Vroomfondel有最好的主意;将shell条消息添加到您的makefile附近,可能会看到$(info ...)次调用,例如:

$(shell ...)

使用二进制搜索,即使在非常长的makefile中也应该能够很快地将其固定下来。