Makefile GNU Make——模式匹配依赖项
让文件“prefix hi.c”出现在当前目录中(“>touch prefix hi.c”)。然后,创建以下生成文件:Makefile GNU Make——模式匹配依赖项,makefile,pattern-matching,gnu-make,Makefile,Pattern Matching,Gnu Make,让文件“prefix hi.c”出现在当前目录中(“>touch prefix hi.c”)。然后,创建以下生成文件: 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-g
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
> rm -f prefix-hi-generated.c
> make prefix-hi.o
touch prefix-hi-generated.c
Specific 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
General Rule
> rm -f prefix-hi-generated.c
> make prefix-hi.o
touch prefix-hi-generated.c
Specific Rule
从我的角度来看,这种行为似乎很古怪
- 对事物的现状有一个合理的解释吗李>
- 如果不使用显式规则,如何强制GNU对以“prefix-”开头的文件应用“特定规则”李>
- 这一点在
具体而言:
但是请注意,前提条件实际存在或被提及的规则始终优先于具有前提条件的规则,前提条件必须通过链接其他隐式规则来实现
这是一般规则的一个明显例外,即最窄匹配(最短词干)规则将始终导致匹配。上一个示例按您喜欢的方式工作的原因是,它根本不是基于模式匹配的规则,因此在解决模式匹配之前会进行检查 这就是导致混乱的规则。这恰恰与直觉的优先顺序相反。这些优先规则需要更高层次的抽象思维,并考虑分散在某些不特定位置的碎片。这在更大的构建系统中是很难管理的。@Frank ReneSchäfer事实上,这是相当违反直觉的。我个人建议您彻底阅读gnu make手册,或者更好,如果您的项目是大型的,使用更强大的make系统,如cmake或qmake,或者任何您与best合作的系统。