让文件“prefix-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 does not recognize the opportunity to build "prefix-hi-generated.c" from the last rule . 添加显式规则
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
从我的角度来看,这种行为似乎很古怪 .
-
对于事物的存在方式是否有合理的解释?
-
如何强制GNU Make在不使用显式规则的情况下将'Specific Rule'应用于以"prefix-"开头的文件?
1 回答
这在GNU make manual中有详细解释
特别:
但请注意,实际存在或提及其先决条件的规则始终优先于具有必须通过链接其他隐式规则的先决条件的规则 .
这是一般规则的明确例外,即最匹配(最短词干)规则将始终与之匹配 . 您的上一个示例按您喜欢的方式工作的原因是因为它根本不是基于模式匹配的规则,因此在解析模式匹配之前进行检查 .