note:一直对makefile中某些函数的使用不是很明白,每次用起来都需要查,所以这里总结一下一些make 函数的使用
1,make 函数的调用方式
跟变量的使用类似,make中函数的使用,也是以‘$’符号表示,具体格式如:$(func, args)
其返回值可以当作变量来使用。
2,make内置函数主要可以分为三大类:字符串处理函数,文件操作函数,和一些其他函数(相对而言,使用的反而较多)
3,既然函数的返回值可以当做变量使用,所以函数也可以作为另外一个函数的变量
下面具体分析下各种类型的常用函数:
一,字符处理函数
1,字符串替换函数:$(subst FROM, TO, TEXT)
将TEXT中的FROM替换为TO,之后返回替换之后TEXT
2,模式字符串替换函数:$(patsubst PATTERN, TARGET, TEXT)
将TEXT能匹配PATTERN的的内容用TARGET替换,PATTERN可以用通配符“%”表示任意长度的字符串,常用于将.c替换成.o
如:$(patsubst %.c, %.o, a.c b.c c.c)----->a.o b.o c.o
也可以用如下函数得到同样的效果
C_SRCS = $(filter %.c, $(SOURCES))
CPP_SRCS = $(filter %.cpp,$(SOURCES))
C_OBJS = $(C_SRCS:%.c=%.o)
CPP_OBJS = $(CPP_SRCS:%.cpp=%.o)
这里用到了另外一个函数filter,下面讲述
3,过滤函数: $(filter PATTERN, TEXT):将TEXT中的能匹配PATTERN的字符串筛选出来,
PATTERN同样可以使用通配符“%“表示任意长度的字符串,
常用于在一堆文件中,根据某个标记(一般是后缀,比如.c/.cpp/.java......java用不用make啊)筛选想要的文件
反过滤函数:$(filter-out PATTERN, TEXT):顾名思义,与filter作用相反,用于筛选能匹配PATTERN以外的字串,
4,单词相关函数
根据index获取单词的函数:$(word INDEX, TEXT):获取TEXT中第INDEX(>=1)个单词,返回获取的单词,
如果INDEX大于总数,返回空串。
根据一对起始cursor和终止cursor获取单词串的函数:$(wordlist START_CURSOR, END_CURSOR, TEXT):
START_CURSOR和END_CURSOR是一个数字,获取自START_CURSOR开始到END_CURSOR结束的单词串
如:$(wordlist 2 , 3, wo shi yejing)返回shi yejing
$(wordlist 3 , 4, wo shi yejing)返回yejing,也就是从start_index(3)到最后一个单词的串
$(wordlist 4 , 5, wo shi yejing)返回空串
需要特别注意的是,这里的index一般从1开始,跟我们常用的数组索引有区别
统计单词总数的函数:$(words TEXT):统计TEXT中一共有多少个单词
获取第一个单词的函数:$(firstword TEXT):获取TEXT中的第一个单词
5,其他字符串处理函数
排序函数:$(sort TEXT):将TEXT中单词按照首字母升序排列,会去掉TEXT中相同的单词
如:$(sort wo shi yejing wo shi yejing)返回shi wo yejing
去空格函数:$(strip TEXT):将TEXT的开头空格和结尾空格去掉
字符串查找函数:$(findstring TARGET, SOURCE):在source中查找能匹配target的单词,找到返回target,否则返回空串