变量的高级主题(上)
变量值的替换
- 使用指定字符(串)替换变量值中的后缀字符(串)
- 语法格式:$ (var:a=b)或$ {var:a=b}
- 替换表达式中不能有任何空格
- make中支持使用${}对变量进行取值
src := a.cc b.cc c.cc
obj := $(src:cc=o)
test:
@echo "obj => $(obj)"
规则中的模式替换
targets : target-pattern : prereq-pattern
command1
command2
.....
意义:
- 通过target-patttern从targets中匹配子目标;再通过prereq-pattern从子目标生成依赖;进而构成完整的规则;
规则中的模式替换示例
OBJS := func.o main.o
$(OBJS) : %.o : %.c
gcc -o $@ -c $^
#上面等同于下面的语句
func.o : func.c
gcc -o $@ -c $^
main.o : main.c
gcc -o $@ -c $^
编程实验:变量值的替换
src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)
test1 :
@echo "obj1 => $(obj1)"
src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)
test2:
@echo "obj2 => $(obj2)"
实验截图:
变量值的嵌套引用
- 一个变量名之中可以包含对其他变量的引用
- 嵌套引用的本质是使用一个变量表示另外一个变量
x := y
y := z
a := $($(x)) # => a := $(y) => a := z
命令行变量
- 运行make时,在命令行定义变量
- 命令行变量默认覆盖makefile中定义的变量
hm := hello makefile
test:
@echo "hm => $(hm)" # make hm = cmd 输出 => hm => cmd
override关键字
- 用于指示makefile中定义的变量不能被覆盖
- 变量的定义和赋值都需要使用override关键字
override var := test
test:
@echo "var => $(var)" # 用cmd给var赋值,输出依然时test;
# make var = cmd => var => test
define关键字
- 用于在makefile中定义多行变量
- 多行变量的定义从变量名开始到endef结束
- 可使用override关键字防止变量被覆盖
- define定义的变量等价于使用=定义的变量
# 写法一
define foo
I'm fool!
endef
# 写法二
override defind cmd
@echo "run cmd ls ...."
@ls
endef
编程实验:变量的特殊用法
hm := hello makefile
override var := override-test
define foo
I'm fool!
endef
override define cmd
@echo "run cmd ls ..."
@ls
endef
test :
@echo "hm => $(hm)"
@echo "var => $(var)"
@echo "foo => $(foo)"
${cmd}
实验截图:
小结:
参考资料:
狄泰软件教学课件