我有两个问题: 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文件是否正常?没有触发构建
答案 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)
作为你的食谱?