一、.PHONY 的作用
单词phony (即phoney)的意思是:伪造的,假的。来自collins的解释是:
If you describe something as phoney, you disapprove of it because it is false rather than genuine.
那么,在Makefile中,.PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。
举个例子:
$ cat -n Makefile1
1 clean:
2 rm -f foo
$ cat -n Makefile2
1 .PHONY: clean
2 clean:
3 rm -f foo
- 直接Make看看
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
rm -f foo
$ make -f Makefile2 clean
rm -f foo
Makefile1和Makefile2的行为没有啥子区别嘛,呵呵
- 创建一个文件clean, 再make看看
$ touch clean
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli 0 Jul 13 18:06 clean
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
make: 'clean' is up to date.
$ make -f Makefile2 clean
rm -f foo
区别来了,Makefile1拒绝了执行clean, 因为文件clean存在。而Makefile2却不理会文件clean的存在,总是执行clean后面的规则。由此可见,.PHONY clean发挥了作用。
小结:
.PHONY: clean o means the word "clean" doesn't represent a file name in this Makefile; o means the Makefile has nothing to do with a file called "clean" in the same directory.
二、伪目标的定义
目标并没有依赖文件,只有目标和命令。
这一类目标在makefile中叫做伪目标,普通目标对应着一个需要被生成的文件,而伪目标不对应具体的文件,它仅仅充当一个目标的标识,用作执行特定的功能,而不是执行编译过程。
例如Makefile1,它既没有依赖文件,同时也不会生成目标文件clean。所以clean是一个伪目标。
这种说法算是一个可以接受的答案,但却不是标准答案。
从应用的角度上来说,没有依赖文件且不生成对应的目标文件,这个目标就可以看成是个伪目标,依据这条规则去编写Makefile是没有问题的,但是,Makefile是由make来解析的,是不是伪目标还是得make说了算。
事实上,make遇到这种“我们所认为的伪目标”,它依旧会将其当成一个普通目标去解析。这个目标总是不生成对应目标文件,在检查依赖更新时make将其当成一个没有生成目标文件的普通目标,需要重新编译,在运行命令时会调用隐式规则试图去解析它,尽管最后执行的结果是一样的,但是这样会影响makefile的执行效率,在大型工程的编译时需要注意。
如果需要定义一个伪目标,我们可以直接使用Makefile语法支持的关键字:.PHONY,这个关键词显式地指定一个伪目标。
参考资料:
- Phony Targets of GNU Make
ref:
Makefile文件中的 .PHONY 的作用 - 知乎
https://www.cnblogs.com/idorax/p/9306528.html
深入解析Makefile系列(0) -- 初识Makefile - 知乎文章来源:https://www.toymoban.com/news/detail-595468.html
makefile--隐式规则 - 简书文章来源地址https://www.toymoban.com/news/detail-595468.html
到了这里,关于Makefile文件中的伪目标 .PHONY 的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!