免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3644 | 回复: 8
打印 上一主题 下一主题

[C] 请教makefile中伪目标的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-09 11:55 |只看该作者 |倒序浏览
看了gnu make项目管理一书中关于伪目标的部分;
其中写道如果伪目标作为真实文件的依赖,那么会导致规则的命令每次都被执行,即使target已经up to date
差不多是这样的例子
realfile:ptarget
        realcommand
。Phony:ptarger

ptarget:
     @echo "xxxx"

realfile指的是真实文件,ptarget指的是伪目标。
make在检查这条rule的时候,会执行伪目标下的 @echo "xxxx" 命令。
但为何还会执行realfile规则中的realcommand 命令呢?

假若realfile已经是up to date 了,那么不是比永远处于out of date 状态的伪目标要新?
这样还要执行realcommand?

论坛徽章:
0
2 [报告]
发表于 2009-12-09 12:03 |只看该作者

回复 #1 gtv 的帖子

“假若realfile已经是up to date 了”这句话不成立。因为在执行伪目标所定义规则后,ptarget的timestamp就被刷新了,比realfile更新。所以realcommand会被执行。

论坛徽章:
0
3 [报告]
发表于 2009-12-09 14:35 |只看该作者
原帖由 fromheaven 于 2009-12-9 12:03 发表
“假若realfile已经是up to date 了”这句话不成立。因为在执行伪目标所定义规则后,ptarget的timestamp就被刷新了,比realfile更新。所以realcommand会被执行。

是吗?ptarget 不是被make认为一直是out of date的?或者说它的timestamp无法被更新?
或者你的意思是说伪目标固然有自己的timestamp 但make执行伪目标规则时候 会忽视这个timestamp?继续执行其命令?

[ 本帖最后由 gtv 于 2009-12-9 14:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-12-09 14:52 |只看该作者
一直 out of date 不是说timestamp无法被更新,而是说每次访问都自动被更新(因为out of date,所以“又”被更新)

论坛徽章:
0
5 [报告]
发表于 2009-12-09 15:04 |只看该作者
原帖由 drangon 于 2009-12-9 14:52 发表
一直 out of date 不是说timestamp无法被更新,而是说每次访问都自动被更新(因为out of date,所以“又”被更新)

就是说make认为伪目标永远处于out of date的状态,即使它的timestamp已经是新的了

论坛徽章:
0
6 [报告]
发表于 2009-12-10 09:15 |只看该作者

回复 #5 gtv 的帖子

当然不是。
跑一下下面的makefile,你将发现ptarget里的命令只执行___一次___。
但是,你再跑的话,它又会执行__一次__。

也就是说,你每运行make一次,ptarget就会执行一次。

> 其中写道如果伪目标作为真实文件的依赖,那么会导致规则的命令每次都被执行,即使target已经up to date
这句话的原话请贴出来。

all: realfile1 realfile2

realfile1 : ptarget
    @echo "realfile1"

realfile2 : ptarget
    @echo "realfile2"

.Phony:ptarget

ptarget:
    @echo "xxxx"

论坛徽章:
0
7 [报告]
发表于 2009-12-10 10:05 |只看该作者
原帖由 朱果果 于 2009-12-10 09:15 发表
当然不是。
跑一下下面的makefile,你将发现ptarget里的命令只执行___一次___。
但是,你再跑的话,它又会执行__一次__。

也就是说,你每运行make一次,ptarget就会执行一次。

> 其中写道如果伪目标作为 ...

看下图片蓝色水笔标注的那句话怎么理解是正确的

DSC04267.JPG (2.07 MB, 下载次数: 11)

蓝色水笔标注的那句话

蓝色水笔标注的那句话

论坛徽章:
0
8 [报告]
发表于 2009-12-17 15:00 |只看该作者

回复 #7 gtv 的帖子

引用帖子论坛不给短信提示之类的么,不知道回复有没有。

蓝色背景的那__句__话的大概意思是,因为反正每次都要remade,所以说把phony target作为real file的prerequisite没啥意义。
phony target永远是out of date,说的是make看到它的时候认为它是out of date,所以每次(如果有的话)它都要执行,
而它一执行,它就成了__最新__的了(比up to date 还up to date),这样,real file比它旧,导致real file那些命令也要执行。
最后结果就是,不管世界如何变化, realfile : phony target 每次都要执行。

表面上,书里说phony target是始终out of date,但是。。。实际上,它每次make的时候,因为它out of date,它就要执行,它一跑,那就是最up to date的了。。。

out of date 是相对的,不是绝对的。比如

  1. realfile1 : realfile2
  2. ...
  3. realfile2 : realfile3
  4. ...
复制代码

假设你经过了无数次修改realfile1以及realfile3,就是没有修改realfile2,这时候realfile2是out of date的吧?
那么,你make的时候, realfile1:realfile2 下面的命令不会执行么?

书里没有说“即使target已经up to date”。
你这里的target指的是real file还是phony target?

如果target说的是real file的话,在phony target面前也敢说自己up to date?

如果target说的是phony target的话。。。那啥都不说了。。。

[ 本帖最后由 朱果果 于 2009-12-17 15:10 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-12-17 16:22 |只看该作者
原帖由 朱果果 于 2009-12-17 15:00 发表
引用帖子论坛不给短信提示之类的么,不知道回复有没有。

蓝色背景的那__句__话的大概意思是,因为反正每次都要remade,所以说把phony target作为real file的prerequisite没啥意义。
phony target永远是out ...

书里没有说“即使target已经up to date”。
====
那句话在反面,不过你的解释很清楚 ,我已经理解了 thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP