【问题标题】:What is the behaviour of an order-only prerequisite where the prerequisite is a phony target?在先决条件是虚假目标的情况下,仅订单先决条件的行为是什么?
【发布时间】:2013-10-14 13:53:03
【问题描述】:

我想知道如果仅订单先决条件是虚假目标,它是否会失去其仅订单优先级。考虑以下几点:

%.make: unpack_chroot
    schroot $(CHROOT) make $*

%.copy: | unpack_chroot
    rsync -a input/$*/ $(CHROOT)/input/$*/

unpack_chroot: input/chroot.tar.gz
    mkdir -p $(CHROOT)
    tar -C $(CHROOT) -zxf $<

.PHONY: unpack_chroot

所有 %.make 和 %.copy 目标都是.PHONY。其中一些目标依赖于复制到 chroot 中的文件,而另一些则不依赖。那些确实是用明确的依赖关系定义的:

a.make: a.copy
c.make: c.copy

但是,如果unpack_chroot 不是仅订单的先决条件,并且在同一制作过程中作为另一个制作目标不是的先决条件处理的一部分被解包,则将考虑unpack_chroot %.copy 运行时是最新的,不会重新制作 %.copy;至少这是我所看到的。目前,unpack_chroot 不是假的,而是被创建的。我想让它变得虚假,但想澄清这种行为。

【问题讨论】:

  • 您写道:如果unpack_chroot 不是仅用于订购的先决条件,并且作为另一个make 目标的先决条件处理的一部分被解包,[... make] 将不会重新制作@987654328 @。这当然不是真的。如果重建了正常的先决条件,则将重建依赖于它的所有目标。然而,像这样依赖虚拟目标通常不是一个好主意,因为每次新的 make 调用都会重新运行目标。还声明该规则 .PHONY 将强制所有通常依赖它的目标始终重建。
  • 对不起,我的错。已更新问题。如果先决条件是由另一个 make 进程构建的。但是,话虽如此,我创建了一个小型独立测试来检查 make 的调试输出。在这种情况下,make 正在做正确的事情,并且不需要仅订单的先决条件。我不知道为什么在实际的makefile中需要它,因为依赖处理应该是相同的。我将需要为实时构建生成调试,并查看它实际在做什么需要仅订单的先决条件。
  • 我要解决这个问题,因为我认为这与我认为正在发生的事情无关。
  • 我认为这很有意义。 Make 的创建者甚至可能没有预料到只有订单的虚假先决条件。这对我来说是一个有趣的案例,因为我正在开发自己的 Make-like(gitlab 上的 Silvercat)工具,并且可以将这个案例用于一些有用的事情。当有文件时,通常这是“新鲜的”。因此,如果它是一个虚假的目标,它可能只有在通过更新其他先决条件,目标已经被认为是陈旧的时才被更新。我当然是在虚构,但这样的功能会很有用。

标签: makefile


【解决方案1】:

根据这封电子邮件 (http://kolpackov.net/pipermail/notes/2004-January/000001.html) 看来,正常和仅订单先决条件之间的唯一区别是后者不会包含在自动 make 变量中,例如 $^。

从我运行的一些测试看来,这是唯一的区别。在所有其他方面,它们都被视为正常的先决条件。

【讨论】:

  • 不,如果目标早于仅订购先决条件,则仅订购先决条件不会导致重新构建目标。
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2021-07-10
  • 2017-10-01
  • 2016-02-21
相关资源
最近更新 更多