GNU Make:伪目标似乎不匹配模式

时间:2016-02-12 23:06:01

标签: makefile gnu-make

我有这个最小的Makefile:

.PHONY: foo.bar
%.bar:
    echo $*

我运行$ make foo.bar并且我希望它与%.bar模式匹配,使用“foo”填充词干$ *,并且始终回显“foo”因为foo.bar是虚假目标。但是,我得到的输出是

make: Nothing to be done for 'foo.bar'.

我在这里错过了什么吗?

修改

我忘了提到删除.PHONY行会执行回显“foo”的预期行为,并使其成为没有模式匹配的显式目标“foo.bar”。两者都很有意义,因为在前者中,文件foo.bar不存在,而在后者中,嗯,它只是明确的。

修改

这实际上可能与此重复:When declaring the pattern rule as PHONY, it is not triggered。这是有用的东西:

.PHONY: foo.bar

foo.bar: %.bar:
    echo $*

无论出于何种原因,目标/依赖关系行更像目标/(依赖关系|目标)/依赖关系。有人可以解释一下或指向我的文档吗?

1 个答案:

答案 0 :(得分:1)

来自.PHONY targets的制作手册部分:

  

.PHONY个目标会跳过隐式规则搜索(请参阅隐式规则)。

意味着您的%.bar:规则被忽略了。

摆脱.PHONY当然按预期工作;使用规则foo.bar: %.bar:是有效的,因为静态模式规则不是隐式规则,因此.PHONY目标不会被忽略。