一、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