变量定义解析的规则如下:
1. IMMEDIATE = DEFERRED 立即展开
a) 其优点是:
这种类型变量在定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)
b) 其缺点是:
i. 使用此风格的变量定义,可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败。
ii. 这种风格的变量定义中如果使用了函数,那么包含在变量值中的函数总会在变量被引用的地方执行(变量被展开时)。
2. IMMEDIATE ?= DEFERRED 延后展开,如果该变量之前没有被定义过,那么对该变量赋值,如果该变量先前被定义过,那么这条语将什么也不做。
3. IMMEDIATE := IMMEDIATE 立即展开
4. IMMEDIATE += DEFERRED or IMMEDIATE 追加变量的内容,何时展开视具体情况而定定,详细如下
define IMMEDIATE
DEFERRED
Endef
当变量使用追加符(+=)时,如果此前这个变量是一个简单变量(使用 :=定义的)则认为它是立即展开的,其它情况时都被认为是“延后”展开的变量。