GNU Make:%不匹配虚线文件名?

时间:2018-03-05 03:14:27

标签: makefile gnu-make

documentation声称模式规则中的%将匹配任何内容。看起来并非如此:

$ ls
config.sh.in  foo.in  Makefile
$ cat Makefile
%: %.in
        cp $< $@
$ make foo
cp foo.in foo
$ make config.sh
make: *** No rule to make target 'config.sh'.  Stop.
$

是什么给出了?

1 个答案:

答案 0 :(得分:4)

问题

它实际上会匹配任何东西。问题是GNU Make默认生成以下内容:

%.sh:

哪个是built-in dummy pattern rule(注意没有配方)。这会阻止make匹配非特定目标模式,即:%.sh以外的目标模式(与您的一样)。

解决方案

由于为内置.SUFFIXES目标中的每个后缀生成了虚拟模式规则,因此您可以在makefile中显式写入空.SUFFIXES目标(如下所示),或者只是运行make使用命令行选项-r--no-builtin-rules来禁用此类虚拟内置模式规则的生成。

.SUFFIXES:
%: %.in
        cp $< $@

这样,以下内容:

$ make config.sh
cp config.sh.in config.sh

按预期工作。