使用变量
定义变量的一般形式:
变量名 赋值符 变量值
变量名:由字母、数字和下划线组成
赋值符:主要有=、:=、+=、?= 不同的赋值符有不同的意义
变量值:文本字符串
在含有变量的 makefile 中,make 执行是吧变量名出现的地方用对应的变量值来替换。makefile中的变量类型类似于C语言中的宏。makefile中的变量是区分大小写的,也就是说比那辆"varl" 和 “Varl” 是两个不同的变量。
有些变量是系统预定好的,如:
?、$<、#*等
1. 引用变量
格式:$(变量名) 或
变量名”
如果要使用字符 "
$"表示。
2. 定义变量
makefile 中,有两种类型的变量:
①递归展开变量:通过“=”赋值的变量。
②立即展开变量:通过“:=”复制的变量。
例 递归展开变量:
foo = $(bar)
bar = $(ugh)
ugh = Huh
all:
echo $(foo)
运行:
$ make
echo Huh
Huh
整个的替换过程是在执行:echo $(foo) 时完成的。
这种定义方法的好处:在变量为定义时就可以使用该变量。
缺点:可能造成死循环。如:CFLAGS = $(CFLAGS) -O
立即展开变量 例:
x := foo
y := $(x) bar
x := later
这种类型的变量在定义是立即展开,而不是在引用时才展开。
③条件赋值”?=”:只有此变量在之前没有赋值的情况下才会对变量进行赋值。
FOO ?= bar
变量赋值:
objects = main.o foo.o bar.o utils.o
该语句定义了一个变量 objects ,其值为一个 .o 列表。
一个变量在定义之后,可以对其值进行追加,这是非常有用的。在 makefile 中使用“+=”(追加赋值符)来实现对一个变量的追加操作。
onjects += another.o
3. 预定义变量
在 makefile 中有许多预定义变量,可以直接使用。在隐含规则中通常会使用预定义变量。
makefile 中还预定义了一组变量,它们的值在 make 运行过程中可以动态改变,是隐含规则所必须的变量,称为自动变量。
常用的自动变量:
%、$<。