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 格式:
(wildcardsrc/∗.c)指的是列出当前目录下src目录的所有.c文件,Source=src/main.csrc/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,
(patsubst(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,
(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 格式:
(1)所对应的目录,执行make命令。1、伪目标all(伪目标使用方式:make伪目标名)all运行命令“makeall”后,Make会把all看成是最终的目标。由于伪目标和真实目标一样都有依赖文件,所以Make会更新all的依赖文件test、a.o和b.o。上图指更新Target2、函数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 格式:
(b).cresult的值为“x.cy.cz.c”。注意,b在这里是一个临时的变量。mm那行:进入各个功能目录执行make命令。3、函数call格式:(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的
(
1
)
、
(1)、
(1)、(2)…
返回值:赋值后的变量值
例如:a:= $(2) $(1)
result := $(call $(a), x y)
result的值为“yx”。mc那行:进入各个功能目录执行make_clean命令。
三、功能目录Makefile
check_putin、pack_message、main中的Makefile代码都如上图所示
都是更新变量Obj
嵌入式课堂4拓展知识
最新推荐文章于 2022-09-20 19:06:08 发布