Makefile类似于一门编程语言,也有相应的函数,这一章我们介绍常用的Makefile函数。
在Makefile中有常用的foreach、filter、filter-out、wildcard、patsubst函数等等。
foreach作为makefile中的函数,相当于一个循环函数。
作用: 循环处理文件列表。
语法格式:$(foreach var, list, text)
作用:过滤掉字串“text”中所有不符合模式“pattern”的单词,保留所有符合此模式的单词。
语法格式:$(filter pattern…,text)
作用:过滤掉字串“text”中所有符合模式“pattern”的单词,保留删除符合此模式的单词之后的数据。
语法格式:$(filter-out pattern…,text)
作用:获取具有某一特征的所有文件或者数据。
语法格式:$(wildcard pattern)
作用:从列表中取出每一个值,如果符合pattern,则替换为replacement。
语法格式:$(patsubst pattern, replacement, $(var))
Makefile代码:
A = a b c
B = $(foreach f, $(A), $(f).o)
all:
@echo B = $(B)
运行结果:

运行原理:
Makefile代码:
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out %/, $(C))
all:
@echo B = $(B)
@echo D = $(D)
@echo E = $(E)
运行结果:

运行原理:
Makefile代码:
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out %/, $(C))
files = $(wildcard *.c)
all:
@echo B = $(B)
@echo D = $(D)
@echo E = $(E)
@echo files = $(files)
运行结果:

运行原理:
wildcard 函数还有另外一个用法:查找当前路径下真实存在的文件。实例代码
Makefile
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out %/, $(C))
files = $(wildcard *.c)
files2 = a.c b.c c.c d.c e.c
files3 = $(wildcard $(files2))
all:
@echo B = $(B)
@echo D = $(D)
@echo E = $(E)
@echo files = $(files)
@echo files3 = $(files3)
运行结果:

运行原理:
该函数可以完成在一个列表数据中查找匹配的字符串,用另一种格式进行替换
实例代码:
Makefile
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out %/, $(C))
files = $(wildcard *.c)
files2 = a.c b.c c.c d.c e.c abc
files3 = $(wildcard $(files2))
dep_files = $(patsubst %.c, %.d, $(files2))
all:
@echo B = $(B)
@echo D = $(D)
@echo E = $(E)
@echo files = $(files)
@echo files3 = $(files3)
@echo dep_files = $(dep_files)
运行结果:

运行原理: