GNU делает различия в объявлениях многострочных переменных
Я прочитал этот вопрос, и я был удивлен, что он не работает:
Почему 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:
Некоторые цитаты из руководства, которые я имел в виду:
3.7 Как make Reads Makefile
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.
Ответы
Ответ 1
Возможно, это ваша версия make
. Я тестировал этот makefile на своей машине, используя make 3.81 в Cygwin и получил:
$ make
foo: bar
baz
bar:
make: Nothing to be done for `all'.
Я тестировал один и тот же make файл, используя make 3.82 (родная сборка Windows) и получил:
C:\>C:\make\make.exe
foo: bar
baz
bar: foo
baz
make: Nothing to be done for `all'.
Я считаю, что онлайн-руководство make
предназначено для v3.82.
Ответ 2
Из CHANGELOG в 3.82:
* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.)
after a define, to create variables with those flavors.
Кажется, что использование '=' не поддерживается до этого в define операторах