【问题标题】:How can make get confused without .PHONY targets?没有 .PHONY 目标怎么会让人感到困惑?
【发布时间】:2014-11-30 00:32:28
【问题描述】:

我正在阅读make 手册,最后看到了这一段:

以下是我们如何编写清理示例的 make 规则 编辑:

clean:
    rm edit $(objects)

在实践中,我们可能希望将规则写得更 处理意外情况的复杂方式。我们会做 这个:

.PHONY : clean clean :
    -rm edit $(objects)

这可以防止 make 被一个名为 clean 并使其继续运行,尽管 rm 出现错误。 (见假 目标和配方中的错误。)

我知道clean 目标不是指文件系统上的文件,但是如果我在应该声明为.PHONY 的目标上省略.PHONY 声明,make 会如何混淆?

我会看到一个混淆make 命令的示例。

P.S.:rm 命令前面的减号是什么意思?

谢谢。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    让我们测试一下。启动您选择的终端,导航到您选择的目录,然后创建一个新目录(用于保存测试文件)。我选择了so-27204300

    $ mkdir so-27204300
    $ cd so-27204300
    

    现在创建一个不带 .PHONY 注释的简单 Makefile。我只会显示内容:

    clean:
        echo "Clean is executing"
    

    执行make命令,应该会得到如下输出:

    $ make
    echo "Clean is executing"
    Clean is executing
    

    现在,创建一个clean 文件(touch clean)并再次执行make。你会得到

    $ make
    make: `clean' is up to date.
    

    因为有一个文件clean 比目标clean 的输出更新。将.PHONY clean 添加到Makefile 以便它会读取

    .PHONY: clean
    clean:
        echo "Clean is executing"
    

    现在,即使您的目录中有文件cleanmake 也会执行目标

    $ make
    echo "Clean is executing"
    Clean is executing
    

    关于您的 PS:更改此 Makefile 使其显示为:

    .PHONY: clean
    clean:
        rm test
        echo "Done"
    

    如您所见,那里没有-,但当前目录中也没有test 文件。运行make 会给你

    $ make
    rm test
    rm: cannot remove ‘test’: No such file or directory
    make: *** [clean] Error 1
    

    echo 没有输出。如果clean 目标是另一个目标的先决条件,那么由于这个错误,另一个目标也不会被构建。

    添加- 以便Makefile 显示为:

    .PHONY: clean
    clean:
        -rm test
        echo "Done"
    

    解决了这个问题:

    $ make
    rm test
    rm: cannot remove ‘test’: No such file or directory
    make: [clean] Error 1 (ignored)
    echo "Done"
    Done
    

    对于rm,您还可以使用-f 让它停止抱怨错误。但是还有其他命令没有错误参数的消音器。


    如果你想隐藏正在执行的命令的打印,你可以使用@而不是-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2011-03-06
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多