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 还没有引入 ?:=
运算符...
我们如何使用 ?=
进行分配,但它实际上是为了立即,
正如 '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 还没有引入 ?:=
运算符...