在 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
,是 运行.
在我的一个 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
,是 运行.