共计 3869 个字符,预计需要花费 10 分钟才能阅读完成。
陆 – 变量的高级主题(上)
变量值的替换
- 应用指定字符 (串) 替换变量值中的后缀字符(串)
-
语法格局:$(var:a=b) 或者 $(var:a=b)
- 替换表达式中不能有任何的空格
- make 中反对应用 ${} 对变量进行取值
src := a.cc b.cc c.cc | |
obj := $(src:cc=o) // 变量值的替换 a.o b.o c.o | |
test : | |
@echo "obj => $(obj)" |
变量的模式替换
- 应用 % 保留变量值中的指定字符串,替换其余字符
-
语法格局:$(var:a%b=x%y)或 %{var:a%b=x%y}
- 替换表达式中不能有任何的空格
- make 中反对应用 ${} 对变量进行取值
src := a1b.c a2b.c a3b.c | |
obj := $(src:a%b.c==x%y) // a1b.c ==>> x1y | |
test: | |
@echo "obj => $(obj)" |
.PHONY : test1 test2 | |
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)" |
obj1 => a.o b.o c.o | |
obj2 => x11y x22y x33y |
规定中的模式替换
targets : target-pattern : prereq-pattern | |
command1 | |
command2 | |
...... |
意义:
通过 target-pattern 从 targets 中匹配指标,在通过 prereq-pattern 从子目标生成依赖,进而形成残缺的规定
规定中的模式替换示例
% 认为是通配符 | |
OBJ := func.o main.o | |
$(OBJS) : %.o : %.c // func.o : %.c ==>> func.o : func.c | |
gcc -o $@ -c $^ |
// 等效 | |
func.o : func.c | |
gcc -o $@ -c $^ | |
main.o : main.c | |
gcc -o $@ -c $^ |
编程试验:模式规定匹配的利用
// 源文件 | |
CC := g++ | |
TARGET := hello-world.out | |
$(TARGET) : func.o main.o | |
$(CC) -o $@ $^ | |
func.o : func.c | |
$(CC) -o $@ -c $^ | |
main.o : main.c | |
$(CC) -o $@ -c $^ | |
.PHONY : rebuild clean all | |
rebuild : clean all | |
all : $(TARGET) | |
clean : | |
$(RM) *.o $(TARGET) |
进行模式匹配批改
CC := g++ | |
TARGET := hello-world.out | |
OBJS := func.o main.o const.o | |
$(TARGET) : $(OBJS) | |
$(CC) -o $@ $^ | |
$(OBJS) : %.o : %.c | |
$(CC) -o $@ -c $^ | |
.PHONY : rebuild clean all | |
rebuild : clean all | |
all : $(TARGET) | |
clean : | |
$(RM) *.o $(TARGET) |
这里的益处就是只须要在 OBJS 增加新减少的 文件就间接能编译了
变量值的嵌套援用
- 一个变量名之中能够蕴含对其余变量的援用
- 嵌套援用的实质是应用一个变量示意另外 一个变量
x := y | |
y := z | |
a := $($(x)) | |
// 等效 | |
a := $(y) | |
// 等效 | |
a :=z |
$() 是取变量的值!!
命令行变量
- 运行 make 时,在命令行定义变量
- 命令行变量默认笼罩 makefile 中定义的变量
hm := hello makefile | |
test : | |
@echo "hm => $(hm)" | |
// make | |
make hm=cmd | |
// 等效 | |
hm =>cmd |
以命令行变量为准,理论开发中的用处长期编译,扭转编译形式
override 关键字
- 用于批示 makefile 重够定义的变量不能被笼罩
- 变量的定义和赋值都须要应用 override 关键字
- 避免命令行笼罩
override var := test | |
test : | |
@echo "var => $(var)" | |
// meke | |
make var=cmd | |
// 后果 | |
hm =>test |
编程试验
hm := hello makefile | |
override var := override-test | |
test : | |
@echo "hm => $(hm)" | |
@echo "var => $(var)" | |
@echo "foo => $(foo)" |
// 命令行定义变量笼罩原来的变量,笼罩胜利 | |
// 命令行定义变量笼罩原来的变量,笼罩失败,因为 override | |
// 命令行能够长期赋值比方 foo | |
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make hm=test var=hello foo=foo | |
hm => test | |
var => override-test | |
foo => foo |
define 关键字
- 用于在 makefile 中定义多行变量
- 多行变量的定义从变量名开始到 endef 完结
- 可应用 overrride 关键字避免变量被笼罩
- define 定义的变量 等价于应用 = 定义的变量
define foo | |
I'm fool! | |
endef | |
override define cmd | |
@echo "run cmd ls ..." | |
@ls | |
endef |
编程试验 3.1
hm := hello makefile | |
override var := override-test | |
test : | |
@echo "hm => $(hm)" | |
@echo "var => $(var)" | |
@echo "foo =>$(foo)" |
输入试验 1
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make | |
hm => hello makefile | |
var => override-test | |
foo => |
输入试验 2
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make hm:=hm-cmd var:=var-test | |
hm => hm-cmd | |
var => override-test | |
foo => |
命令行能够笼罩值,除了 override 润饰的变量
输入试验 3
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make foo:=foo | |
hm => hello makefile | |
var => override-test | |
foo =>foo |
命令行定义没有定义的变量,切命令行也反对不同的赋值形式
编程试验 3.2
define cmd | |
@echo "run cmd ls ......." | |
@ls | |
endef | |
test : | |
$(cmd) |
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make | |
run cmd ls ....... | |
~ 51-1.c config DT_timer.c fun.c hello-world.out makefile nginx5_3_1_server.c program.c | |
50-2.c 51-1.h const.c DT_timer.h func.c main.c nginx nginx5_3_2_server.c test.c | |
50-2.h chap-23 const.o dup.c func.o main.o nginx-1.14.2.tar.gz nginx.c test.cpp |
cmd 这个变量是多行变量,所以须要 define
编程试验 3.3
hm := hello makefile | |
override var := override-test | |
define foo | |
i'm foo | |
endef | |
# cmd 这个变量是多行变量,所以须要 define | |
override define cmd | |
@echo "run cmd ls ......" | |
@ls | |
endef | |
test : | |
@echo "hm => $(hm)" | |
@echo "var => $(var)" | |
@echo "foo => $(foo)" | |
$(cmd) |
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make | |
hm => hello makefile | |
var => override-test | |
foo => i'm foo | |
run cmd ls ...... | |
~ 51-1.c config DT_timer.c fun.c hello-world.out makefile nginx5_3_1_server.c program.c | |
50-2.c 51-1.h const.c DT_timer.h func.c main.c nginx nginx5_3_2_server.c test.c | |
50-2.h chap-23 const.o dup.c func.o main.o nginx-1.14.2.tar.gz nginx.c test.cpp | |
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make foo=cmd-foo | |
hm => hello makefile | |
var => override-test | |
foo => cmd-foo | |
run cmd ls ...... | |
~ 51-1.c config DT_timer.c fun.c hello-world.out makefile nginx5_3_1_server.c program.c | |
50-2.c 51-1.h const.c DT_timer.h func.c main.c nginx nginx5_3_2_server.c test.c | |
50-2.h chap-23 const.o dup.c func.o main.o nginx-1.14.2.tar.gz nginx.c test.cpp |
这里 foo 的值和下面不一样的起因是 foo 的在命令行递归赋值了
小结
- 变量值的替换:$(var:a=b) 或者 ${var:a=b}
- 变量的模式替换 : $(var:a%b=x%y) 或者 ${var:a%b=x%y}
- makefile 反对将模式替换能够间接用于规定中
正文完