关键词:变量值的替换:$(var:a=b)
或${var:a=b}
、变量的模式替换:$(var:a%b=x%y)
或${var:a%b=x%y}
、变量值的嵌套引用、 命令行变量、override
关键字、define
关键字
1.变量值的替换
- 使用指定字符(串)替换变量值中的后缀字符(串)
-
语法格式:
$(var:a=b)
或${var:a=b}
表达式中不能有任何的空格
make中支持使用${}
对变量进行取值
2. 变量的模式替换
- 使用%保留变量值中的指定字符,替换其它字符
- 语法格式:
$(var:a%b=x%y)
或${var:a%b=x%y}
表达式中不能有任何的空格
make中支持使用${}
对变量进行取值
-
规则中的模式替换
通过target-pattern
从targets
中匹配子目标,再通过prereq-pattern
从子目标生成依赖,进而构成完整的规则 -
规则中模式替换示例
CC := gcc
TARGET := hello.out
OBJS := func.o main.o const.o
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
# 规则中的模式匹配
$(OBJS) : %.o : %.c
$(CC) -o $@ -c $^
.PHONY : clean rebuild all
rebuild : clean all
all : $(TARGET)
clean :
$(RM) *.o $(TARGET)
3. 变量值的嵌套引用
- 一个变量名之中可以包含对其它变量的引用
- 嵌套引用的本质:使用一个变量表示另一个变量
x := y
y := z
a := $($(x))
test1 :
echo "$(a)"
输出结果:
$ make test1
echo "z"
z
4. 命令行变量(一般在测试版本中使用)
- 运行make时,在命令行定义变量
-
命令行变量默认覆盖makefile中定义的变量
hm := hello makefile
test :
echo "hm => $(hm)"
输出结果:
$ make test hm:=cmd
echo "hm => cmd"
hm => cmd
5. override
关键字
- 用于指示makefile中定义的变量不能被覆盖
-
变量的定义和赋值都需要使用
override
关键字
override hm := hello makefile
test :
echo "hm => $(hm)"
输出结果:
$ make test hm:=cmd
echo "hm => hello makefile"
hm => hello makefile
6. define
关键字
- 用于在makefile中定义多行变量
- 多行变量的定义从变量名开始到
endef
结束 - 可以使用
override
关键字防止变量被覆盖 -
define
定义的变量等价于使用=
定义的变量
7. 小结
- 变量值的替换:
$(var:a=b)
或${var:a=b}
- 变量的模式替换:
$(var:a%b=x%y)
或${var:a%b=x%y}
- makefile支持将模式替换可以直接用于规则中
- makefile中的变量值能够嵌套引用
- 命令行中定义的变量能够覆盖makefile中定义的变量
-
override
关键字用于指示makefile中定义的变量不能被覆盖 -
define
关键字用于在makefile中定义多行变量
声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件和《专业嵌入式软件开发》所