makefile - GNU 制造商 : % doesn't match dotted filenames?

标签 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.
$

什么给出了?

最佳答案

问题

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

%.sh:

这是built-in dummy pattern rule (请注意,没有食谱)。这可以防止 make 匹配非特定目标模式,即:除 %.sh 之外的目标模式(如您的)。


解决方案

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

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

这样,如下:

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

按您的预期工作。

关于makefile - GNU 制造商 : % doesn't match dotted filenames?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102987/

相关文章:

linux - 在 SUSE 上的任何包含文件夹下都找不到 zlib.h,但存在 libz.so.1

linux - makefile 中的虚假目标

gnu-make - 在Makefile中,知道GNU make是否在--dry-run中吗?

c++ - 如何正确捆绑 libstdc++.so.*?

build-process - 使: hierarchical make file

c - 链接 C 和汇编代码时出现多个定义错误?

c++ - Make/gcc 神秘错误 2 : how to have more information?

makefile - 将目标变量从模式匹配传递到静态

linux - 使用 make 生成守护进程

makefile - 当 makefile 规则的目标是 foreach 函数时停止出错