make variable ?= 真的是为了立即

make variable ?= is really intended for immediate

我们如何使用 ?= 进行分配,但它实际上是为了立即,
正如 'make' 参考手册所说,它的 RHS 必须被推迟?

你可以使用这个:

ifeq ($(origin FOO), undefined)
  FOO := bar
endif

然而,这意味着如果在此处设置变量将是简单的,并且如果已经设置,则将是之前的任何类型。

或者您可以使用行为略有不同的这个:

FOO ?= bar
FOO := $(FOO)

这里的FOO会一直很简单,但是如果之前设置了也会扩大FOO的值,你可能不希望这样.

这些是您唯一的选择。

以下任一方法都应该有效:

VAR := $(or $(VAR),newval)

VAR?=val
VAR:=$(VAR)

两者都有变量名重复,这是无法避免的。

与第一个选项的一个小区别 -- 如果设置了 $(VAR),但设置为空白,则第一个选项会将其覆盖为 newval,但 ?= 运算符将留空。

附带说明一下,我有点惊讶 make 还没有引入 ?:= 运算符...