Makefiles:什么是仅订购先决条件?

时间:2019-09-21 11:26:25

标签: makefile

GNU make手册介绍了仅订购的先决条件: https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html

target: prerequisite1 prerequisite2 | orderonlyprerequisite1 orderonlyprerequisite2

但是,尽管该手册页给出了一个示例并描述了仅订购先决条件的目的,但是手册页在任何时候都没有回答标题中的问题:什么是仅订购先决条件?

您能给出一个精确的定义吗?

3 个答案:

答案 0 :(得分:1)

首先,让我们回顾一下普通的先决条件。

基本上,Makefile中的前提条件具有两个功能:(a)对它们进行检查,并在必要时在目标之前 构建它们; (b)如果重新构建了任何先决条件(或者只是比目标更新),那么目标也将被重建。

现在,仅订购的先决条件可以(a),即强加构建顺序,而不是(b)。

答案 1 :(得分:0)

我认为文档确实描述了它们的行为。它描述了正常先决条件的行为:

  

正常先决条件有两个语句:首先,它强加了调用配方的顺序:在运行目标的配方之前,将完成目标的所有先决条件的配方。其次,它强加了一个依赖关系:如果任何先决条件比目标新,那么目标就被认为是过时的,必须重新构建。

然后,它描述了仅订购先决条件的行为与此有所不同;它会:

  

对要调用的规则施加特定的顺序,,如果执行了其中一个规则,则强制更新目标。

答案 2 :(得分:0)

假设你有一个这样的 Makefile

baby: love
    touch $@

love: 
    touch $@

然后 make 说,

touch love
touch baby

现在你rm love和再次make

touch love
touch baby

因为要生孩子就必须做爱,每次做爱都必须生孩子。但是,假设您不想每次做爱都生孩子。在这种情况下,您可以使用管道。

baby: | love
    touch $@

现在你rm lovemake只说

touch love

因为虽然要生孩子就必须做爱,但不是每次做爱都必须生孩子。