一、前言
在这篇文章中,我们首先会把我认为常用的函数逐一列出,附上示例,我认为函数是使像我这样的新手读不懂Makefile的重要原因之一。因为Makefile中函数和我们常用的语言中的,如C/C++等,具有较大的差距,这可能会使我们一时间摸不到头脑,但是只要习惯了,注意了就没什么好怕的了:)
二、函数使用
2.1函数调用方式
Makefile的函数与常用语言的函数存在着较大差别,它有三个规则:
1)函数名与参数之间以空格连接
2)参数之间以逗号连接
3)通过"$(*)"调用函数,其中*代表函数名与参数
在刚接触Makefile时,我常常会因为分不清函数嵌套的逻辑,记不住函数的功能而导致无法明确代码语义。
2.2字符串处理函数
2.2.1subst
使用方式:ans = $(subst $(a),$(b),$(var))
功能:将var中的a转换为b,并将结果赋给ans
2.2.2patsubst
使用方式:ans = $(patsubst <pattern1>,<pattern2>,$(var))
功能:检索var中符合<pattern1>的字符串,并将其变为<pattern2>,将结果赋给ans
注:上述说明可能会比较抽象,实际这个函数比较想我写的上一篇文章的变量实用用法
obj = a.o b.o c.o
src = $(obj .o=.c)与src = $(patsubst %.o,%.c,$(obj))等价
2.2.3strip
使用方式:ans = $(strip $(var))
功能:去除var前后的空格,并将结果赋给ans
2.2.4findstring
使用方式:ans = $(findstring $(a),$(var))
功能:在var中查找a,若找到则返回a,否则返回空字符串
2.2.5filter
使用方式:ans = $(filter <pattern>,$(var))
功能:在var筛选出符合<pattern>的值,并将符合的赋给ans
2.2.6filter-out
与filter相反
2.2.7sort
使用方式:ans = $(sort $(var))
功能:将var中的单词按照升序排序,并将结果赋给ans
2.2.8word
使用方式:ans = $(word num,$(var))
功能:返回var中的第num个单词,并将其赋给ans
2.2.9words
使用方式:ans = $(words $(var))
功能:返回var中单词的数量,并将其赋给ans
2.3文件名操作函数
大部分和文件名相关的函数都是成对出现的,因此我们一组一组的总结。我觉得我列出的这些文件名操作函数真的时非常有用的,因为Makefile是为了大型工程的“自动化编译”,文件数量往往较多,批量的文件操作是十分常用的。
2.3.1dir/notdir
使用方式:ans = $(dir(notdir) <names>)
功能:返回文件的路径(名字)
name = ./include/sort.h ./include/types.h ./src/sort.c
name_dir = $(dir $(name))
name_notdir = $(notdir $(name))
all:
@echo $(name_dir)
@echo $(name_notdir)
输出如下:
./include/ ./include/ ./src/
sort.h types.h sort.c
2.3.2suffix/basename
使用方式:ans = $(suffix(basename) <name>)
功能:取name中每个字符串的后缀(前缀),并将其赋给ans
name = ./include/sort.h ./include/types.h ./src/sort.c
name_suffix = $(suffix $(name))
name_basename = $(basename $(name))
all:
@echo $(name_suffix)
@echo $(name_basename)
输出为:
.h .h .c
./include/sort ./include/types ./src/sort
2.3.3addsuffix/addprefix
使用方式:ans = $(addsuffix(addprefix) <name>,$(var))
功能:把<name>架子啊var中每个字符串的后面(前面),并赋给ans
name1 = ./include/
name2 = .h
prog = test sort
ans = $(addsuffix $(name2),$(addprefix $(name1),$(prog)))
all:
@echo $(ans)
输出为:
./include/test.h ./include/sort.h
2.3.4join
使用方式:ans = $(join $(var1),$(var2))
功能:将var2的单词依次接在var1中每个单词的后面,并将结果赋给ans
var1 = sort test
var2 = .o .c
all:
@echo $(join $(var1),$(var2))
输出为:
sort.o test.c
三、结语
由于篇幅的显示,这篇文章中仅罗列了较为基本的函数,如果我在工作过程中给遇到了其他函数,我会在未来的学习笔记中添加,或者直接修改这篇文章。在大型工程的Makefile中不一定会大量使用一些复杂的函数,相反其中大多数情况是多个简单函数的嵌套,因此我觉得在这部分一定要做到熟练记忆并使用各种简单函数!