代码之家  ›  专栏  ›  技术社区  ›  Emil Sit

在规则执行时定义make变量

  •  162
  • Emil Sit  · 技术社区  · 16 年前

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

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

    解析 . 这意味着,即使我没有一直使用make out.tar,也会创建许多临时目录。我希望避免我的/tmp被未使用的临时目录弄乱。

    是否有办法使变量仅在触发规则时定义,而不是在定义规则时定义?

    3 回复  |  直到 16 年前
        1
  •  380
  •   Max Alibaev Shachar Shemesh    5 年前

    在您的示例中 TMP 每当 规则 out.tar 进行评估。以便仅在以下情况下创建目录: 焦油

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

    这个 eval 函数对字符串进行求值,就好像它是手动键入到makefile中一样。在本例中,它设置 shell 函数调用。

    编辑 (回应评论):

    要创建唯一变量,可以执行以下操作:

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

    out.tar_TMP . 希望这足以防止冲突。

        2
  •  82
  •   Community Mohan Dere    9 年前

    一种相对简单的方法是将整个序列作为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

        3
  •  37
  •   user3124434    12 年前

    另一种可能是在触发规则时使用单独的行设置Make变量。

    例如,这里是一个具有两个规则的makefile。如果触发规则,它将创建一个临时目录并将TMP设置为临时目录名称。

    PHONY = ruleA ruleB display
    
    all: ruleA
    
    ruleA: TMP = $(shell mktemp -d testruleA_XXXX)
    ruleA: display
    
    ruleB: TMP = $(shell mktemp -d testruleB_XXXX)
    ruleB: display
    
    display:
        echo ${TMP}
    

    $ ls
    Makefile
    $ make ruleB
    echo testruleB_Y4Ow
    testruleB_Y4Ow
    $ ls
    Makefile  testruleB_Y4Ow
    
        4
  •  5
  •   Victor Sergienko    7 年前

    我不喜欢“不要”的回答,但是。。。不要。

    make

    在这种情况下,只要变量局部到一个目标,就遵循 @nobar's answer 并使其成为shell变量。

    目标特定变量也被其他make实现认为是有害的: kati , Mozilla pymake 你不知道是哪条路 ,因为您不知道已经构建了什么。