makefile - 在规则执行时定义 make 变量

标签 makefile gnu-make

在我的 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/

相关文章:

Linux 内核 makefile cscope 目标

python - 对 `scons -c` 执行自定义操作

c++ - 在 Makefile 的什么地方放东西(CFLAGS 或 CXXFLAGS)?

linux - 在 Linux 上使用 makefile 为复杂项目构建动态库

c++ - aam-opencv 编译因 OpenCVConfig.cmake 失败

获取规则依赖项的 Makefile 技巧

compilation - 如果保留二进制文件,删除目标文件是否安全?

linux - 如何将变量传递给 Makefile 中的 foreach 函数调用的子 make?

c - Makefile 只执行一次命令

makefile - 为什么这个 makefile 目标特定变量没有按预期扩展?