Gnu制定具有多个目标的规则

时间:2014-06-27 20:56:55

标签: makefile gnu-make targets

我正在寻找一种方法让我说服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标准库 完成这个?

2 个答案:

答案 0 :(得分:1)

b.bar1 b.bar2 : b.foo此规则告诉make有两个目标b.bar1b.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.bar1b.bar2只是通过某个实用程序的运行创建的吗?)