Makefile学习之路(3) — Makefile的函数

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)

执行后如下所示,
$(sort list)

五、文件名函数

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)

执行后如下所示,
在这里插入图片描述

七、附录

上一篇:Makefile学习之路(2) — Makefile的变量和通配符

猜你喜欢

转载自blog.csdn.net/qq_38113006/article/details/111826528