Makefile中的Shell命令导致错误
我正在使用Makefile来加速Python项目的开发。在某种程度上,我使用pep8实用程序对源代码执行样式检查,使用命令Makefile中的Shell命令导致错误,makefile,Makefile,我正在使用Makefile来加速Python项目的开发。在某种程度上,我使用pep8实用程序对源代码执行样式检查,使用命令pep8 我将所有源文件都放在同一个子目录中,名为evientclassifier。我在Makefile中添加了以下规则: style: for py_file in evientclassifier/*.py; do pep8 $py_file done 但是,当我运行make style时,会出现以下错误: Makefile:15: **
pep8
我将所有源文件都放在同一个子目录中,名为evientclassifier
。我在Makefile中添加了以下规则:
style:
for py_file in evientclassifier/*.py; do
pep8 $py_file
done
但是,当我运行make style
时,会出现以下错误:
Makefile:15: *** missing separator. Stop.
我不确定这里发生了什么,因为shell命令在语法上是正确的
有没有正确/更好的方法来做到这一点
$
必须转义style
必须声明为.PHONY
,否则make
将style
视为文件名.PHONY: style
style:
for py_file in *.py; do pep8 $$file; done
行应该只按制表符缩进,而不是空格。这似乎不是问题所在。@ThomasG-8空格也可以(至少在GNU Make中是这样)。在GNU Make中,8空格不能作为菜谱介绍。GNU make会注意到它们,并建议您修复makefile以使用制表符,但它不会假定它们应该是制表符,并且仍然会失败。@Ryan您应该指定您提供的示例中的哪一行是第15行;这就是make在上面的错误消息中所担心的问题。您遇到的一个主要问题是有多行没有反斜杠:make获取每个逻辑行并将其作为一个命令传递给shell。如果您的脚本跨越多个物理行,则必须添加反斜杠才能将其转换为单个逻辑行(并且需要添加分号,以便shell在不使用换行符的情况下理解您的脚本)。谢谢!快速问题:
$
为什么需要转义?$
被shell用作表示变量的关键字。@Ryan-make
也使用$
表示变量引用,所以如果您将其保留为$file
那么make
是什么(因为它用空字符串替换未定义的变量)传递给shell的将是*.py;do pep8 ile;done中py_文件的。PHONY
是一个特殊的目标,而不是一个变量,因此您应该编写。PHONY:style
。您所拥有的将style
分配给变量。PHONY
,该变量没有任何特殊功能。