Makefile中的双冒号规则有什么作用? [英] What are double-colon rules in a Makefile for?

查看:22
本文介绍了Makefile中的双冒号规则有什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

4.13 of the GNU Make manual一节介绍了所谓的双冒号规则:

双冒号规则是在目标名称后使用‘::’而不是‘:’编写的规则。当同一目标出现在多个规则中时,它们的处理方式与普通规则不同。

当一个目标出现在多个规则中时,所有规则必须是同一类型:全部为普通规则,或全部为双冒号。如果它们是双冒号,则它们中的每一个都是独立的。如果目标早于双冒号规则的任何先决条件,则执行该规则的命令。如果该规则没有先决条件,则始终执行其命令(即使目标已经存在)。这可能导致不执行、任意或全部执行双冒号规则。

具有相同目标的双冒号规则实际上彼此完全分开。每个双冒号规则都是单独处理的,就像处理具有不同目标的规则一样。

目标的双冒号规则按照其在生成文件中出现的顺序执行。但是,在双冒号规则真正有意义的情况下,执行命令的顺序并不重要。

双冒号规则有些晦涩难懂,而且通常不是很有用;它们提供了一种机制,用于处理用于更新目标的方法因导致更新的先决条件文件而有所不同的情况,这种情况很少见。

每个双冒号规则都应指定命令;如果没有指定命令,则将使用隐式规则(如果适用)。请参阅使用隐式规则一节。

我分别理解了这一节每句话的意思,但我仍然不清楚适用于的双冒号规则是什么。至于很少见,我还没有见过Makefile以而不是开头的开源项目

all::

因此:Makefile中双冒号规则的预期用途是什么?

推荐答案

Each::Rule独立处理,可以更简单。例如,单个规则:

libxxx.a : sub1.o sub2.o
    ar rv libxxx.a sub1.o
    ar rv libxxx.a sub2.o

可以替换为两个更简单的规则:

libxxx.a :: sub1.o
    ar rv libxxx.a sub1.o

libxxx.a :: sub2.o
    ar rv libxxx.a sub2.o

像AutoMake这样的实用程序比几个复杂的规则更容易写出许多简单的规则。

发布了一个包含更多示例的好答案,然后将其删除,然后在此处找到:

https://web.archive.org/web/20180122002430/http://owen.sj.ca.us/~rk/howto/slides/make/slides/makecolon.html

感谢R.K.欧文写下它,感谢Edward Minnix再次找到它!

这篇关于Makefile中的双冒号规则有什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆