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 :=
(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1.
返回值:被替换后的参数2.
例如:result := $(patsubst %.c, %.o, x.c y.c)
result的值为“x.o y.o”。图中代码 Objs :=
(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 :=
(Modules)) #Objs=check_putin/src/.o pack_message/src/.o main/src/.o
二、总控Makefile
第一行代码:导入Makefile,可以使用该Makefile定义的变量
第二行代码:进入
(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式。
返回值:表达式的运行结果
例如:a:= x y z
result := $(foreach b, $(a),
(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的
(2)…
返回值:赋值后的变量值
例如:a:= $(2) $(1)
result := $(call $(a), x y)
result的值为“yx”。mc那行:进入各个功能目录执行make_clean命令。
三、功能目录Makefile
check_putin、pack_message、main中的Makefile代码都如上图所示
都是更新变量Obj
嵌入式课堂4拓展知识
猜你喜欢
转载自blog.csdn.net/Noth_to_lose/article/details/105065127
今日推荐
周排行