- 赋值符“=”
"="右边变量的值可能出现在赋值语句之前或者之后 - 赋值符“:=”
":="右边变量的值只能出现在赋值语句之前 - 赋值符“?=”
"?="左边的变量未定义时赋值才会发生 - 变量追加“+=”
追加前会自动添加空格 - 模式规则
至少在规则的目标定义中要包涵“%”,否则就是一般规则
目标中的“%”表示对文件名的匹配,“%”表示长度任意的非空字符串
当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值 - 自动变量
自动化变量就是这种变量会把模式中所
定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该出现在规则的命令中
自动化变量 | 描述 |
---|---|
$@ | 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。 |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合。 |
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖“$^”会去除重复的依赖文件,值保留一份。 |
$+ | 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
$* | 这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模式为 a.%.c,那么“$*”就是 test/a.test。 |
- Makefile 伪目标
当有和目标同名的文件时,规则因为没有依赖文件,所以目标被认为是最新的
使用.PHONY:声明 - 条件判断
ifeq,ifneq,ifdef,ifndef
语法为:
ifeq...endif或者ifeq...else...endif - 函数
不支持自定义函数
用法为$(函数名 参数集合)
subst:用来完成字符串替换
patsubst:用来完成模式字符串替换
dir:用来获取目录
notdir:获取文件名
foreach:循环
wildcard:通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,通配符不会自动展开,这个时候就要用到函数 wildcard