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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
$

是什么赋予了?

答案

Problem

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

%.sh:

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


Solution

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

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

这样,以下内容:

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

按预期工作。

以上是关于GNU Make:%与虚线文件名不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

GNU make简要介绍①

gcc make和gnu make的区别,一般是用哪个?

Linux(程序设计):02---make与Makefile的设计与应用

GNU make 中的递归通配符?

GNU Make 无法检测到明显的规则

GNU make:删除生成的文件时如何重建哨兵目标?