Makefile错误 - 如果是的话

时间:2015-08-04 10:55:36

标签: unix makefile

我有两个问题: 1)首先:在make文件中我创建一个文件并设置其权限,但我认为chmod以某种方式失败

 72     chmod -R 777 $(DEL_LIB_PATH)
 73     ifeq ($?,1)
 74         echo "chmod failed"
 75     endif

运行make文件时出现以下错误:

ifeq ($?,1)
ANOMALY: sh: syntax error at line 1 : `(' unexpected
ANOMALY: *** Error exit code 2

2)第二:我的构建需要1个小时,之后只有错误来自make文件中的错误,是否有任何方法/工具来检查make文件是否正常?没有触发构建

1 个答案:

答案 0 :(得分:0)

编写makefile以使其理解的最基本方面是makefile语法和配方语法之间的区别。 Makefile实际上是两种完全不同的语言,组合成一个文件。

makefile的所有“普通”部分都是make手册中描述的makefile语法。但是,配方(目标定义后由TAB字符缩进的行)不是makefile语法,它们是用POSIX sh(shell)脚本编写的:make程序将采用由TAB字符缩进的文本,替换变量/函数引用(以单个$开头的事物),然后将整个事物传递给要处理的shell并等待结果(退出代码)。由make完成的配方的解析用于变量/函数引用。没别了。

因此。在上面的示例中,您尝试在配方中使用 makefile 构造,如ifeq,这需要 shell 构造。你不能这样做,这就是你从shell 得到语法错误的原因(尽管你的shell环境很奇怪......我从未见过像这样的一个打印ANOMALY:前)。

您需要在配方中使用 shell 构造;类似的东西:

        chmod -R 777 $(DEL_LIB_PATH) ; \
        if [ $$? -eq 1 ]; then \
            echo "chmod failed"; \
        fi

或者,更简洁:

        chmod -R 777 $(DEL_LIB_PATH) || echo "chmod failed"

然而,这可能是一个坏主意,因为通过这样做,你隐藏了来自make的错误。即使出现问题,您的食谱的退出代码现在也会成功。也许这就是你想要的,但也许不是。使用食谱时,您必须始终仔细考虑食谱如何失败,并确保如果您希望make注意到它,您将退出非0错误代码。

我真的不知道你为什么要在这里回复一条消息。如果chmod失败,它将打印出自己错误原因的错误:为什么不让这些消息足够,只需使用:

        chmod -R 777 $(DEL_LIB_PATH)

作为你的食谱?