1. 变量的后缀替换
- 使用指定字符串替换变量值中的后缀字符串
- 语法格式
$(var:a=b)
或${var:a=b}
,替换表达式中不能有任何空格 - make 中支持使用
${}
对变量进行取值
src := a.c b.c c.c
obj := $(src:c=o)
test :
@echo "obj => $(obj)"
执行 make test 结果:
2. 变量的模式替换
-
使用
%
保留变量值中的指定字符,替换其它字符 -
语法格式
$(var:a%b=x%y)
或${var:a%b=x%y}
,替换表达式中不能有任何空格src := a1b a2b a3b obj := $(src:a%b=x%y) # 等价于 obj := $(src:a*b=x*y) test : @echo "obj => $(obj)"
执行 make test 结果:
3. 规则中的模式替换
意义:通过 target-pattern
从 targets
中匹配子目标;再通过prereq-pattern
从子目标生成依赖;进而构成完整的规则
4. 变量值的嵌套引用
- 一个变量名之中可以包含对其它变量的引用
- 嵌套引用的本质是使用一个变量表示另外一个变量
5. 命令行变量
- 运行 make 时,在命令行定义变量
- 命令行变量默认覆盖 makefile 中定义的变量,除非这个变量被 override 关键字修饰
6. define 关键字
- 用于在 makefile 中定义多行变量
- 多行变量的定义从变量名开始到 endef 结束
- 可使用 override 关键字防止变量被覆盖
- define 定义的变狼等价于使用 = 定义的变量
define cl
I'm cool!
endef
define cmd
@echo "run cmd is ..." # 使用的命令必须前面必须有tab键
@ls
endef
test :
@echo "cl => $(cl)"
$(cmd)
执行 make test 结果:
7. override关键字
- 用于指示 makefile 中定义的变量不能被覆盖
- 变量的定义和赋值都需要使用 override 关键字
v1 := v1
override v2 := v2
define dv1
dv1
endef
override define dv2
dv2
endef
test :
@echo "v1 => $(v1)"
@echo "v2 => $(v2)"
@echo "v1 => $(dv1)"
@echo "v2 => $(dv2)"
执行 make v1:=v1_test v2:=v2_test dv1:=dv1_test dv2:=dv2_test 结果:
8. 总结
- 变量值的替换
$(var:a=b)
或${var:a=b}
- 变量模式的替换
$(var:a%b=x%y)
或${var:a%b=x%y}
- makefile 支持将模式替换用于规则中
- makefile 中的变量值能够嵌套引用
- 命令行中定义的变量能覆盖 makefile 中定义的变量
- override 用于指示 makefile 中定义的变量不能被覆盖
- define 用于在 makefile 中定义值为多行的变量