基本组成
1.需要生成的目标文件(target file)
2.生成目标文件的依赖文件(dependencyfile)
3.生成目标文件的编译规则命令行(command)
target file : dependencyfile
command (前面要加一个<Tab>)
编译过程
1.读取Makefile文件
2.查找第一个目标文件,同时也是最终目标
3.把目标文件的依赖文件当作目标文件进行依赖规则检查。
- 1 如果缺少依赖文件,则执行规则命令生产依赖文件(假如缺少a.o,则执行命令cc -c a.c 生成a.o)
- 2 如果存在依赖文件,把其作为目标文件来检查依赖规则(假如a.c比a.o新,则执行命令 cc-c a.c 更新a.o)
- 3 如果目标文件比依赖文件新,则不做处理
4.生成或更新最终目标文件
特性
1.变量
定义方式:
- 1 通过 “=” 实现
a1=$(a2)
a2=a.o
- 2 通过 “:=” 实现
a1:=a.o
a2:=$(a1) b.o 这样a2就是 a.o b.o
- 3 通过 “+=” 实现
a1+=a.o
a2+=$(a1) b.o 这样a2就是 a.o b.o
- 4 通过 “?=” 实现
a1:=a.o
a1?=b.o 如果a1未定义则为新值,否则为原值
使用方式:
obj = a.o b.o
test : $(obj)
cc -o test $(obj)
2.自动推导
默认每一个目标文件都有与之对应的依赖文件,可以自动推导出与目标文件对应的基本编译规则命令,如a.o文件的规则命令为“gcc -c -o a.c”
伪目标
使用make 伪目标
的方式让管理变得简单
-
make all
obj=a.o b.o .PHONY : all all : test $(obj) test : $(obj) cc -o test $(obj)
-
make clean
.PHONY : clean clean : rm -rf test $(obj)
-
make install
test_dir=/home/t_d .PHONY : install install : mkdir $(test_dir) cp test $(test_dir)
-
make uninstall
.PHONY : uninstall uninstall : rm -rf $(test_dir)
3.文件查找
(1)VPATH:Make在当前路径找不到源文件的情况下,会在制定路径中寻找
VPATH = 目录 : 目录
VPATH = /a : /b
(2)vpath:vpath 是 关键字,VPATH 是路径
vpath 模式 目录 : 目录
vpath %.c /a : /b
4.嵌套执行
Make会先读根目录的Makefile,再去读各个子目录的Makefile
cd 子目录 && $(MAKE)
或
$(MAKE) -c 子目录
5.条件判断
(1)ifeq(参数1,参数2)
else
(2)ifneq(参数1,参数2)
else
(3)ifdef(参数1)
else
(4)ifndef(参数)
else
6.函数
$(函数名 参数,参数...)
(1)$(subset 参数1,参数2,参数3)
用参数2代替参数3中的参数1
$(patsubst 模式参数,参数1,参数2)
把参数二中符合模式参数的字符串替换成参数1
(2)$(foreach 变量参数,参数1,表达式)
循环取出参数1中的字符串赋给变量参数
例: a:=x y z
$(foreach b, $(a), $(b).c)
result: x.c y.c z.c
(3)$(wildcard 模式参数)
打印出所有符合的文件名
(4)$(strip 参数)
去掉参数开头结尾的空格
(5)$(findstring 参数1,参数2)
在参数2中找到参数1,找到返回1
(6)$(fliter 模式参数, 参数1)
筛选出符合模式参数的字符串
(7)$(addsuffix 参数1,参数2)
在每个参数2后面加上参数1
$(addprefix 参数1,参数2)
在每个参数2前面加上参数1
(8)$(call 变量参数,参数....)
把参数依次赋给变量参数
例: a := $(2) $(1)
result := $(call $(a) , x y)
(9)$(if 条件参数 , 执行参数)
$(if 条件参数 , 执行参数1,执行参数2)
(10)$(dir 参数)
从参数中取出路径部分
(11)$(error 参数)
停止Make 打印error
$(warning 参数)
打印warning