Makefile的变量

一、Makefile的变量是什么?

在 Makefile 中的定义的变量,就像是 C/C++语言中的宏一样,代表了一个文本字串,在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。其与 C/C++所不同的是,你可以在 Makefile 中改变其值。在 Makefile 中,变量可以使用在“目标”,“依赖目标”,“命令”或是 Makefile 的其它部分中。

二、命名规则

变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是大小写敏感的,“abc”、“Abc”和“ABC”是三个不同的变量名。传统的 Makefile 的变量名是全大写的命名方式,推荐使用大小写搭配的变量名,如:MakeFlag。这样可以避免和系统的变量冲突,而发生意外的事情。
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上符号,但最好用小括号或是大括号“{}”把变量给包括起来。如果你要使用真实的"$"字符,那么你需要用“$$”来表示。 变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中。先看一个例子:

objects = program.o foo.o utils.o 
program : $(objects) 
cc -o program $(objects) 
$(objects) : defs.h 
#变量会在使用它的地方精确地展开,就像 C/C++中的宏一样,例如: 
foo = c 
prog.o : prog.$(foo) 
$(foo)$(foo) -$(foo) prog.$(foo) 

展开后得到:

prog.o : prog.c 
cc -c prog.c 

Makefile 中这样干,这里只是举个例子来表明 Makefile 中的变量在使用处展开的真实样子。其实就是一个“替代”的原理。

三、几种赋值方式

1、=

在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值

aaa = $(bbb) 
bbb = $(ccc) 
ccc = ddd
 
all: 
echo $(aaa) 

我们执行“make all”将会打出变量$(aaa)的值是“ddd”( $(aaa)的值是$(bbb)$(bbb)的值是$(ccc)$(ccc)的值是“ddd”)可见,变量是可以使用后面的变量来定义的。
**优点:**这个功能有好的地方,,我们可以把变量的真实值推到后面来定义,
**缺点:**容易造成递归定义,比如:

A = $(B) 
B = $(A)

这会让 make 陷入无限的变量展开过程中去,当然,我们的 make 是有能力检测这样的定义,并会报错。还有就是如果在变量中使用函数,那么,这种方式会让我们的 make 运行时非常慢,更糟糕的是,会使用得两个 make 的函数“wildcard”和“shell”发生不可预知的错误。因为你不会知道这两个函数会被调用多少次。

2、:=

这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。
比如:
y := $(x) bbb
x := aaa
那么,y 的值是“bbb”,而不是“aaa bbb”。
再比如:

x = $(y) 
y = z 
z = Hello 
a := $($(x)) 

这里的$($(x))被替换成了$($(y)),因为$(y)值是“z”,所以,最终结果是:a:=$(z),也就是“Hello”。

3、?=

aaa ?= bbb

其含义是,如果 aaa 没有被定义过,那么变量 aaa 的值就是“bbb”,如果 aaa 先前被定义
过,那么这条语将什么也不做,其等价于:

ifeq ($(origin aaa), undefined) 
aaa = bbb 
endif

4、+=

“+=”操作符给变量追加值

objects = main.o aaa.o bbb.o ccc.o 
objects += ddd.o 

于是,我们的$(objects)值变成:“main.o aaa.o bbb.o ccc.o ddd.o”(ddd.o被追加进去了)
使用“+=”操作符,可以模拟为下面的这种例子:

 
objects = main.o aaa.o bbb.o ccc.o 
objects := $(objects) ddd.o 
 

所不同的是,用“+=”更为简洁。

如果变量之前没有定义过,那么,“+=”会自动变成“=”,如果前面有变量定义,那么“+=”会继承于前次操作的赋值符。如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符,如:

variable := value 
variable += more 

等价于:

variable := value 
variable := $(variable) more
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值