请考虑以下简化的Makefile
:
target :
(recipe)
target-mt : (add some flags)
target-mt : target
此示例按预期工作:make target-mt
添加一些标志并继续编译target
。
现在,由于*-mt
模式经常发生,并且始终具有相同的标志,因此,我想使这种工作变得普遍。因此,让我们用Makefile pattern rule简化:
target :
(recipe)
%-mt : (add some flags)
target-mt : target
这可以按预期工作,现在所有以后的*-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 $@
我认为一定有原因导致此失败,并且我认为这可能与以下事实有关:依赖项是纯%
,而不是像%.c
这样的定义。但是我在文档中找不到与这种限制相关的任何信息(上面链接)。
问题是:
1)对此行为有解释吗?
2)还有另一种方法可以实现相同的目标吗?
您不能在没有配方的情况下声明模式规则。或更确切地说,您可以,但是它并没有满足您的要求:取而代之的是cancels the pattern rule。