GNU make - неявное правило не используется, но правило stati c - PullRequest
0 голосов
/ 13 апреля 2020

Рассмотрим следующее 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.

Это работает только после преобразования его в шаблонное правило c:

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

Почему это так? Разве make не сможет понять это самостоятельно, без необходимости явного написания полного имени цели? В этом нет никакой двусмысленности или чего-либо еще (насколько я знаю).

1 Ответ

1 голос
/ 14 апреля 2020

Шаблонные правила должны иметь рецепты. Если у них нет рецепта, то они не создают шаблонное правило, а отменяют его.

См. https://www.gnu.org/software/make/manual/html_node/Canceling-Rules.html

Состояние c шаблонное правило, вопреки тому, что подразумевается под его именем, на самом деле не создает неявное правило (шаблонное или суффиксное правило). Он создает явные правила, основанные только на шаблоне. У явных правил не должно быть рецептов.

...