1、变量使用概述
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”
符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”
字符,那么你需要用“$$”
来表示。变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中。
2、“=”、“:=”与“?=”区别
2.1 “=”操作符
在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处;也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。如:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo)
我们执行“make all”将会打出变量$(foo)
的值是“Huh?”( $(foo)
的值是$(bar)
,$(bar)
的值是$(ugh)
,$(ugh)
的值是“Huh?”)可见,变量是可以使用后面的变量来定义的。
2.2 “:=”操作符
这种方法可以区别于“=”操作符的是前面的变量不能使用后面的变量,只能使用前面已定义好了的变量;如:
y := $(x) bar
x := foo
那么,y的值是“bar”,而不是“foo bar”。
2.3 “?=”操作符
FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
3、变量的高级用法
3.1 变量值的替换
3.1.1结尾替换
foo := a.o b.o c.o
bar := $(foo:.o=.c)
这个示例中,我们先定义了一个“$(foo)”
变量,而第二行的意思是把“$(foo)”
中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”
的值就是“a.c b.c c.c”。
3.1.2 “静态模式”变量替换
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的值为“a.c b.c c.c”。
3.2 嵌套变量
x = y
y = z
a := $($(x))
在这个例子中,$(x)
的值是“y”,所以$($(x))
就是$(y)
,于是$(a)
的值就是“z”。(注意,是“x=y”,而不是“x=$(y)”)。
4、追加变量值
objects = main.o foo.o bar.o utils.o
objects += another.o
于是,我们的$(objects)值变成:“main.o foo.o bar.o utils.o another.o”(another.o被追加进去了)。
5、总结
此处列举了变量的简单使用,下一次将介绍Makefile的函数使用。谢谢!