双冒号规则
双冒号规则就是使用::代替普通规则:得到的规则。当同一个文件作为多个规则的目标时,双冒号规则的处理和普通规则的处理过程完全不同(双冒号规则允许在多个规则中为同一个目标指定不同的重建目标的命令)
在Make中,一个目标可以出现在多个规则中,但这些规则必须是同一种规则,要么都是普通规则,要么都是双冒号规则,不允许同一个目标同时出现在两种不同的规则中。
冒号规则和普通规则的处理的不同:
- 双冒号规则中当依赖文件比目标更新时,规则将会被执行。对于没有依赖只有命令行的双冒号规则,当引用此目标时,规则的目标将会被无条件执行。普通规则中,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)
- 当同一个文件作为多个双冒号规则的目标时,这些不同的规则会被独立地处理,而不是像普通规则那样那样合并所有依赖到一个目标文件。对这些规则的处理就像多个不同的普通规则,多个双冒号规则中的每一个依赖被改编后,make只执行此规则定义的命令,而其他的以这个文件作为目标的双冒号规则不会被执行。
例:
Newprog::foo.c
$(CC) $(CFLAGS)$< -o $@
Newprog::bar.c
$(CC) $(CFLAGS)$< -o $@
如果foo.c文件被修改,执行make以后目标Newprog将根据foo.c文件被重建;如果bar.c被修改,那么目标Newprog将根据bar.c被重建。如果以上为普通规则,make会报错。
当同一个目标出现在多个双冒号规则中,规则的执行顺序和普通规则的执行顺序一样。
GUN make