具有此简单的makefile规则:
exe:
for i in *; do [ -x "$$i" ] && echo "$$i"; done
将输出:
for i in *; do [ -x "$i" ] && echo "$i"; done
executablefile
make: *** [makefile:6: exe] Error 1
确实如此,我想要什么,但是即使如此,也没有其他消息出错。但是不仅对于这个特定的示例(我仍然没有得到),我想知道如何从makefile中的错误中获取更多信息(是否有makefile调试器?)。在makefile手册中,***
是致命错误,它会终止编译,但会输出可执行文件(因此已编译到该位置)。除了致命错误之外,-
警告还提供更多信息,那么为什么不也执行致命错误呢?
这不是make的错误,这就是为什么没有其他信息的原因。
Make运行一个shell,并给您的shell调用配方。如果shell成功退出(退出代码0),则make假定它运行的命令有效。如果外壳程序退出失败(除0以外的任何退出代码),那么make假定它运行的命令失败。 Make不知道why失败,因此make假设任何失败的命令都会打印出有关原因的信息。所有知道的都是退出代码,所以所有这些都可以告诉您:
make: *** [makefile:6: exe] Error 1
[这意味着make在exe
行号6上运行目标makefile
的配方,并且该命令以错误代码1(不是0,因此失败)退出。
为什么会这样?让我们看一下您的shell脚本:
for i in *; do [ -x "$$i" ] && echo "$$i"; done
让我们假设最后一个匹配*
的文件(所以最后一次通过循环)该文件不可执行。这意味着最后一个文件[ -x "$$i" ]
的测试将失败。由于这是外壳程序退出前运行的最后一条命令,因此它将是外壳程序的退出代码,并且您将失败。
您需要确保shell成功退出。一种方法是确保外壳程序运行的最后一条命令总是成功;也许像这样:
for i in *; do [ -x "$$i" ] && echo "$$i"; done; true