1 递归扩展变量和简单扩展变量的区别
最大的区别在于,递归扩展变量等号右边的表达式里面的变量要等到该递归变量被用的时候再去扩展,而简单变量的话,在读取makefile的时候就已经扩展了。
并且简单扩展变量有前后关系,简单扩展变量只能用到在其前面定义的变量,而不能用到在其后面定义的变量。而递归扩展变量,要用的时候,需要扩展的时候,可以一直扩展到不能扩展为止,即递归扩展。
2 例子
foo := $(bar)
bar = aaa
all:;echo $(foo)
输出为空,因为在给foo赋值扩展等号右边的时候,还没有bar,因此为空。
foo = $(bar)
bar=aaa
all:;echo $(foo)
输出aaa,读取makefile时,foo等号右边还没有被扩展,要用foo的时候再去递归扩展,到了bar,它的右边已经没有需要继续扩展的变量了,因此停止扩展。
3 如果等号右边就是最终的字符串,那么递归扩展变量和简单扩展变量是一样的
因为不需要再扩展了,要用的时候直接用就可以了。
4 immediate ?= deferred
同等号一样,?=也是左边是立即扩展,右边是推迟扩展,直到用的时候或者第二阶段才扩展。不过左边也需要扩展的情况是比较少的。