В вашем примере переменная TMP
устанавливается (и создается временный каталог) всякий раз, когда оцениваются правила для out.tar
. Чтобы создать каталог только тогда, когда out.tar
действительно запущен, вам нужно переместить создание каталога вниз по шагам:
out.tar :
$(eval TMP := $(shell mktemp -d))
@echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
Функция eval оценивает строку, как если бы она была введена в make-файл вручную. В этом случае он устанавливает переменную TMP
в результате вызова функции shell
.
изменить (в ответ на комментарии):
Чтобы создать уникальную переменную, вы можете сделать следующее:
out.tar :
$(eval $@_TMP := $(shell mktemp -d))
@echo hi $($@_TMP)/hi.txt
tar -C $($@_TMP) cf $@ .
rm -rf $($@_TMP)
Это добавит имя цели (в данном случае out.tar) к переменной, создав переменную с именем out.tar_TMP
. Надеюсь, этого достаточно для предотвращения конфликтов.