makefile学习之路——变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile学习之路——变量相关的知识,希望对你有一定的参考价值。
在makefile中,支持程序设计语言中变量的概念,所有的变量只代表文本数据。
一、变量的定义和使用
#变量的定义 CC := gcc TARGET := hello.out #变量的使用 $(TARGET) : func.o main.o $(CC) -o $(TARGET) func.o main.o
二、变量的赋值方式
1. 简单赋值 :=
只针对当前语句的变量有效
2. 递归赋值 =
赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影响
3. 条件赋值 ?=
如果变量未定义,使用赋值符号中的值定义变量,如果已定义,赋值无效
4. 追加赋值 +=
原变量值之后加上一个新值,原变量值和新值之间由空格隔开
三、预定义变量
1、自动变量
[email protected] 当前规则中触发命令被执行的目标
$^ 当前规则中的所有依赖
$< 当前规则中的第一个依赖
1.1 自动变量的使用
2、特殊变量
这部分根据需要再去查询make手册
四、变量的高级用法
1、变量值的替换
1.1 使用指定字符替换变量值中的后缀字符
1.2 语法格式:$(var:a=b)或${var:a=b}
2. 变量的模式替换
2.1 使用%保留变量值中的指定字符,替换其他字符
2.2 语法格式: $(var:a=b)或${var:a=b}
3. 测试代码
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)"
4、规则中的模式替换
示例如下:
可以看成下面的代码
func.o main.o : %.o : %.c gcc -o [email protected] -c $^
分别进行匹配过后,就得到了图中的结果
5、变量值的嵌套引用
5.1 一个变量名之中可以包含对其他变量的引用
5.2 嵌套引用的本质是使用一个变量表示另外一个变量
6、命令行变量
6.1 运行make时,在命令行定义变量
6.2 命令行变量默认覆盖makefile中定义的变量
7. override关键字
使用override关键字以后,makefile中定义的变量不会因为make的命令行变量而改变
8、define关键字
定义多行变量时,使用define关键字,同时可以配合override关键字防止变量被覆盖,
define定义的变量等价于使用=定义的变量
9、环境变量
环境变量是操作系统本身的变量,makefile可以直接使用这些变量,但如果在makefile中定义了同名变量,那么将在当前的makefile中覆盖环境变量。运行make时。指定-e选项,可以优先使用环境变量
10、变量在不同makefile之间的传递方式
10.1 直接在外部定义环境变量进行传递
10.2 使用export定义变量进行传递
10.3 定义make命令行变量进行传递
11、目标变量
作用域只在指定目标及连带规则中
var := D.T.Software new := TDelphi test : var := test-var %e : override new := test-new test : another @echo "test :" @echo "var => $(var)" @echo "new => $(new)" another : @echo "another :" @echo "var => $(var)" @echo "new => $(new)"
运行结果如下:
由于another和test存在依赖关系,因此,定义的局部变量也会对another生效
12、模式变量
模式变量是目标变量的扩展,可以根据相应的规则,找到符合规则的目标
以上是关于makefile学习之路——变量的主要内容,如果未能解决你的问题,请参考以下文章