Makefile文件中的伪目标 .PHONY 的作用

一、.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,这个关键词显式地指定一个伪目标。

参考资料:

ref:

Makefile文件中的 .PHONY 的作用 - 知乎

https://www.cnblogs.com/idorax/p/9306528.html

深入解析Makefile系列(0) -- 初识Makefile - 知乎

makefile--隐式规则 - 简书

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值