GNU Make - 模式匹配的依赖关系

时间:2015-11-25 10:40:08

标签: makefile pattern-matching gnu-make

让文件"前缀-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

从我的角度来看,这种行为似乎很古怪。

  • 对于事物的存在方式,是否有合理的解释?
  • 如何强迫GNU Make应用特定规则'对于以"前缀 - "开头的文件没有使用明确的规则?

1 个答案:

答案 0 :(得分:2)

GNU make manual

对此进行了详细说明

具体做法是:

  

但请注意,实际存在或提及其先决条件的规则始终优先于具有必须通过链接其他隐式规则的先决条件的规则。

这是一般规则的明确例外,即最匹配(最短词干)规则将始终匹配。您的上一个示例按您喜欢的方式工作的原因是因为它根本不是基于模式匹配的规则,所以在解决模式匹配之前检查它。