让文件"前缀-hi.c"存在于当前目录中("> touch prefix-hi.c")。然后,创建以下Makefile:
prefix-%.o: prefix-%.c prefix-%-generated.c
@echo Specific Rule
%.o: %.c
@echo General Rule
prefix-%-generated.c:
touch prefix-$*-generated.c
分两步制作序列
> make prefix-hi-generated.c
touch prefix-hi-generated.c
> make prefix-hi.o
Specific Rule
删除生成的文件并尝试一步构建会导致
> rm -f prefix-hi-generated.c
> make prefix-hi.o
General Rule
也就是说, GNU Make无法识别构建" prefix-hi-generated.c"从最后一条规则。添加显式规则
prefix-hi-generated.c:
touch prefix-hi-generated.c
改变一切。现在,一步序列导致
> rm -f prefix-hi-generated.c
> make prefix-hi.o
touch prefix-hi-generated.c
Specific Rule
从我的角度来看,这种行为似乎很古怪。
答案 0 :(得分:2)
具体做法是:
但请注意,实际存在或提及其先决条件的规则始终优先于具有必须通过链接其他隐式规则的先决条件的规则。
这是一般规则的明确例外,即最匹配(最短词干)规则将始终匹配。您的上一个示例按您喜欢的方式工作的原因是因为它根本不是基于模式匹配的规则,所以在解决模式匹配之前检查它。