【发布时间】:2017-01-17 10:29:34
【问题描述】:
我有一个包含一些模式规则的 make 文件¹,这些规则最终成为另一个规则的先决条件。显示我感到困惑的症状的最小示例是:
.PHONY: clean default one two
default: clean one two
clean:
@rm -f {one,two}.{a,b}
one two: %: %.a %.b
@echo TARGET $@ PREREQUISITES $^
%.a %.b:
@echo Prereq $@
@touch $@
运行时我期望的输出是:
先决条件一.a
先决条件一.b
目标一 先决条件 one.a one.b
先决条件二.a
先决条件二.b
目标两个先决条件二.a 二.b
相反,只构建了第一个先决条件,make 给了我这个:
先决条件一.a
目标一 先决条件 one.a one.b
先决条件二.a
目标两个先决条件二.a 二.b
如您所见,配方本身正确解析了这些,并且知道它应该在两个先决条件之后构建,但先决条件规则实际上并未运行。
顺便说一句,我在这里对第二个项目使用了仅订购的先决条件,但这并不重要:无论哪种方式都会出现相同的问题。
如果我第二次运行相同的目标,那么它会构建第二个先决条件。换句话说,两次通过终于得到了我需要的结果:
$ make clean
$ make one
Prereq one.a
TARGET one PREREQUISITES one.a one.b
$ make one
Prereq one.b
TARGET one PREREQUISITES one.a one.b
第一次运行时,只存在第一个先决条件,我留下了一个损坏的one。在第二遍时one.a 存在,因此它决定构建one.b。现在两个先决条件都存在,我的one 可以正确构建。
如果我将先决条件目标变体拼写为两个单独的配方(分别为 %a: 和 %.b 模式重复相同的块),则为每个目标构建两个先决条件。但是,这会使我的文件更加复杂,我想了解为什么会中断。
¹ 这个 make 文件有一些 other problems,但我已经将此问题隔离到一个可重现的案例中,所以我认为它的其他特质不是这里的问题。
【问题讨论】:
-
@giusti 这是一个仅限订单的先决条件问题。完全相同的结果只会产生正常的依赖关系。
-
对不起。我的错。