如何在规则执行时定义make变量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

在我的GNUmakefile中,我希望有一个使用临时目录的规则。例如:

out.tar: TMP := $(shell mktemp -d)
        echo hi $(TMP)/hi.txt
        tar -C $(TMP) cf $@ .
        rm -rf $(TMP)

是否有一种方法可以使变量仅在规则被触发时才被定义?

提问于
用户回答回答于

为了只在以下情况下创建目录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)加到变量中,从而生成一个具有该名称的变量。

用户回答回答于

一个相对简单的方法是将整个序列写成一个shell脚本。

out.tar:
   set -e ;\
   TMP=$$(mktemp -d) ;\
   echo hi $$TMP/hi.txt ;\
   tar -C $$TMP cf $@ . ;\
   rm -rf $$TMP ;\

我在这里合并了一些相关的技巧:https://stackoverflow.com/a/29085684/86967

扫码关注云+社区