Makefile规则
1 | target:prerequisites #目标:依赖的文件或者其他目标 |
Makefile变量、模式匹配
变量
系统变量
1
2
3
4
5
6
7
8
9
10
11
12
all:
echo "$(CC)"
echo "$(AS)"
echo "$(MAKE)"
#输出结果
#echo "cc"
#cc
#echo "as"
#as
#echo "make"
#make
自定义变量
=,延迟赋值(引用此变量的时候才赋值)
1
2
3
4
5
6
7
8A=123
B=$(A)
A=456
all:
echo "$(B)"
#输出结果
#456
:=,立即赋值
1
2
3
4
5
6
7
8A=123
B:=$(A)
A=456
all:
echo "$(B)"
#输出结果
#123?=,空赋值(变量为空的时候才有效)
1
2
3
4
5
6
7
8A?=123
#B:=$(A)
A?=456
all:
echo "$(A)"
#输出结果
#123+=,追加赋值(不会改变变量的值)
1
2
3
4
5
6
7
8A?=123
#B:=$(A)
A+=456
all:
echo "$(A)"
#输出结果
#123 456
自动化变量
$<,第一个依赖文件
$^,全部的依赖文件
$@,目标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16all:targeta targetb
echo "$<"
echo "$^"
echo "$@"
targeta:
targetb:
#输出结果
#echo "targeta"
#targeta
#echo "targeta targetb"
#targeta targetb
#echo "all"
#all
模式匹配
%,匹配任意多个非空字符
类似于shell的*通配符
1 | %: |
默认规则
.o文件默认使用.c文件编译
Makefile条件分支
1 | ifeq(var1,var2) |
1 | ifneq(var1,var2) |
Makefile常用函数
patsubst
模式替换函数
1 |
|
把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果 是“x.c.o bar.o”
notdir
取文件名函数
1 |
|
返回值为:“foo.c hacks”
wildcard
获取匹配模式文件名函数
1 |
|
返回值为当前目录下所有.c 源文件列表
foreach
函数“foreach”不同于其它函数。它是一个循环函数。类似于 Linux 的 shell 中的 for 语句
1 | dirs := a b c d |
把文件夹里边的文件全部找出来
Makefile解决头文件依赖
- 写一个头文件,并把头文件添加到编译器的头文件的路径
- 实时检查头文件的更新情况,一旦头文件发生变化,应该重新编译所有相关文件
较为完善的Makefile
1 | ARCH?=x86 |