Makefile 使隐式规则不';没有命令就不能工作

Makefile 使隐式规则不';没有命令就不能工作,makefile,Makefile,我有一个简单的Makefile,如下所示: %.t1: %.t2 %.t2: echo "t2" 我打字的时候 make x.t2 它很好用。但是当我打字的时候 make x.t1 我明白了 如果我将%.t1目标修改为 %.t1: %.t2 echo 然后它就起作用了。为什么没有命令它就不能工作?我在Fedora 23上使用GNU make 4.0。没有配方的模式规则不会添加规则,它会取消隐式规则。见: 通过定义具有相同目标和先决条件但没有配方的模式规则,可以取消内

我有一个简单的Makefile,如下所示:

%.t1:   %.t2

%.t2:
    echo "t2"
我打字的时候
make x.t2
它很好用。但是当我打字的时候
make x.t1
我明白了

如果我将%.t1目标修改为

%.t1:   %.t2
    echo

然后它就起作用了。为什么没有命令它就不能工作?我在Fedora 23上使用GNU make 4.0。

没有配方的模式规则不会添加规则,它会取消隐式规则。见:

通过定义具有相同目标和先决条件但没有配方的模式规则,可以取消内置隐式规则。例如,以下内容将取消运行汇编程序的规则:

%.o : %.s
可以添加分号以告知make其配方为空:

%.t1: %.t2 ;
%.t2:
    echo t2
这将产生:

$ make x.t1
t2

因为没有生成
x.t1
的规则。此时,您希望如何处理
x.t1
目标?为什么要这样设置makefile?您的最终目标是什么?我的理解是%.t1匹配以.t1结尾的任何目标。这就是我希望它使用的规则,就像我要求它生成x.t2时它知道使用%.t2目标一样。我的目标是使用依赖项规范作为声明性编程的一种形式。我给出的示例是人为设计的,但是由于存在多个依赖项和副作用,这种方法非常有用。您没有为
%提供规则。t1
您列出了一个先决条件。这是一条没有配方的规则。make不喜欢那样。如果您愿意,您可以给它一个空的配方,
%.t1:%.t2。您还需要将其标记为
.PHONY
,以使其正常工作。你能提供一个小的合理的例子来说明你在这里要做什么吗?你必须知道
make
希望它的目标是它可以创建的文件。也有例外(
.PHONY
目标等),但目标是文件的原则非常基本,例如,它通过比较文件修改时间来决定是否运行规则。如果希望声明性规则中的所有目标都是非文件,请使用其他内容(例如Prolog)。
$ make x.t1
t2