GNU make 中,一个变量的定义有四种方式(或者称为风格)。我们把这四种方式定义的变量可以看作变量的四种不同风格。变量的这四种不同的风格的区别在于: 1. 定义方式; 2. 展开时机。
递归展开式变量(递归赋值)–影响的变量可能会是多个 这一类型的变量的定义是通过“=”或者使用指示符“define”定义的变量。 比如下图,整个变量的替换过程时这样的:首先“$(name1)”被替换为 “$(name2)”,接下来“$(name2)”被替换为“$(name3)”,最后“$(name3)”被替换为“小明”。整个替换的过程是在执行“echo $(name1)”命令行时进行的。 其优点是:这种类型变量的定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过 make 的命令行选项传递的变量)。 但这种递归展开式又有缺点,如下图:使用此风格的变量定义,可能会由于出现变量的递归定义而导致 make 陷入到无限的变量展开过程中,最终使 make 执行失败。 它将会导致 make 进入对变量name1、name2、name3的无限展开过程中去(这种定义就是变量的递归定义)。展开过程将是套嵌的、不能终止的(在发生这种情况时, make 会提示错误信息并结束)。一般在书写 Makefile 时,使用这种追加变量值的方法也很少使用(也不是我们推荐的方式)。