Я прочитал этот вопрос, и я был удивлен, что он не работает:
Почему GNU Make консервированный рецепт не работает?
Итак, я попробовал это сам и получил те же результаты. Вот пример makefile:
define foo
bar
baz
endef
define bar =
foo
baz
endef
$(info foo: $(foo))
$(info bar: $(bar))
all:
И вот результат его запуска:
$ make
foo: bar
baz
bar:
make: Nothing to be done for `all'.
Что здесь происходит? GNU make manual, похоже, указывает, что эти две объявления переменных должны быть одинаковыми - что мне здесь не хватает?
Edit:
Некоторые цитаты из руководства, которые я имел в виду:
define immediate deferred endef define immediate = deferred endef
5.8 Определение консервированных рецептов
Вот пример определения консервированного рецепта:
define run-yacc = yacc $(firstword $^) mv y.tab.c [email protected] endef
6.8 Определение многолинейных переменных
... Если вы предпочитаете, вы можете опустить оператор присваивания переменных. Если опустить, предположим, что это '= и создает рекурсивно расширенную переменную...
Как вы можете видеть, секция консервированных рецептов явно использует случай =
. Я использую GNU Make 3,81.