如果我使用先决条件(但没有配方)创建隐式规则,那么依赖性似乎不会受到尊重。另一方面,如果我在定义配方的块中定义先决条件,或者如果我指定了特定目标实例的依赖关系,它似乎确实有效。我有以下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中的错误,还是有这种行为的原因?
谢谢,
约翰
答案 0 :(得分:3)
具有相同目标的模式规则不会像非模式规则那样合并到单个规则中。如果同一目标有两个非模式规则,它们将合并为一个规则,其中包含两个规则的所有依赖关系以及来自具有操作的规则的操作(两个规则都有错误,这是一个错误) 。使用模式规则,这种情况不会发生 - 它们被视为两个完全独立的规则,其中任何一个都可用于更新目标。
当你想到内置模式规则时,原因很明显 - %.o
有多个规则可以用各种语言编译源文件。如果它们都合并为一条规则,那就根本行不通。