Makefile中的Shell命令导致错误

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: **

我正在使用Makefile来加速Python项目的开发。在某种程度上,我使用pep8实用程序对源代码执行样式检查,使用命令
pep8

我将所有源文件都放在同一个子目录中,名为
evientclassifier
。我在Makefile中添加了以下规则:

style:
    for py_file in evientclassifier/*.py; do
        pep8 $py_file
    done
但是,当我运行
make style
时,会出现以下错误:

Makefile:15: *** missing separator.  Stop.
我不确定这里发生了什么,因为shell命令在语法上是正确的

有没有正确/更好的方法来做到这一点

  • 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
    ,该变量没有任何特殊功能。