变量的类型
1. := 简单扩展变量
2. = 递归扩展变量
3. ?= 条件赋值变量
只会在变量值不存在时,才会进行赋值动作。这个用在接收命令行的变量设置
4. += 附加变量
宏
用define endef定义的代码块。
如
define rename
mv a b
endef
当宏写在命令脚本中,会自动为每行加上tab。
不过为了方便阅读,在定义宏时,每行加上tab也是可以的。 。
变量和宏的使用
$(变量名)
何时扩展变量和宏
make运行时,会分成两个阶段来完成工作。 是在第一个阶段就展开,还是在第二个阶段展开,就是所谓的简单变量和递归变量。
第一阶段make读取规则(包括工作目标,必要条件),变量,形成依存图等。
第二阶段才是真真执行的时候。
就我的理解,在第一阶段的时候,因为要形成具体的依存图,所以相关依存图的内容必须立即展开。(好吧,我就用展开吧,其实人家就是要得到这些具体的值。)否则无法产生依存图来为第二阶段的执行做好准备。 所以和规则相关的 工作目标,必要条件都是在这个阶段展开的。
但是具体的规则缺不在这个时候展开,make可以记住这些规则(也就是记住带有$符号的字符串),等到要用的时候再展开。
第二阶段,真正执行的时候。 因为此时对不同的工作目标,其执行的路径,时间等都不会完全一样。所以要使用“延后”展开的方法,当这个规则被调用的时候才展开,以防止执行出错。
再来看变量。变量的名字,包括宏的名字,是立即展开的。因为这个东东要形成依存图的。不展开,估计复杂度会提高的。
对于变量的内容来说,这个大部分是在第二阶段展开的。
除了 := 是立即展开的。+= 看左边的变量如果原来就是简单变量,那就立即展开;否则就延后展开。
将变量导出到环境变量中
export variable-in-make = NAME
show-var:
env | grep variable-in-make
echo $(PWD)
这个功能在递归调用make的时候比较有用。