2009-09-16 3 views
15

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

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

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

но

$ make Makefile all 

в гулкой 2 разные значения, например, :

/tmp/.gLpm1T 
/tmp/.aR4cDi 

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

спасибо.

ответ

30

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

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

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

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

+1

Переменные, присвоенные '=', оцениваются при каждой подстановке. Переменные, назначенные с помощью:: =, оцениваются при назначении, как вам хочется. – Novelocrat

+0

Hi Dirk, Это не работает: http://pastie.org/619606 Есть ли синтаксическая ошибка в моем Makefile? Thanks – abernier

+1

Отредактированный ответ еще раз. Я думаю, проблема заключается в использовании обратных сигналов; для make значение (в том числе обратные) по существу является «постоянным» и будет вставлено так же, как и в момент использования, - и тогда обратные выходы будут отображаться оболочкой в ​​каждой точке использования. Однако теория. – Dirk

7

Если вы используете GNU Make, вместо использования backticks используйте $(shell ...). Например,

TMP=$(shell mktemp -d /tmp/.XXXXX) 
Смежные вопросы