Makefile:隐式规则先决条件不起作用?

时间:2013-02-11 16:25:45

标签: makefile gnu-make

如果我使用先决条件(但没有配方)创建隐式规则,那么依赖性似乎不会受到尊重。另一方面,如果我在定义配方的块中定义先决条件,或者如果我指定了特定目标实例的依赖关系,它似乎确实有效。我有以下Makefile(GNU make 3.81)

all:  foo.a foo.b bar.b bar.c

dep1:
    @echo "running $@"

%.a: dep1

%.a:
    @echo "running $@ (depends on: $^)"

bar.b: dep1

%.b: dep1
    @echo "running $@ (depends on: $^)"

bar.c: dep1

bar.c:
    @echo "running $@ (depends on: $^)"

如果我运行make,我会得到:

~/tmp/tmp5> make
running foo.a (depends on: )
running dep1
running foo.b (depends on: dep1)
running bar.b (depends on: dep1)
running bar.c (depends on: dep1)

即使我%.a取决于dep1,似乎可以构建foo.a而不构建dep1。这是make中的错误,还是有这种行为的原因?

谢谢,

约翰

1 个答案:

答案 0 :(得分:3)

具有相同目标的模式规则不会像非模式规则那样合并到单个规则中。如果同一目标有两个非模式规则,它们将合并为一个规则,其中包含两个规则的所有依赖关系以及来自具有操作的规则的操作(两个规则都有错误,这是一个错误) 。使用模式规则,这种情况不会发生 - 它们被视为两个完全独立的规则,其中任何一个都可用于更新目标。

当你想到内置模式规则时,原因很明显 - %.o有多个规则可以用各种语言编译源文件。如果它们都合并为一条规则,那就根本行不通。