Makefile 如何推导make产生的错误的含义?

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 所以它确实是我想要的,但即使如此,也没有其他信息。但不仅仅是对于这个特定的示例(我仍然不知道),我想知道如何从

使用以下简单的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中的bug中获取更多信息(是否有makefile调试器?)。在MakefileManual中,
***
用于致命错误,该错误结束编译,但它输出可执行文件(因此编译到该点)。除了致命错误,
-
警告提供了更多信息,那么为什么不也做致命错误呢

  • 对这个例子的解释
  • 关于如何调试makefile脚本的一些建议

  • 这不是make的错误,因此没有其他信息

    Make运行一个shell,并将您的配方提供给shell来调用。如果shell成功退出(退出代码为0),则make假定它运行的命令有效。如果shell失败退出(0以外的任何退出代码),则make假定它运行的命令失败。Make不知道它失败的原因,Make假设任何失败的命令都会打印出一些关于失败原因的信息。make只知道退出代码,所以make只能告诉您:

    make: *** [makefile:6: exe] Error 1
    
    这意味着make在
    makefile
    第6行运行target
    exe
    的配方,该命令退出时出现错误代码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行运行target
    exe
    的配方,该命令退出时出现错误代码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