在 Makefile 中引用 shell 环境变量
Quoting shell env vars in Makefile
我以为我理解简单扩展变量在读取 Makefile
时获得它们的值 一次 -- 但我感到困惑:
var := $$RANDOM
echo:
@echo v1: $(var)
@echo v2: $(var)
有结果
$ make
v1: 11478
v2: 24064
那么 shell env var 为何被引用了两次?
我看到 var := $(shell echo $$RANDOM)
不进行第二次赋值 -- 这台机器有何不同?
Simply-expanded 变量是 MAKE 结构。实际上,该变量只扩展了一次,由 make。但是,它扩展为 shell 变量:
var := $$RANDOM
现在 make 中 var
变量的值是静态字符串 $RANDOM
并且 make 将不再扩展它。您可以通过执行以下操作来确定这一点:
var := $(info expanding RANDOM)$$RANDOM
你会看到它只打印 expanding RANDOM
一次。
但是,这个规则:
echo:
@echo v1: $(var)
@echo v2: $(var)
调用shell两次,每次传递静态字符串$RANDOM
,shell 展开,每次调用 shell 时,您都会得到不同的答案。基本上,make 是 运行:
/bin/sh -c 'echo v1: $RANDOM'
/bin/sh -c 'echo v2: $RANDOM'
如果改成这样:
var := $(shell echo $$RANDOM)
在这里,make 调用 shell 一次,并将该 shell 命令 的 结果分配给变量 var
.因此,在此之后,var
包含文字字符串 12345
或任何结果,而不是 $RANDOM
.
顺便说一句,你应该添加:
SHELL := /bin/bash
添加到您的 makefile,因为 $RANDOM
是一个 bash 特性,在 POSIX shell 中不可用,并且 make 总是调用 /bin/sh
默认值:在某些系统上 /bin/sh
与 bash 相同,但在其他系统上则不同。
我以为我理解简单扩展变量在读取 Makefile
时获得它们的值 一次 -- 但我感到困惑:
var := $$RANDOM
echo:
@echo v1: $(var)
@echo v2: $(var)
有结果
$ make
v1: 11478
v2: 24064
那么 shell env var 为何被引用了两次?
我看到 var := $(shell echo $$RANDOM)
不进行第二次赋值 -- 这台机器有何不同?
Simply-expanded 变量是 MAKE 结构。实际上,该变量只扩展了一次,由 make。但是,它扩展为 shell 变量:
var := $$RANDOM
现在 make 中 var
变量的值是静态字符串 $RANDOM
并且 make 将不再扩展它。您可以通过执行以下操作来确定这一点:
var := $(info expanding RANDOM)$$RANDOM
你会看到它只打印 expanding RANDOM
一次。
但是,这个规则:
echo:
@echo v1: $(var)
@echo v2: $(var)
调用shell两次,每次传递静态字符串$RANDOM
,shell 展开,每次调用 shell 时,您都会得到不同的答案。基本上,make 是 运行:
/bin/sh -c 'echo v1: $RANDOM'
/bin/sh -c 'echo v2: $RANDOM'
如果改成这样:
var := $(shell echo $$RANDOM)
在这里,make 调用 shell 一次,并将该 shell 命令 的 结果分配给变量 var
.因此,在此之后,var
包含文字字符串 12345
或任何结果,而不是 $RANDOM
.
顺便说一句,你应该添加:
SHELL := /bin/bash
添加到您的 makefile,因为 $RANDOM
是一个 bash 特性,在 POSIX shell 中不可用,并且 make 总是调用 /bin/sh
默认值:在某些系统上 /bin/sh
与 bash 相同,但在其他系统上则不同。