06- 变量的高级主题(上)

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-patterntargets 中匹配子目标;再通过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 中定义值为多行的变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值