Я прочитал этот вопрос, и я был удивлен, что он не работает:
Почему не работает консервированный рецепт 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 , похоже, указывает на то, что эти две декларации переменных должны быть одинаковыми - что мне здесь не хватает?
Редактировать:
Некоторые цитаты из руководства, которые яимел в виду:
3.7 Как make считывает Makefile
define immediate
deferred
endef
define immediate =
deferred
endef
5.8 Определение консервированных рецептов
Вот пример определения стандартного рецепта:
define run-yacc =
yacc $(firstword $^)
mv y.tab.c $@
endef
6.8 Определение многострочных переменных
... Вы можете опустить оператор присваивания переменной, если хотите.Если он опущен, make предполагает, что он равен '=', и создает рекурсивно расширенную переменную ...
Как видите, в разделе стандартных рецептов явно используется =
дело.Я использую GNU Make 3.81.