变量的高级主题
来源:互联网 发布:椭圆拟合编程 编辑:程序博客网 时间:2024/05/01 04:11
1 变量值的替换
- 使用指定字符(串)替换变量值中的后缀字符(串)
- 语法格式:$(var:a=b)或${var:a=b}
- 替换表达式中不能有任何的空格
- make中支持使用${}对变量进行取值
2 变量的模式替换
- 使用%保留变量值中的指定字符串,替换其它字符
- 语法格式:$(var:a%b=x%y)或$(var:a%b=x%y)
- 替换表达式中不能有任何的空格
- make中支持使用${}对变量进行取值
- 模式匹配失败则不会进行任何更改
3 规则中的模式替换
targets : target-pattern : prereq-pattern
command1
command2
…
- 意义:通过target-pattern从targets中匹配子目标,再通过prereq-pattern从子目标生成依赖,进而构成完整的规则
编程实验:变量值的替换
src1 := a.cc b.cc c.ccobj1 := $(src1:cc=o)test1 : @echo "obj1 => $(obj1)"src2 := a11b.c a22b.c a33b.cobj2 := $(src2:a%b.c=x%y)test2 : @echo "obj2 => $(obj2)"
CC := g++TARGET := hello-makefile.outOBJS := func.o main.o const.o$(TARGET) : $(OBJS) $(CC) -o $@ $^$(OBJS) : %.o : %.c $(CC) -o $@ -c $^.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)clean : $(RM) *.o $(TARGET)
4 变量值的嵌套引用
- 一个变量名之中可以包含对其它变量的引用
- 嵌套引用的本质是使用一个变量表示另外一个变量
5 命令行变量
- 运行make时,在命令行定义变量
- 命令行变量默认覆盖makefile中定义的变量
- 使用命令行传递变量时,变量值中不能包含空格
- 局部变量如果不加override关键字也是能被命令行变量覆盖的
6 override关键字
- 用于指示makefile中定义的变量不能被覆盖
- 变量的定义和赋值都需要使用override关键字
- 在实际测试中发现,定义使用override赋值不适用,则不起作用;定义不使用,赋值使用则会起作用
7 define关键字
- 用于在makefile中定义多行变量
- 多行变量的定义从变量名开始到endef结束
- 可使用override关键字防止变量被覆盖
- define定义的变量等价于使用=定义的变量
编程实验:变量的特殊用法
hm := hello makefileoverride var := override-testdefine fooI'm fool!endefoverride define cmd @echo "run cmd ls ..." @lsendeftest : @echo "hm => $(hm)" @echo "var => $(var)" @echo "foo => $(foo)" ${cmd}
8 环境变量(全局变量)
- makefile中能够直接使用环境变量的值
- 定义了同名变量,环境变量将被覆盖
- 运行make时指定“-e ”选项,优先使用环境变量
- 为什么要在makefile中使用环境变量?
- 优势:环境变量可以在所有makefile中使用
- 劣势:过多的依赖环境变量会导致可移植性降低
- 变量在不同makefile之间的传递方式
- 直接在外部定义环境变量进行传递
- 使用export定义变量进行传递(定义临时环境变量)
- 定义make命令行变量进行传递(推荐)
编程实验:变量的传递
JAVA_HOME := java homeexport var := D.T.Softwarenew := TDelphitest : @echo "JAVA_HOME => $(JAVA_HOME)" @echo "make another file ..." @$(MAKE) -f makefile.2 @$(MAKE) -f makefile.2 new:=$(new)
test: @echo "JAVA_HOME => $(JAVA_HOME)" @echo "var => $(var)" @echo "new => $(new)"
9 目标变量
- 作用于只在指定目标及连带规则中
- target : name <\assignment> value
- override target : name <\assignment> value
10 模式变量
- 模式变量是目标变量的扩展
- 作用于只在负荷模式的目标及连带规则中
- pattern : name <\assignment> value
- override pattern : name <\assignment> value
编程实验:局部变量初探
var := D.T.Softwarenew := TDelphitest : var := test-var%e : override new := test-newtest : another @echo "test :" @echo "var => $(var)" @echo "new => $(new)"another : @echo "another :" @echo "var => $(var)" @echo "new => $(new)"rule : @echo "rule :" @echo "var => $(var)" @echo "new => $(new)"
小结
- 变量值的替换:$(var:a=b)或$(var:a=b)
- 变量的模式替换:$(var:a%b=x%y)或$(var:a%b=x%y)
- makefile支持将模式替换可以直接用于规则中
- makefile中的变量能够嵌套引用
- 命令行中定义的变量能够覆盖makefile中定义的变量
- override用于指示makefile中定义的变量不能被覆盖
- define用于在makefile中定义值为多行的变量
- makefile中三种变量
- 全局变量:makefile外部定义的环境变量
- 文件变量:makefile中定义的变量
- 局部变量:指定目标的变量
修改记录
参考资料
唐老师 — 狄泰软件学院 — 十二月提升计划
阅读全文
0 0
- 变量的高级主题
- 6-变量的高级主题
- 7-变量高级主题2
- struts2的高级主题
- 模板的一些高级主题
- 高级主题
- Python——类的高级主题
- 模板变量的高级使用
- Python变量的高级应用
- HTTPClient六 高级主题
- Spring容器高级主题
- rman高级恢复主题
- c++Primer5,高级主题
- Spring容器高级主题
- git 高级主题
- struts2高级主题
- Spring容器高级主题
- 【Python基础】Python面向对象 - 2 - 类的高级主题
- Log4j2-Log4j 2介绍及使用
- CF Round#381(div2)C 思维+构造
- HDU 2004 成绩转换
- 菜鸟先飞之JAVA_内存分配
- 找出无序数组中的最小的k个数(利用大根堆)
- 变量的高级主题
- LintCode python 小白7-超级丑数
- 逆置/反转单链表+查找单链表的倒数第k个节点,要求只能遍历一次链表
- RTTI的魅力(运行时类型识别 Run-time type Identification)
- RESTAPI设计规则
- java 第四章
- 从键盘输入某个十进制小数或整数,转换成对应的二进制小数并输出。 (查询十进制小数转换成二进制小数的算法,使用循环来实现。 最多保留小数位后7位数字即可)算法
- hdu 2021 发工资咯:)贪心
- 什么是VBI