在赋值时计算Makefile变量

abe*_*ier 17 makefile

在Makefile中,我试图将shell命令的结果分配给变量:

TMP=`mktemp -d /tmp/.XXXXX`

all:
    echo $(TMP)
    echo $(TMP)
Run Code Online (Sandbox Code Playgroud)

但

$ make Makefile all
Run Code Online (Sandbox Code Playgroud)

回应2个不同的值,例如:

/tmp/.gLpm1T
/tmp/.aR4cDi
Run Code Online (Sandbox Code Playgroud)

在变量赋值上计算mktemp的语法是什么?

谢谢.

Dir*_*irk 32

这取决于制作的味道.随着GNU做,你可以使用:=,而不是=作为

TMP:=$(shell mktemp -d /tmp/.XXXXX)
Run Code Online (Sandbox Code Playgroud)

编辑正如所指出Novelocrat,所述=分配不同于:=在该分配值使用分配=替换期间将被评估(并且因此,每次,使用可变的),而:=分配变量将具有它们的值只计算一次(分配期间),因此,之后的数值是固定的.有关更详细的说明,请参阅GNU Make 的文档.

但是为了使值在赋值后真正保持不变,它不应该包含任何部分,这可能是shell特有的(make为了实际运行更新规则而调用,等等).特别是,最好避免使用反引号.相反,使用GNU make的内置shell功能和类似功能来实现你的目标.

  • 再次编辑答案。我认为,问题在于反引号的使用;对于 make,值(包括反引号)本质上是“常量”,并且会在使用时按原样粘贴——然后,shell 在每个使用点都会看到反引号。不过只是一个理论。 (2认同)

dan*_*ton 8

如果您使用的是GNU Make,而不是使用反引号,请使用$(shell ...).例如,

TMP=$(shell mktemp -d /tmp/.XXXXX)
Run Code Online (Sandbox Code Playgroud)