变量和函数在make读到该行时会被立即展开,在方法中除外
变量区分大小写,尽量仅使用字母,数字和下划线
6.1变量引用的基础
用$()引用变量的值
6.2变量的两种类型
递归展开变量: 'foo = $(bar)'
当被引用时才会展开,被引用前其值是未知的
立即展开变量: 'foo := $(bar)'
其值在定义时已经确定。'='号右边出现的变量引用会被立即展开,函数会被立即执行
变量定义中的空格:'='右边到第一个值之间的空格会被忽略,最后一个值右边的空格会被保留
6.3变量引用的一些特性
6.3.1 替换引用
$(var:a=b) : 将变量的每个值的末尾的a替换为b
$(var:%a=%b) = $(patsubst a,b,$(var))
6.3.2
略
6.4变量是如何被赋值的
1)override value when you run make
2)在makefile中指定变量的值(用'='或define)
3)通过环境变量
4)自动变量会被自动赋值
5)一些特殊变量有固定的初始值
6.5定义变量
'='定义递归展开变量,
':='定义立即展开变量,
'?='仅定义没有被定义过的递归展开变量
'!='将等号右边放入shell执行,并将执行结果赋给左边。
6.6为变量增加值 '+=' (不改变变量的展开方式)
6.7override指令 override可以用来强制修改某些默认不能修改的变量
6.8定义多行变量
define two-lines = ('='可省略。如果省略,默认是递归展开变量)
echo foo
echo $(bar)
endef
用define定义的多行变量如果出现在recipe中,会被看成一行。(换行符被替换为分号)
6.9用undefine删除一个变量
6.10从环境中获取的变量
当环境变量和makefile中的变量冲突时,makefile中变量优先级更高。可以通过指定'-e'标志来更改优先级