Шаблонные правила makefile без рецептов - PullRequest
9 голосов
/ 16 сентября 2010

Я наблюдаю интересное поведение make и мне интересно, есть ли разумное объяснение этому, кроме ошибки в gmake.

Допустим, у нас есть следующее в make-файле:

%-animal:
        echo "$* is an animal"

%-fox: %-fox-animal

%-wolf: %-wolf-animal

Разница между двумя последними целями в том, что у "% -wolf" нет никакого рецепта, а у "% -fox" пустой рецепт (то есть просто строка с вкладкой в ​​начале).

Когда мы пытаемся выполнить правила, вот что происходит:

[root@cv19 tmp]# make freddy-animal
echo "freddy is an animal"
freddy is an animal
[root@cv19 tmp]# make freddy-wolf
make: *** No rule to make target `freddy-wolf'.  Stop.
[root@cv19 tmp]# make freddy-fox
echo "freddy-fox is an animal"
freddy-fox is an animal

Т.е. правило шаблона, у которого есть рецепт (хотя и пустой), работает, а правило, которого нет. Я что-то упустил, как это должно работать?

1 Ответ

12 голосов
/ 17 сентября 2010

Шаблонные правила без рецептов вообще задокументированы как означающие нечто совершенно отличное от тех, которые предоставляют рецепт, даже пустой.Вместо этого они отменяют любое ранее существующее неявное правило :

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

Таким образом, ваш шаблон "% -wolf" фактически служит для отмены любого существующего неявного правила для % - wolf-animal -> % - wolf .И в любом случае его не было.

...