变量的高级主题

来源:互联网 发布:椭圆拟合编程 编辑:程序博客网 时间: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中定义的变量
    • 局部变量:指定目标的变量

修改记录


时间 动作 2017.7.15 首次上传

参考资料


唐老师 — 狄泰软件学院 — 十二月提升计划