你如何使用 mktemp 在 Makefile 中创建目录?

How do you use mktemp to create directory in Makefile?

这是一段 Makefile 代码,说明某人如何在 Makefile 中使用 mktemp

TEST=$(shell mktemp -d)
mktemp:
    echo $(TEST)
    touch $(TEST)/test.txt
    ls $(TEST)
    cat $(TEST)/test.txt
    rm -rf $(TEST)

这是一个示例输出

❯ make mktemp 
echo /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.tQI5EeyW
/var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.tQI5EeyW
touch /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.lVL3N8Rp/test.txt
ls /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.sBW9FzgD
cat /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt
cat: /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt: No such file or directory
make: *** [mktemp] Error 1

期望 cat /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt 不会出错。

在这种情况下如何使用 mktemp?

这一行:

TEST=$(shell mktemp -d)

TEST 变量的值设置为字符串 $(shell mktemp -d)。它不扩展该字符串(不 运行 shell 命令),它只保留字符串 as-is.

现在,每次您稍后在 makefile 中使用该值时,它都会扩展,这意味着 mktemp 又是 运行,并且您会得到一个不同的值:

mktemp:
        echo $(TEST)
        touch $(TEST)/test.txt
        ls $(TEST)
        cat $(TEST)/test.txt
        rm -rf $(TEST)

你想在给变量赋值的时候使用immediate expansion,这样在解析makefile的时候只扩展一次;使用:

TEST := $(shell mktemp -d)

或者,您可以只使用 shell 操作编写配方,而不使用任何 make 函数,例如 shell:

mktemp:
        TEST=$$(mktemp -d) && \
        echo $$TEST && \
        touch $$TEST/test.txt && \
        ls $$TEST && \
        cat $$TEST/test.txt && \
        rm -rf $$TEST

请注意,默认情况下,配方的每个逻辑行 运行 在单独的 shell 中,因此为了让所有行 运行 在同一个 shell 中(因此他们可以访问相同的 $TEST 变量)您需要使用反斜杠将它们组合成一个逻辑行。