Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736445
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: LINUX

2012-04-01 17:41:45

$(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。
阅读(1022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~