如何得出make产生的错误的含义?

问题描述 投票:0回答:1

具有此简单的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手册中,***是致命错误,它会终止编译,但会输出可执行文件(因此已编译到该位置)。除了致命错误之外,-警告还提供更多信息,那么为什么不也执行致命错误呢?

  1. 此示例的说明
  2. 一些有关调试makefile脚本的建议
makefile makefile-errors
1个回答
2
投票

这不是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
© www.soinside.com 2019 - 2024. All rights reserved.