Вычисление переменной Makefile при назначении - PullRequest
16 голосов
/ 17 сентября 2009

В Makefile я пытаюсь присвоить результат команды оболочки переменной:

TMP=`mktemp -d /tmp/.XXXXX`

all:
    echo $(TMP)
    echo $(TMP)

но

$ make Makefile all

отображает 2 разных значения, например:

/tmp/.gLpm1T
/tmp/.aR4cDi

Каков синтаксис для mktemp, который будет вычисляться при присваивании переменной?

Спасибо.

Ответы [ 2 ]

32 голосов
/ 17 сентября 2009

Зависит от вкуса марки. С GNU Make вы можете использовать := вместо =, как в

TMP:=$(shell mktemp -d /tmp/.XXXXX)

Редактировать Как указывает Новелократ, назначение = отличается от назначения := тем, что значения, назначенные с помощью =, будут оцениваться во время замены (и, таким образом, каждый раз, когда переменная используется), тогда как := назначенные переменные будут оцениваться только один раз (во время назначения), и, следовательно, значения будут фиксированными после этого. См. документацию GNU Make для более подробного объяснения.

Для того чтобы значение было действительно постоянным после присваивания, оно не должно содержать каких-либо частей, которые могут быть особенными для оболочки (которые make вызывает для фактического запуска правил обновления и т. Д.) В частности, обратные помехи лучше избегать. Вместо этого используйте встроенную функцию оболочки GNU make и аналогичные для достижения своих целей.

8 голосов
/ 14 февраля 2012

Если вы используете GNU Make, вместо обратных галочек используйте $(shell ...). Например,

TMP=$(shell mktemp -d /tmp/.XXXXX)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...