曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6439|回复: 0
打印 上一主题 下一主题

双冒号 :: 规则

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-5-16 14:01:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
双冒号规则就是使用 "::" 代替普通规则中的 ":" 所得到的规则。当同一个文件作为多个规则的目标时,双冒号规则的处理和普通规则的处理过程完全不同(双冒号规则允许在多个规则中为同一个目标指定不同的重建目标的命令)。

首先需要明确的是,在 Makefile 中,一个目标可以出现在多个规则中。但是这些规则必须是同一种规则,要么都是普通规则,要么都是双冒号规则;而不允许一个目标同时出现在两种不同的规则中

双冒号规则和普通规则的处理的不同点表现在以下几个方面:

1. 在双冒号规则中,当依赖文件比目标文件更新时,规则将会被执行。对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令行将会被无条件执行。而对于普通规则,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)。

2. 当同一个文件作为多个双冒号规则的目标时,这些不同的规则会被独立的处理,而不是像普通规则那样合并所有的依赖到一个目标文件。这就意味着对这些规则的处理就像多个不同的普通规则一样。也就是说,多个双冒号规则中的每一个的依赖文件被改变后,make 只执行此规则定义的命令,而其它的以这个文件作为目标的双冒号规则将不会被执行。

有一 Makefile 文件如下:
Newprog :: hello.c
    $(CC) $< -o $@

Newprog :: world.c
    $(CC) $< -o $@
其中 hello.c 和 world.c 的内容只是简单的打印出 hello 和 world 字符串。
如果只是简单的执行 make 命令,那么 Makefile 会顺序执行,最后生成的可执行文件 Newprog 会输出 world 字符串。现在将 hello.c 编辑为输出 hello world,接着再 make 一次:
[beyes@SLinux temp5]$ make
cc hello.c -o Newprog
[beyes@SLinux temp5]$ ./Newprog
hello world
由输出看到,make 只根据 hello.c 重建了目标 Newprog 。同样,如果只是修改 world.c ,那么Newprog 将根据 world.c 被重建。

如果将上面 Makefile 中的双冒号改写成单冒号,即上面的规则作为普通规则时会看到:
[beyes@SLinux temp5]$ make
Makefile:7: warning: overriding commands for target `Newprog'
Makefile:4: warning: ignoring old commands for target `Newprog'
cc world.c -o Newprog
在编译时发出了警告信息,而且只执行了第 2 条规则 。
再执行一次:
[beyes@SLinux temp5]$ make
Makefile:7: warning: overriding commands for target `Newprog'
Makefile:4: warning: ignoring old commands for target `Newprog'
make: `Newprog' is up to date.
这里 的 make 版本是 3.8.1,也许在老点的 make 上看到出错信息的提示。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 18:05 , Processed in 0.076219 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表