Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 операторах