在我的 GNUmakefile 中,我想要一个使用临时目录的规则。例如:
out.tar: TMP := $(shell mktemp -d)
echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
如上所述,上述规则在解析规则时创建临时目录。这意味着,即使我不一直使用 out.tar,也会创建许多临时目录。我想避免我的/tmp 被未使用的临时目录弄得乱七八糟。
有没有办法让变量只在规则被触发时才被定义,而不是在任何时候被定义?
我的主要想法是将 mktemp 和 tar 转储到 shell 脚本中,但这似乎有些难看。
最佳答案
在您的示例中, 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函数评估一个字符串,就好像它是手动输入到 makefile 中的一样。在这种情况下,它设置 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
的变量。 .希望这足以防止冲突。
关于makefile - 在规则执行时定义 make 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909188/