Вычисление переменной Makefile при присваивании

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

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

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

но

$ make Makefile all

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

/tmp/.gLpm1T
/tmp/.aR4cDi

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

Спасибо.

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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