(以下内容为“陈皓 跟我一起写Makefile(pdf重制版)”整理复制)
-
变量的基础
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或 是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
-
变量中的变量
- 简单的使用 = 号,在 = 左侧是变量,右侧是变量的值,右侧变量的值可以 定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。 但是如果是递归定义:A = $(A) -o 就会让make 陷入无限的变量展开过程中。
- :=操作符也可以。前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。
x := foo y := $(x) bar x := later 等价 y := foo bar x := later
3. ?=操作符含义是:(FOO ?=bar) 如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义过, 那么这条语将什么也不做。
-
变量高级用法
1.变量值的替换
意思是把变量“var”中所有以‘a’字串结尾的替换成‘b'字串
eg1: $(var:a=b) 或 ${var:a=b}
eg2: foo := a.o b.o c.o
bar :=$(foo:.o=.c)
还可以“静态模式”定义:这依赖于被替换字串中的有相同的模式,模式中必须包含一个 % 字符,这个例子同样让 $(bar) 变 量的值为“a.c b.c c.c”。
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
2.把变量的值再当成变量
eg1 : x = $(y)
y = z
z = Hello
a := $($(x))
eg2 : first_second = Hello
a = first
b = second
all = $($a_$b)
-
追加变量值
使用 += 操作符给变量追加值 :
$(objects) 值变成:“main.o foo.o bar.o utils.o another.o”(another.o 被追加进去了)
objects = main.o foo.o bar.o utils.o
objects += another.o
-
override指示符
如果有变量是通常 make 的命令行参数设置的,那么 Makefile 中对这个变量的赋值会被忽略。如果 你想在 Makefile 中设置这类参数的值,那么,你可以使用“override”指示符。
override <variable>; = <value>;
override <variable>; := <value>;
override <variable>; += <more text>;
-
多行变量
使用 define 关键字设置变量的值可以有换行,这有利于定义一系列的命令。define 指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以 endef 关键字结束。
-
目标变量
在这个示例中,不管全局的 $(CFLAGS) 的值是什么,在 prog 目标,以及其所引发的所有规则中 (prog.o foo.o bar.o 的规则),$(CFLAGS) 的值都是 -g
prog : CFLAGS = -g
prog : prog.o foo.o bar.o
$(CC) $(CFLAGS) prog.o foo.o bar.o
prog.o : prog.c
$(CC) $(CFLAGS) prog.c
foo.o : foo.c
$(CC) $(CFLAGS) foo.c
bar.o : bar.c
$(CC) $(CFLAGS) bar.c
-
模式变量
在 GNU 的 make 中,还支持模式变量。模式变量的好处就是,我们可以给定一种“模式”,可以把变量定义在符合这种模式的所有目标上。 我们知道,make 的“模式”一般是至少含有一个 % 的,所以,我们可以以如下方式给所有以 .o 结 尾的目标定义目标变量:
%.o : CFLAGS = -O
同样,模式变量的语法和“目标变量”一样:
<pattern ...>; : <variable-assignment>;
<pattern ...>; : override <variable-assignment>;