Makefile模式规则限制

Makefile模式规则限制,makefile,Makefile,考虑以下简化的Makefile: target : (recipe) target-mt : (add some flags) target-mt : target 此示例按预期工作:maketargetmt添加一些标志并继续编译target 现在,由于*-mt模式经常出现,并且总是使用相同的标志,因此我想让这项工作变得常见。让我们用一个简单的例子: 这按预期工作,现在所有以后的*-mt目标都会收到相同的附加标志集。 现在,请注意,something mt的依赖关系始终是someth

考虑以下简化的
Makefile

target :
    (recipe)

target-mt : (add some flags)
target-mt : target
此示例按预期工作:
maketargetmt
添加一些标志并继续编译
target

现在,由于
*-mt
模式经常出现,并且总是使用相同的标志,因此我想让这项工作变得常见。让我们用一个简单的例子:

这按预期工作,现在所有以后的
*-mt
目标都会收到相同的附加标志集。 现在,请注意,
something mt
的依赖关系始终是
something
。所以我想更进一步地概括这个关系:

target :
    (recipe)

%-mt : (add some flags)
%-mt : %
这个不起作用

make: *** No rule to make target `target-mt'.  Stop.
对于模式规则的一般公式,这似乎有些奇怪,例如规范示例:

%.o : %.c
    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
%.o:%.c
$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o$@
我认为这一失败一定有原因,我认为这可能与依赖关系是一个纯粹的
%
,而不是像
%.c
这样的定义有关。但我在文档中找不到任何与此限制相关的内容(链接如上)

问题是:

1) 这种行为有什么解释吗


2) 有没有其他方法可以实现同样的目标?

您不能声明没有配方的模式规则。或者更确切地说,你可以,但它并没有做你想做的事情:而是它

您可以添加一个虚拟配方,如下所示:

%-mt: % ; @:
是一个shell no op操作符)


或者你不能用这个,回到原来的样子。从这个有限的示例中理解完整的上下文有点困难。

好的,所以模式规则
%.o:%.c
工作的原因是它后面有一个实际的配方,而不仅仅是一个依赖项?正确。没有配方的模式规则将取消模式规则。谢谢!顺便说一句,正如建议的那样,添加一个假的配方,或者一个像
echo something
这样的琐碎配方确实有效!
%-mt: % ; @: