GNU make on Mint (Ubuntu Linux) 简单模式规则给出:"no targets"

GNU make on Mint (Ubuntu Linux) Simple Pattern rule gives: "no targets"

这个 Makefile 有什么问题? 我有三个后缀为 .z 的文件,我想制作 3 个后缀为 .x 的同名文件。 (我正在尝试让 GNU make 模式规则起作用;任何模式规则...:(!)

ls *.z
doll.z  dummy.z  puppet.z

 cat -t all.mk
.SUFFIXES: 
.SUFFIXES: .x .z
%.x:^I%.z 
^Iecho 'Pre-req' $< makes target $@
^Icp $< $@

make  -f all.mk 
make: *** No targets.  Stop.

模式规则是一个模板。它告诉 make,“如果你想构建一个像这样的目标并且没有明确的规则去做,这里是如何做的”。

模式规则不是指令:它不会说“去文件系统中搜索可以使用此模式构建的所有可能目标并构建它们”。

因此,您已经创建了一个模板,make 可以 用于根据 .z 先决条件构建 .x 目标,但是,正如错误消息所说,您实际上并没有要求 make 构建任何东西。

要让 make 构建某些东西,您必须请求构建一些东西。一种方法是通过命令行,如上面的评论所述:

make -f all.mk doll.x

现在 make 知道您想要构建 doll.x,因此它会寻找实现该目标的方法,并找到您的模式规则。或者你可以将它放入 makefile 本身,就像这样(all 是“构建东西”的传统目标名称,但你可以使用任何你喜欢的名称):

.PHONY: all
all: doll.x  dummy.x  puppet.x

或者您甚至可以确定要动态构建的内容,如下所示:

.PHONY: all
all: $(patsubst %.z,%.x,$(wildcard *.z))