0

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

4

2 回答 2

1

b.bar1 b.bar2 : b.foo这条规则告诉 make 有两个目标b.bar1b.bar2它们都有依赖关系,b.foo并且都可以通过列出的规则构建。它不会告诉make 它们是由相同的规则调用构建的相关目标。使用 GNU make,您可以使用诸如%.bar1 %.bar2: %.foo.

我不知道我是否完全理解您所解释的问题,但我认为这些信息(和模式规则)可能在这里有用。

于 2014-06-27T22:50:01.873 回答
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某个实用程序的一次运行创建的吗?)

于 2014-06-30T15:48:12.307 回答