3

如果我创建一个带有先决条件的隐式规则(但没有配方),那么似乎不会尊重依赖关系。另一方面,如果我在定义配方的块中定义了先决条件,或者如果我指定了目标特定实例的依赖关系,它似乎确实有效。我有以下 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中的错误,还是有这种行为的原因?

谢谢,

约翰

4

1 回答 1

3

具有相同目标的模式规则不会像非模式规则那样组合成单个规则。当您有两个针对同一目标的非模式规则时,它们会组合成一个规则,其中包含两个规则的所有依赖项以及具有操作的规则中的操作(两个规则都有操作是错误的) . 对于模式规则,这不会发生——它们被视为两个完全独立的规则,其中任何一个都可用于更新目标。

当您想到内置模式规则时,其原因非常明显——有多个规则%.o可以根据这些规则编译各种语言的源文件。如果它们都组合成一个规则,那根本行不通。

于 2013-02-11T16:37:50.983 回答