没有.PHONY目标怎么能搞糊涂?

时间:2014-11-29 16:18:08

标签: makefile

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

  

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

clean:
    rm edit $(objects)
     

在实践中,我们可能想要更多地编写规则   处理意外情况的复杂方式。我们会的   这样:

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

这可以防止make被实际调用的文件弄糊涂   干净并使其继续,尽管rm的错误。 (见Phony   食谱中的目标和错误。)

我理解clean目标不引用文件系统上的文件,但是如果我省略了应该声明为.PHONY的目标上的.PHONY声明,make会如何混淆?

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

P.S。:rm命令之前的减号代表什么?

感谢。

1 个答案:

答案 0 :(得分:3)

让我们测试一下。触发您选择的终端,导航到您选择的目录,然后创建一个新目录(以保存测试文件)。我选择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"

现在,即使您的目录中包含clean文件,make也会执行目标

$ 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让它停止抱怨错误。但是还有其他命令没有错误的消音器。


如果要隐藏正在执行的命令的打印,可以使用@代替-