Makefile代码分析
一、scripts目录头文件Makefile
嵌入式课堂4拓展知识
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 := (wildcardsrc/.c)src.cSource=src/main.csrc/add.c(2)patsubst(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 := (patsubst(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 := (addsuffix/src/.o,(addsuffix /src/*.o,(Modules)) #Objs=check_putin/src/
.o pack_message/src/.o main/src/.o
二、总控Makefile
嵌入式课堂4拓展知识
第一行代码:导入Makefile,可以使用该Makefile定义的变量
第二行代码:进入(1)make1all(使make)allmakeallMakeallMakealltesta.ob.oTarget2foreach(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).cresultx.cy.cz.cbmmmake3call(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
嵌入式课堂4拓展知识
check_putin、pack_message、main中的Makefile代码都如上图所示
都是更新变量Obj

相关文章: