Makefile 自动变量&字符替换
一、自动变量:
$*:
不包括后缀名的当前依赖文件的名称这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。
$+
所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
第一个依赖文件的名称,如果依赖目标是以模式(即“%” )定义的,那么“$<”将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有时间戳比目标文件晚的依赖文件,并以空格分开
$@
目标文件的完整名称(目标集合)在模式规则中,如果有多个目标,那么“$@”就是匹配于目标中模式定义的集合。注意其目标是一个一个取出来的。
$^
所有不重复的目标依赖文件,以空格分开(区分$+)
-:
告诉make命令忽略所有的错误
@:
告诉make在执行命令前不要将命令显示在标准输出上
二、makefile 中的字符替换
1、字符替换
使用指定字符串替换变量中的后缀字符(串)格式:$(var:a=b)或${var:a=b} 注意:替换表达式中不能有空格
例如:
src := acc bcc ccc obj := $(src:cc=o)
最后obj = ao bo co
2、模式字符串替换
使用%保留变量值中的指定字符串,其他部分替换为新字符
格式:$(var:a%b=x%y)或${var:a%b=x%y} 注意:替换表达式中不能有空格
例如:
src := a123b.c a234b.c ajkhb.c
obj := $(src:a%b.c=x%y)
最后 x123y.c x234y.c xjkhy.c
3、规则中的模式替换
targets:target-pattern:prereq-pattern
command1
command2
作用:通过target-pattern(目标模式)从targets中匹配子目标,再通过prereq-pattern从子目标生成依赖,进而构成完整规则。
例:
objs := func.o main.o $(objs): %.o : %.c gcc -o $@ -c $^
分析:
上述第二行,通过%.o匹配objs中的func.o,通过func.c生成依赖,再匹配main.o生成main.c依赖。
上述第二行会被make程序解析成
func.o: func.c gcc -o $@ -c $^ main.o: main.c gcc -o $@ -c $^
4、Makefile一般编写规则
- 先定义一个目标文件名变量
- 然后就是 目标文件的保存目录编写
- 然后是源文件的变量定义包括C文件和汇编文件
- 再然后定义交叉编译工具链,编译选项(选项 include目录 连接脚本 )