makefile进阶(三)--变量(转)

$(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上


之前看到的变量都是全局变量,也就是作用域为整个文件范围。我们也可以定义局部变量,被称为目标变量。它的语法为:
<target ...>:<var assignment>
或者<target ...>:override <var assignment>用于覆盖环境变量和make -e参数。

比如:
VAR=global
local:VAR=local

local:
    echo $(VAR)# local

other:
    echo $(VAR)# global

基于目标变量,我们可以定义模式变量。比如:
%.o:CFLAGS=-O
为所有的以.o结尾的目标定义CFLAGS。

posted @ 2013-02-04 11:16  Mr.Shadow  阅读(439)  评论(0编辑  收藏  举报