Makefile语法¶
命令¶
备注
Makefile 支持 Linux 命令,调用方式跟在 Linux 系统下调用命令的方式基本一致。
@变量¶
备注
正常情况下,make会打印每条命令,然后再执行,这就叫做回声(echoing)
例:
test:
# 这是测试
执行上面的规则,会得到下面的结果:
$ make test
# 这是测试
在命令的前面加上@,就可以关闭回声:
test:
@# 这是测试
通常只在注释和纯显示的echo命令前面加上@:
test:
@# 这是测试
@echo TODO
-变量¶
默认情况下,每条命令执行完 make 就会检查其返回码。如果返回成功(返回码为 0),make 就执行下一条指令;如果返回失败(返回码非 0),make 就会终止当前命令。很多时候,命令出错(比如删除了一个不存在的文件)时,我们并不想终止,这时就可以在命令行前加 - 符号,来让 make 忽略命令的出错,以继续执行下一条命令,比如:
+变量¶
备注
要求 make 执行命令,即使使用了 - n 选项
示例:
all:
@echo aaaa
@+echo bbbb
使用 make 执行的结果为:
$ make
aaaa
bbbb
使用 make -n 执行的结果为:
echo aaaa
echo bbbb
bbbb
变量¶
引用变量时可以通过:
$() 或者 ${} 如: txt = Hello World test: @echo $(txt)
调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义:
test: @echo $$HOME
四个赋值运算符¶
What is the difference between the GNU Makefile variable assignments =, ?=, := and +=?: https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a
=
:
VARIABLE = value
# 在执行时扩展,允许递归扩展
示例:
A = a
B = $(A) b
A = c
备注
最后的值为 c b,而不是 a b。也就是说,在用变量给变量赋值时,右边变量的取值,取的是最终的变量值
:=
:
VARIABLE := value
# 在定义时扩展
示例:
A = a
B = $(A) b
A = c
备注
B 最后的值为 a b。通过 := 的赋值方式,可以避免 = 赋值带来的潜在的不一致。
?=
:
VARIABLE ?= value
# 只有在该变量为空时才设置值
+=
:
VARIABLE += value
# 将值追加到变量的尾端
其他¶
注释(井号(#)在Makefile中表示注释):
# 这是注释
result.txt: source.txt
# 这是注释
cp source.txt result.txt # 这也是注释
通配符:
Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...]
如:
clean:
rm -f *.o
模式匹配:
%.o: %.c
等同于下面的写法:
f1.o: f1.c
f2.o: f2.c
// 使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建