1:patsubst
格式:$(patsubst pattern,replacement,text)
轮询text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔),如果符合pattern的格式(例如pattern为<%.c>那么这些单词中后缀为.c的单词是符合要求的),然后将符合要求的单词根据replacement要求的格式进行替换。
例如:
当前目录下有文件 a.c b.c f.h g.h
那么运行:
TEXT := a.c b.c f.h g.h
AFTER_TEXT := $(patsubst %.c,%.o,$(TEXT))
变量TEXT内包含了这四个文件,轮询变量TEXT,将符合模式[%.c]的单词替换为[%.o],将结果赋给变量AFTER_TEXT,它的值为:a.o b.o ,因为只有a.c b.c符合模式[%.c],所以结果中是不会有f.o g.o的。
2:subst
格式:$(subst pattern,replacement,text)
轮询text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔),将单词中“pattern"替换为“replacement”
例如:
当前目录下有文件 a.c b.c f.h g.h
那么运行:
TEXT := a.c b.c f.h g.h
AFTER_TEXT := $(subst c,o,$(TEXT))
AFTER_TEXT的结果为:a.o b.o f.h g.h
可以看到,结果中包含了f.h,g.h,这是因为subst不会进行模式匹配,不会判断单词是否含有c,简单替换后就返回结果,即使单词中没有字符c,也会返回这个单词作为结果。
3:foreach
格式:$(foreach var, text, commond)
foreach是makefile中的循环语句。
var是foreach的循环临时变量,类似于C语言的:for(int i=0 ;i<100;i++)中的局部变量i
text是包含多个单词的变量,例如:TEXT := a.c b.c f.h g.h
commond是每次循环对var变量进行操作的语句
例如:
当前目录下有文件 a.c b.c f.h g.h
那么运行:
TEXT := a.c b.c f.h g.h
RESULT=$(foreach name,$(TEXT),$(name).S)
那么RESULT变量的内容是:a.c.S b.c.S f.h.S g.h.S
轮询变量TEXT并将当前项的值放在局部变量name中,返回$(name).S
4:wildcard
格式:$(wildcard pattern)
wildcard用于通配指定目录下的所有符合格式的文件并作为返回值,如果没有符合格式的文件那么返回空。
要注意的是,通配符*是应用在系统中的,通配符%是应用在这个Makefile文件中的;换句话说,通配符%是用来匹配Makefile变量的,而通配符*是用来匹配shell命令行中的文件名,字符串等。
例如:
当前有目录dir1 dir2 dir3 dir4,四个目录依次存在文件1.c 2.c 3.c 4.c
那么运行:
TEXT := dir1 dir2 dir3 dir4
RESULT=$(foreach dir,$(TEXT),$(wildcard $(dir)/*.c))
那么RESULT变量的内容是:dir1/1.c dir2/2.c dir3/3.c dir4/4.c
每次循环,wildcard将会寻找$(dir)/目录下的*.c文件并返回这些文件名,wildcard执行的顺序是:
$(wildcard dir1/*.c)
$(wildcard dir2/*.c)
$(wildcard dir3/*.c)
$(wildcard dir4/*.c)
执行的结果依次是 dir1/1.c dir2/2.c dir3/3.c dir4/4.c,每次执行的结果都作为foreach每次循环的结果返回给变量RESULT,因此变量RESULT的值是: dir1/1.c dir2/2.c dir3/3.c dir4/4.c
5:notdir
格式: $(notdir text)
notdir用于去除字符串中的目录。
例如:
TEXT :=dir1/dir2/dir3/1.c \
dir1/dir3/dir2/3.c
RESULT = $(notdir $(TEXT))
执行之后RESULT的值为:1.c 3.c
6:abspath
格式: $(abspath dir)
获取目录dir的绝对路径,等价于在命令行键入pwd命令
7:addprefix
格式: $(addprefix pattern, text)
给text中的每一项添加pattern前缀并返回
8:eval
格式: $(eval func)
将Makefile的宏包(函数)执行;并导出宏包中的变量为全局变量。