Makefile 如何推导make产生的错误的含义?
使用以下简单的makefile规则:Makefile 如何推导make产生的错误的含义?,makefile,makefile-errors,Makefile,Makefile Errors,使用以下简单的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 所以它确实是我想要的,但即使如此,也没有其他信息。但不仅仅是对于这个特定的示例(我仍然不知道),我想知道如何从
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中的bug中获取更多信息(是否有makefile调试器?)。在MakefileManual中,***
用于致命错误,该错误结束编译,但它输出可执行文件(因此编译到该点)。除了致命错误,-
警告提供了更多信息,那么为什么不也做致命错误呢
这不是make的错误,因此没有其他信息 Make运行一个shell,并将您的配方提供给shell来调用。如果shell成功退出(退出代码为0),则make假定它运行的命令有效。如果shell失败退出(0以外的任何退出代码),则make假定它运行的命令失败。Make不知道它失败的原因,Make假设任何失败的命令都会打印出一些关于失败原因的信息。make只知道退出代码,所以make只能告诉您:
make: *** [makefile:6: exe] Error 1
这意味着make在makefile
第6行运行targetexe
的配方,该命令退出时出现错误代码1(不是0,因此失败)
为什么会这样?让我们看看您的shell脚本:
for i in *; do [ -x "$$i" ] && echo "$$i"; done
让我们假设最后一个与*
匹配的文件(因此上次循环时)不可执行。这意味着对最后一个文件[-x“$$i”]
的测试将失败。由于这是shell在退出之前运行的最后一个命令,因此这将是shell的退出代码,您将失败
您需要确保shell成功退出。一种方法是确保shell运行的最后一个命令总是成功的;也许是这样的:
for i in *; do [ -x "$$i" ] && echo "$$i"; done; true
这不是make的错误,因此没有其他信息 Make运行一个shell,并将您的配方提供给shell来调用。如果shell成功退出(退出代码为0),则make假定它运行的命令有效。如果shell失败退出(0以外的任何退出代码),则make假定它运行的命令失败。Make不知道它失败的原因,Make假设任何失败的命令都会打印出一些关于失败原因的信息。make只知道退出代码,所以make只能告诉您:
make: *** [makefile:6: exe] Error 1
这意味着make在makefile
第6行运行targetexe
的配方,该命令退出时出现错误代码1(不是0,因此失败)
为什么会这样?让我们看看您的shell脚本:
for i in *; do [ -x "$$i" ] && echo "$$i"; done
让我们假设最后一个与*
匹配的文件(因此上次循环时)不可执行。这意味着对最后一个文件[-x“$$i”]
的测试将失败。由于这是shell在退出之前运行的最后一个命令,因此这将是shell的退出代码,您将失败
您需要确保shell成功退出。一种方法是确保shell运行的最后一个命令总是成功的;也许是这样的:
for i in *; do [ -x "$$i" ] && echo "$$i"; done; true