在 Makefile 配方中分配变量

Assigning variables in Makefile recipe

在我的一个 Makefile 配方中,我想创建一个临时文件,将该文件的名称传递给 shell 命令并将该命令的输出分配给一个 make 变量,以便我可以使用随后。对于我的生活,我无法让它工作。

出于调试的目的,我试图将问题归结为我能想到的最简单的目标:

.PHONY: foo
foo:
    $(eval TMPFILE = $(shell mktemp -p ./))
    dd if=/dev/random of=${TMPFILE} bs=1 count=512
    $(eval FOO = $(shell wc -c ${TMPFILE}))
    @echo FOO: ${FOO}

事情是这样的:

❯ make foo
dd if=/dev/random of=./tmp.K1au4WrZ76 bs=1 count=512
512+0 records in
512+0 records out
512 bytes copied, 0.00287818 s, 178 kB/s
FOO: 0 ./tmp.K1au4WrZ76

不知何故,wc 认为该文件是空的。但是当我检查 TMPFILE 时,它有 512 个字节,正如预期的那样:

❯ wc -c tmp.K1au4WrZ76
512 tmp.K1au4WrZ76

谁能告诉我这里发生了什么以及如何正确地做到这一点?

谢谢 菲尔

更新:根据答案,我将这个目标放在一起,它可以按预期工作:

.PHONEY: foo
.ONESHELL:
foo:
    set -e
    TMPFILE=`mktemp -p ./`
    dd if=/dev/random of=$$TMPFILE bs=1 count=512
    FOO=`wc -c $$TMPFILE`
    @echo FOO: $$FOO

谢谢!

Make 总是先展开整个配方(配方的所有行),然后再启动任何 shell 命令。所以你所有的 eval 等操作都在任何 shell 命令之前被调用,例如 dd,是 运行.