1.函数foreach
$(foreach var ,list,text)
A= a b c
B=$(foreach f ,$(A),$(f).o)
all:
@echo B =$(B)
结果: B =a.o b.o c.o
解释理解:
前两个参数,‘var’和‘list’,将首先扩展,注意最后一个参数 ‘text’ 此时不扩展;接着,对每一个 ‘list’ 扩展产生的字,将用来为 ‘var’ 扩展后命名的变量赋值;然后 ‘text’ 引用该变量扩展;因此它每次扩展都不相同。结果是由空格隔开的 ‘text’。在 ‘list’ 中多次扩展的字组成的新的 ‘list’。‘text’ 多次扩展的字串联起来,字与字之间由空格隔开,如此就产生了函数 foreach 的返回值。
2.filter/filter-out
函数filter/filter-out 语法如下
$(filter pattern...,text) 从text的字符中,取出符合pattern样式的的字符。
$(filter-out pattern...,text) 从text的字符中,去除除了pattern样式的字符。
C=a b c d/
D=$(filter %/,$(C))
E=$(filter-out %/,$((C))
all:
@echo D=$(D)
@echo E=$(E)
结果是:
D=d/
E=a b c
wildcard
函数wildcard语法
$(wildcard pattern) 取出pattern样式的文件,最后返回这些文件名。
实列:
在该目录下面创建三个文件:a.c b.c c.c
files=$(wildcard *.c)
all:
@echo files=$(files)
结果:
files=a.c b.c c.c
patsubst函数
函数patsubst语法如下:
$(patsubst pattern,replacement,\$(var))
patsubst函数是将var里面的每一个值,如果这个值符合pattern的样式,这将所有符合pattern样式
的值,全部替换为replacement。
实列:
files2 = a.c b.c c.c d.c e.c abc
rp_files=$(patsubst %.c,%.o,$(files2))
all:
@echo rp_files=$(rp_files)
结果是:
rp_files=a.o b.o c.o d.o e.o abc