在 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两次,每次传递静态字符串$RANDOMshell 展开,每次调用 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 相同,但在其他系统上则不同。