GNU делает различия в объявлениях многострочных переменных - PullRequest
26 голосов
/ 17 февраля 2011

Я прочитал этот вопрос, и я был удивлен, что он не работает:

Почему не работает консервированный рецепт 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.

Ответы [ 2 ]

29 голосов
/ 18 февраля 2011

Из CHANGELOG в 3.82:

* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.)
after a define, to create variables with those flavors.

Похоже, что использование '=' не поддерживается до этого в define операторов

18 голосов
/ 18 февраля 2011

Это, вероятно, ваша make версия. Я протестировал этот make-файл на моей машине, используя 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 предназначено для версии 3.82.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...