Makefile示例——client
一、scripts/Makefile
变量的使用方式:$(变量名)
1.定义变量
1)通过“=”实现
例如:
a1= $(a2)
a2= $(a3)
a3= a.o
此时变量a1的值是a.o,也就是说前面的变量可以通过后面的变量来定义。
但使用这种方式定义变量时,要防止出现死循环的情况。
2)通过“:=”实现
例如:
a1:= a.o
a2:= $(a1) b.o
此时变量a1的值是a.o,变量a2的值是a.o b.o。
a1:= $(a2) b.o
a2:= a.o
此时变量a1的值是b.o,而不是“a.o b.o”。
也就是说前面的变量不能通过后面的变量来定义。
3)通过“+=”实现——与C语言中+=功能一样
例如:
a1= a.o
a1+= b.o
这种方式下变量a1的值是“a.o b.o”。也就是说“+=”可以实现给变量追加值。等同于如下示例:
a1= a.o
a1:= $(a1) b.o
4)通过"?="实现 ——防止重复定义
例如:
a1:= a.o
a1?=b.o
此时变量a1的值是a.o,而不是b.o。也就是说,如果变量a1已经在前面定义过了,那么后面的定义就无效了。
2.函数
格式:$(函数名 参数,参数…)
1)wildcard
格式:$(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名
返回值:当前目录下所有符合模式参数的文件名
Sourse:=$(wildcard src/*.c)#列出当前目录下src目录的所有.c文件
2)patsubst
格式:$(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
Objs:=$(patsubst %.c,%.o,%(Sourse))#将Sourse变量里的.c文件编译成.o文件
3)addsuffix
格式:$(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
Modules+=check_putin pack_message main#当前软件代码所有的功能目录
AllObjs:=$ (addsuffix /src/*.o,$(Modules))
#AllObjs:=check_putin /src/.o pack_message /src/.o main /src/*.o
#AllObjs:列出所有功能目录下的src目录下的.o文件
二、总控的Makefile
include scripts/Makefile#导入Makefile,可以使用该Makefile的定义的变量
4)foreach
格式:$(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式
返回值:表达式的运行结果
5)call
格式:
(
c
a
l
l
变
量
参
数
,
参
数
…
)
功
能
:
循
环
把
参
数
依
次
赋
给
变
量
参
数
中
的
(call 变量参数,参数…) 功能:循环把参数依次赋给变量参数中的
(call变量参数,参数…)功能:循环把参数依次赋给变量参数中的(1)、$(2)…
返回值:赋值后的变量值
mm:
@ $ (foreach n,$ (Modules),$ (call modules_make,$(n)))
#进入各个子目录执行make命令
mc:
@ $ (foreach n,$ (Modules),$ (call modules_clean,$(n)))
#进入各个功能目录执行make clean命令
三、功能目录下
总结:
(1)总控Makefile:进入各个功能目录执行make命令,并将所有.o文件链接生成可执行文件
(2)功能目录Makefile:将功能目录下的源文件编译生成目标文件.o。
(3)Scripts目录头文件Makefile:定义变量,供其他makefile使用。