Makefiles:什么是仅限订单的先决条件?

shu*_*alo 17 makefile

GNU make 手册介绍了仅订购先决条件

target: prerequisite1 prerequisite2 | orderonlyprerequisite1 orderonlyprerequisite2
Run Code Online (Sandbox Code Playgroud)

然而,虽然该手册页给出了一个示例并描述了仅订购先决条件的目的,但该手册页从未回答标题中的问题:什么是仅订购先决条件?

你能给出一个精确的定义,只有订单的先决条件是如何表现的吗?

Joh*_*kel 49

假设你有一个像这样的 Makefile

baby: love
    touch $@

love: 
    touch $@
Run Code Online (Sandbox Code Playgroud)

然后make说,

touch love
touch baby
Run Code Online (Sandbox Code Playgroud)

现在你rm love又说make

touch love
touch baby
Run Code Online (Sandbox Code Playgroud)

因为为了生孩子,你必须做爱,每次做爱时,你都必须生孩子。然而,假设您不想每次做爱时都生孩子。在这种情况下,您可以使用管道。

baby: | love
    touch $@
Run Code Online (Sandbox Code Playgroud)

现在你只rm lovemake

touch love
Run Code Online (Sandbox Code Playgroud)

因为虽然为了生孩子你必须做爱,但并不是每次做爱都必须生孩子。

  • 我无法抗拒对所用示例中这个精彩比喻的评论!哈哈 (20认同)
  • 我想我现在理解了用例,它是必须存在的先决条件,但其内容不会影响所产生的目标的结果。举个例子:生孩子需要爱,但是改变爱不会影响生孩子。所以我们不需要费心去繁衍孩子,只需要产生爱。 (3认同)

Mat*_*att 24

首先,让我们回忆一下普通的先决条件是什么。

基本上,Makefile 中的先决条件有两个功能:

  1. 检查它们,并在必要时在目标之前构建它们
  2. 如果任何先决条件被重建(或者只是比目标新),那么目标也将被重建。

现在,仅订单先决条件执行 1.,即强加构建订单,但不执行 2。