GNU make-不使用隐式规则,但是使用静态模式规则

时间:2020-04-13 20:22:54

标签: makefile gnu-make

请考虑以下makefile(和任何hi.c):

.PHONY: analyze-%


hi: hi.c
    gcc -o $@ $<

%.json: %
    touch $@ # actually created by analysis-tool

analyze-%: %.json # why does this not work?

正如我在makefile中的评论所指出的那样,隐式规则不起作用:

$ make analyze-hi
make: *** No rule to make target 'analyze-hi'.  Stop.

它只有在将其转换为静态模式规则后才能工作:

...
analyze-hi: analyze-%: %.json

为什么会这样? make是否应该能够自己解决这个问题,而不必我显式地写出完整的目标名称?据我所知,没有任何歧义。

1 个答案:

答案 0 :(得分:1)

模式规则必须具有配方。如果他们没有配方,那么他们就没有创建模式规则,而是要取消一个规则。

请参见https://www.gnu.org/software/make/manual/html_node/Canceling-Rules.html

与它的名称所暗示的相反,静态模式规则实际上并不是在创建隐式规则(模式或后缀规则)。它只是基于模式来创建显式规则。明确的规则不必包含配方。