我正在阅读make
手册,最后我看到了这一段:
以下是我们如何编写make规则来清理我们的示例 编辑:
clean: rm edit $(objects)
在实践中,我们可能想要更多地编写规则 处理意外情况的复杂方式。我们会的 这样:
.PHONY : clean clean : -rm edit $(objects)
这可以防止make被实际调用的文件弄糊涂 干净并使其继续,尽管rm的错误。 (见Phony 食谱中的目标和错误。)
我理解clean
目标不引用文件系统上的文件,但是如果我省略了应该声明为.PHONY
的目标上的.PHONY
声明,make会如何混淆?
我会看到一个混淆make
命令的例子。
P.S。:rm
命令之前的减号代表什么?
感谢。
答案 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
让它停止抱怨错误。但是还有其他命令没有错误的消音器。
如果要隐藏正在执行的命令的打印,可以使用@
代替-
。