2016-07-06 2 views
0

Я смотрел на другой stack overflow question, и они использовали то, что выглядит быть документированы поведение для Makefiles ... Если у меня есть следующие Makefile:установки переменной с Eval в рецепте Makefile

X=X 

all: 
    @echo [email protected]: $(X) 
    $(eval X=Y) 
    @echo [email protected] part2: $(X) 

all2: 
    @echo [email protected]: $(X) 

Тогда я бегу :

~> make all2 
all2: X 
~> make all all2 
running all 
all: X 
all part2: Y 
all2: Y 

Я бы ожидал $(eval X=Y) расширить в Makefile разобрать время, и установить оболочки переменной X быть Y для этой линии сабельные e (т.е. ничего не делать). Вместо этого он, кажется, оценивается при запуске рецепта all, плюс, кажется, он задает переменную make. Я просмотрел страницу make man и для онлайн-руководств, но я не могу найти ничего, что описывает это поведение (я использую GNU Make 4.0). Может ли кто-нибудь указать мне на какую-то документацию, описывающую это, или объяснить, что происходит?

+1

Здесь вы можете найти более подробную информацию: http://stackoverflow.com/questions/38224102/make-define-multiple-variables-in-the-same-eval-call. В основном, как сказано в документации GNU, это часть синтаксиса Makefile, оцененная при вызове, поэтому она все еще является переменной Makefile и действительно оценивается в целевом 'all'. Вот документация 'eval': https://www.gnu.org/software/make/manual/html_node/Eval-Function.html – Tim

ответ

2

Я не уверен, почему вы ожидали бы того, что вы упомянули, чтобы быть правдой. Может быть, вы думаете, что это использует оболочку eval, так или иначе? Это не то, что он делает, он использует функцию GNU eval, которая составляет discussed here.

Как и любая другая переменная или функция, eval, появляющийся в рецепте, не разворачивается до тех пор, пока не будет вызван рецепт, потому что цель устарела. См. How make Reads a Makefile для получения подробной информации о том, когда расширяются переменные и функции.

Во-вторых, все переменные присваивания задают переменные, и только если вы их отправите в оболочку.

Смежные вопросы