嵌入式课堂4拓展知识

Makefile代码分析
一、scripts目录头文件Makefile
在这里插入图片描述
1.变量定义:
(1)通过“=”来实现
例如:a1= $(a2)
a2= $(a3)
a3= a.o
这种方式下变量a1的值是a.o,也就是说前面的变量可以通过后面的变量来定义。但使用这种方式定义变量时,要防止出现死循环的情况。图中用Libs代替-lpthread(-l用来链接库)
(2)通过“:=”来实现
例如:a1:= a.o
a2:= $(a1) b.o
这种方式下变量a1的值是a.o,变量a2的值是a.o b.o。图片中用CC代替gcc,用CFLAGS代替-Wall(开警告) -o3(三级优化),用Target代替client(客户端)。
(3)通过“+=”来实现
例如:a1= a.o
a1+= b.o
这种方式下变量a1的值是“a.o b.o”。也就是说“+=”可以实现给变量追加值。等同于示例:
a1= a.o
a1:= $(a1) b.o 可以看到,Makefile的“+=”和C语言中的“+=”是非常相似的。
代码中变量Modules指当前软件代码所有的功能目录check_putin pack_message main
2、函数
(1)函数wildcard
格式: $(wildcard 模式参数)
功能:列出当前目录下所有符合格式参数的文件名。
返回值:当前目录下所有符合模式参数的文件名。
例如:result := $(wildcard .c)
result的值为当前目录下所有的C文件名。图中代码 Source := ( w i l d c a r d s r c / . c ) s r c . c S o u r c e = s r c / m a i n . c s r c / a d d . c ( 2 ) p a t s u b s t (wildcard src/*.c)指的是列出当前目录下src目录的所有.c文件,Source=src/main.c src/add.c (2)函数patsubst 格式: (patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1.
返回值:被替换后的参数2.
例如:result := $(patsubst %.c, %.o, x.c y.c)
result的值为“x.o y.o”。图中代码 Objs := ( p a t s u b s t (patsubst %.c,%.o, (Source))是将Source里的.c文件编译成.o文件,Objs=src/main.o src/add.o
(3)函数addsuffix
格式:$(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1.
返回值:加上后缀的所有单词.
例如:result := $(addsuffix .c, x y)
result的值为“x.c y.c”。如图所示代码AllObjs := ( a d d s u f f i x / s r c / . o , (addsuffix /src/*.o, (Modules)) #Objs=check_putin/src/
.o pack_message/src/.o main/src/.o
二、总控Makefile
在这里插入图片描述
第一行代码:导入Makefile,可以使用该Makefile定义的变量
第二行代码:进入 ( 1 ) m a k e 1 a l l ( 使 m a k e ) a l l m a k e a l l M a k e a l l M a k e a l l t e s t a . o b . o T a r g e t 2 f o r e a c h (1)所对应的目录,执行make命令。 1、伪目标all(伪目标使用方式: make 伪目标名) all运行命令“make all”后,Make会把all看成是最终的目标。由于伪目标和真实目标一样都有依赖文件,所以Make会更新all的依赖文件test、a.o和b.o。上图指更新Target 2、函数foreach 格式: (foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式。
返回值:表达式的运行结果
例如:a:= x y z
result := $(foreach b, $(a), ( b ) . c r e s u l t x . c y . c z . c b m m m a k e 3 c a l l (b).c result的值为“x.c y.c z.c”。注意,b在这里是一个临时的变量。mm那行:进入各个功能目录执行make命令。 3、函数call 格式: (call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的 ( 1 ) (1)、 (2)…
返回值:赋值后的变量值
例如:a:= $(2) $(1)
result := $(call $(a), x y)
result的值为“yx”。mc那行:进入各个功能目录执行make_clean命令。
三、功能目录Makefile
在这里插入图片描述
check_putin、pack_message、main中的Makefile代码都如上图所示
都是更新变量Obj

发布了10 篇原创文章 · 获赞 1 · 访问量 253

猜你喜欢

转载自blog.csdn.net/Noth_to_lose/article/details/105065127