Makefile学习之路(3) — Makefile的函数
一、前言
Makefile 提供了大量的函数,这些函数都是make本身实现的,函数调用的格式如下:
$(function argument1, argument2, argument3)
这里function
是函数名, argument
是该函数的参数。参数和函数名之间是用空格或 Tab 隔开,如果有多个参数,它们之间用逗号隔开。这些空格和逗号不是参数值的一部分。
二、wildcard函数
函数wildcard
语法如下
$(wildcard pattern)
用于查找pattern
指定的【目录+文件名】格式的文件,若不写目录则默认为当前目录,可以有多种格式,用空格隔开即可,然后将这些【目录+文件名】用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = $(wildcard dir/*.c dir/*.o)
all:
@echo A = $(A)
执行后如下所示,
三、patsubst函数
函数 patsubst 语法如下:
$(patsubst pattern,replacement,text)
对于text
中每一个用空格隔开的值,将取出后,如果这个符合pattern
的格式,就把它替换成 replacement
格式,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a.c b.c c.bin d.c e.c abc
B = $(patsubst %.c,%.o,$(A))
all:
@echo B = $(B)
执行后如下所示,
四、字符串替换和分析函数
1、subst函数
函数 patsubst 语法如下:
$(subst from,to,text)
对于text
字符串中每一个from
字符(串),替换为to
字符(串),然后作为函数的返回值;
编写如下Makefile:
A = a.c b.c c.bin d.c e.c abc
B = $(subst c,o, $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
2、patsubst函数
前面讲过
3、strip 函数
函数strip 语法如下
$(strip string)
去掉string
中前导和结尾的空格,并将中间的多个空格压缩为单个空格。
编写如下Makefile:
A = " a.c b.c c.bin d.c e.c abc"
B = $(strip $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
4、findstring函数
函数findstring语法如下
$(findstring find,in)
在字符串in
中搜寻find
字符(串),如果找到,则返回find
字符(串),否则返回值为空。
编写如下Makefile:
A = a.c b.c c.bin d.c e.c abc
B = $(findstring c.bin, $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
5、filter函数
函数filter语法如下:
$(filter pattern1 pattern2 pattern3, text)
对于text
中每一个用空格隔开的值,依次取出后,找到符合格式pattern
格式(可以有多种格式,用空格隔开)的值,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a.c b.o c.s d/ e.bin
B = $(filter %.s %/ %.c, $(A))
all:
@echo B = $(B)
执行后如下所示,
6、filter-out函数
函数filter-out则与filter相反,语法如下
$(filter-out pattern1 pattern2 pattern3, text)
对于text
中每一个用空格隔开的值,依次取出后,找到不符合格式pattern
格式(可以有多种格式,用空格隔开)的值,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a.c b.o c.s d/ e.bin
B = $(filter-out %.s %/ %.c, $(A))
all:
@echo B = $(B)
执行后如下所示,
7、sort 函数
函数sort 语法如下:
$(sort list)
对于list
中每一个用空格隔开的值,全部取出后按字母顺序排序,并去掉重复的值,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = b.c c.bin d.c e.c a.c b.c abc c.bin
B = $(sort $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
五、文件名函数
1、dir 函数
函数dir 语法如下:
$(dir names...)
将names
中每一个文件名的路径部分取出,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a/b.c b/c.bin d.c ../../e.c
B = $(dir $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
2、notdir 函数
函数notdir 语法如下:
$(notdir names...)
将names
中每一个文件名除路径部分外一切字符(真正的文件名)取出,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a/b.c b/c.bin d.c ../../e.c
B = $(notdir $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
3、suffix 函数
函数suffix 语法如下:
$(suffix names...)
将names
中每一个文件名的后缀取出,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a/b.c b/c.bin d.c ../../e.c
B = $(suffix $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
4、basename 函数
函数basename 语法如下:
$(basename names...)
将names
中每一个文件名中除后缀外的一切字符取出,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a/b.c b/c.bin d.c ../../e.c
B = $(basename $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
5、addsuffix 函数
函数addsuffix 语法如下:
$(addsuffix suffix,names...)
将names
中每一个用空格隔开的文件名取出,将这些文件名添加上suffix
后缀名,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a b c.bin d.c e.c
B = $(addsuffix .o, $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
6、addprefix 函数
函数addprefix 语法如下:
$(addprefix prefix,names...)
将names
中每一个用空格隔开的文件名取出,将这些文件名添加上prefix
前缀,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a.c b.c c.bin d.c e.c
B = $(addprefix dir/, $(A))
all:
@echo A = $(A)
@echo B = $(B)
执行后如下所示,
7、wildcard 函数
前面讲过,他的一个常用的用法是在指定目录下查找和格式匹配的且真实存在的文件的名称 。
编写如下Makefile:
A = $(wildcard dir/*.c dir/*.o)
all:
@echo A = $(A)
执行后如下所示,
六、其他函数
1、foreach函数
函数foreach语法如下:
$(foreach var,list,text)
对于list
中每一个用空格隔开的值,将其分别赋给var
后,依次按照text
给出的规则生成新的值,然后将这些值用空格连接起来后作为函数的返回值;
编写如下Makefile:
A = a b c
B = $(foreach v, $(A), $(v).o)
all:
@echo B = $(B)
执行后如下所示,
2、if 函数
函数if语法如下:
$(if condition,then-part[,else-part])
将condition
的前导空格、结尾空格去掉。
去掉后的值如果为非空字符串,则执行第二个参数then-part
的值,并将该值作为函数返回值。
去掉后的值如果为空字符串,并且第三个参数存在,则执行第三个参数else-part
的值,并将
该值作为函数返回值;如果第三个参数不存在,函数将返回空值。
编写如下Makefile:
A = a.c b.c c.bin d.c e.c
B = $(if $(A), true)
C = $(if $(F), true)
D = $(if $(F), true, flase)
all:
@echo A = $(A)
@echo B = $(B)
@echo C = $(C)
@echo D = $(D)
执行后如下所示,
3、origin 函数
函数origin 用来查询一个变量的定义方式,语法如下:
$(origin variable)
variable
是该需要查询的变量的名称,不是对该变量的引用,所以,不需要采用$
和圆括号的格
式书写该变量。
对于不同的变量定义方式,函数 origin
返回不同的字符串,如下所示:
返回值 | 变量定义方式 |
---|---|
undefined |
变量 variable 从没有定义 |
default |
变量 variable 是缺省定义 |
environment |
变量 variable 作为环境变量定义,选项‘-e’没有打开 |
environment override |
变量 variable 作为环境变量定义,选项‘-e’已打开 |
file |
变量 variable 在Makefile 中定义 |
command line |
变量 variable 在命令行中定义 |
override |
变量 variable 在 Makefile 中用 override 指令定义 |
automatic |
变量 variable 是自动变量 |
编写如下Makefile:
F = makefile
A = $(origin NO)
B = $(origin CC)
C = $(origin PATH)
D = $(origin F)
E = $(origin CMD)
all:
@echo A = $(A)
@echo B = $(B)
@echo C = $(C)
@echo D = $(D)
@echo E = $(E)
执行后如下所示,
4、shell 函数
函数shell 语法如下:
$(shell command arguments)
shell函数用来获取在控制台上执行command arguments
的结果。不过在控制台上command arguments
的结果会含有换行符(和回车符),但在函数 shell 的返回结果中会将把它们处理为单个空格,若返回结果最后是换行符(和回车符)则被去掉。
编写如下Makefile:
A = $(shell ls -l)
all:
@echo A = $(A)
执行后如下所示,