我正在寻找一种方法让我说服gnumake建立所有'所有' 作为一个单元的规则的目标,并要求如果重新建立它们 有任何原因导致任何一个目标缺失或 外的日期。
考虑这个简单的Makefile:
b.foo :
touch b.foo
b.bar1 b.bar2 : b.foo
touch b.bar1
touch b.bar2
b.zoo1 : b.bar1
touch b.zoo1
b.zoo2 : b.bar2
touch b.zoo2
# Building b.zoo1 works as expected
> make4 b.zoo1
touch b.foo
touch b.bar1
touch b.bar2
touch b.zoo1
> make b.zoo1
make: 'b.zoo1' is up to date.
# Building b.zoo2 also works as expected
> make b.zoo2
touch b.zoo2
> make b.zoo2
make: 'b.zoo2' is up to date.
# Now I remove one of the peers built with the 2nd rule
> rm b.bar2
# I see that b.zoo1 stays up-to-date because its dependency still exists.
# However, this is NOT the behavior that I'm looking for. With b.bar2
# now missing, I want b.zoo1 AND b.zoo2 to be out-of-date.
> make b.zoo1
make: 'b.zoo1' is up to date.
# But it's not. Worse yet, building b.zoo2 does force b.bar1 and b.bar2 to be rebuilt
> make b.zoo2
touch b.bar1
touch b.bar2
touch b.zoo2
# which now makes b.zoo1 out-of-date
> make b.zoo1
touch b.zoo1
那么,有没有办法编写一个规则来构建多个目标以按照我的意愿行事?或者有没有办法使用gnumake标准库 完成这个?
答案 0 :(得分:1)
b.bar1 b.bar2 : b.foo
此规则告诉make有两个目标b.bar1
和b.bar2
这两个目标都依赖于b.foo
,并且这两个目标都可以由列出的目标构建规则。 不告诉make它们是由相同的规则调用构建的相关目标。使用GNU make,您可以使用%.bar1 %.bar2: %.foo
等模式规则来了解后一种信息。
我不知道我已经完全理解了这个问题,但我认为这些信息(以及模式规则)可能会在这里使用。
答案 1 :(得分:0)
是的,在规则中编写许多目标只是单独编写它们的简写。
b.bar1 b.bar2 : b.foo
touch b.bar1
touch b.bar2
与
完全相同b.bar1: b.foo
touch b.bar1
touch b.bar2
b.bar2: b.foo
touch b.bar1
touch b.bar2
显然是错的。你可以写
b.foo:
touch b.foo
b.bar1: b.foo
touch b.bar1
b.bar2: b.foo
touch b.bar2
b.zoo1: b.bar1 b.bar2
touch b.zoo1
b.zoo2: b.bar1 b.bar2
touch b.zoo2
通过在食谱中使用$@
作为目标名称
b.foo:
touch $@
b.bar1: b.foo
touch $@
b.bar2: b.foo
touch $@
b.zoo1: b.bar1 b.bar2
touch $@
b.zoo2: b.bar1 b.bar2
touch $@
现在,您可以看到规则中的多个目标的实用程序与单独编写规则相同。我们可以把它写成
b.foo:
touch $@
b.bar1 b.bar2: b.foo
touch $@
b.zoo1 b.zoo2: b.bar1 b.bar2
touch $@
尼斯。这可以解决您原来的问题。
(我怀疑这可能无法解决您的实际问题。b.bar1
和b.bar2
只是通过某个实用程序的单运行创建的吗?)