$(NAME)和${NAME}表示一个变量。变量名是大小写敏感的。$$表示“$”字符本身。
我们可以通过=号把一个变量(或常量、或变量和常量的组合)赋给别的变量。同样我们也可以用:=来给变量赋值。它们的区别在于=号会使用之后定义的变量的值,而:=号不会取之后定义的变量的值。比如:
X1=a
X2=$(X1)+$(X4) #X2=a+z
X3:=$(X1)+$(X4) #X3=a+
X4=z
另一个赋值符是?=。它表示如果变量没有定义过则赋值,否则就不赋值。
还有一个赋值符是+=,可以将变量的现有值和右值合并。
define也可以用来定义变量:
define S7
uvw# S7=uvw
endef
其实define的本质还是宏,不管它里面定义的内容是什么(命令集或是变量值),make只是在使用被define的变量的地方简单地把内容展开。
$(var:a=b)或${var:a=b}可以把变量var里的末尾的a子串替换为b。比如:
S1=abcd
S2=$(S1:bcd=xyz)# S2=axyz
另一种替换方法是使用静态模式,比如:
S1=abcd
S3=$(S1:a%d=x%z)# S3=xbcz
变量的值可以作为另一个变量。比如:
S1=abcd
S4=S1
S5=$($(S4))# S5=abcd
多个变量的值也可以组成一个变量,比如:
A_B=a-b
S1=A
S2=B
S3=$($(S1)_$(S2))# S3=a-b
系统环境变量会
在make运行时载入了makefile文件里。比如CFLAGS。如果使用make的-e参数,那么系统环境变量将被覆盖。而如果makefile里定
义了相同的变量,也会覆盖全局变量。但是,makefile里的变量默认下不能覆盖make的-e选项所定义的值。为了覆盖这个值,makefile里可
以用override关键字:
override var=val(或:=或+=)。override也可以作用在define上。
之前看到的变量都是全局变量,也就是作用域为整个文件范围。我们也可以定义局部变量,被称为目标变量。它的语法为:
:
或者:override 用于覆盖环境变量和make -e参数。
比如:
VAR=global
local:VAR=local
local:
echo $(VAR)# local
other:
echo $(VAR)# global
基于目标变量,我们可以定义模式变量。比如:
%.o:CFLAGS=-O
为所有的以.o结尾的目标定义CFLAGS。
阅读(1067) | 评论(0) | 转发(0) |