首页 文章

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

提问于
浏览
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)

似乎即使我依赖 dep1 1112842,也可以构建 foo.a 而不构建 dep1 . 这是make中的错误,还是有这种行为的原因?

谢谢,

约翰

1 回答

  • 3

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

    当您考虑内置模式规则时,其原因非常明显 - %.o 有多个规则可以编译各种语言的源文件 . 如果它们都合并为一条规则,那就根本行不通 .

相关问题