make函数可以分成如下几类
- 字符串操作
- 文件名操作
- 流程控制
- 若干重要的杂项函数
- 较不重要的杂项函数
- 用户自定义函数
所有函数都具有如下形式
$(function-name arg1[,argn])
function-name是函数名,接着是函数的参数,以逗号为分隔符,第一个参数的前导空格会被删除,但是后续的任何参数包括前导空格都会被保留下来。
字符串函数
filter
$(filter pattern ...,text)
可以看到
1.第一个模式只会匹配单词he
2.模式中只能包含一个%字符,如果还有额外的%,那么额外的%都被视作文字字符
3.filter无法匹配子字符串且只能接受一个通配符
filter-out
$(filter-out pattern ...,text)
与filter结果相反
subst
$(subst search-string,replace-string,text)
这是一个不具备通配符能力的搜索替换函数,例如
patsubst
$(patsubst search-string,replace-string,text)
这是一个具备通配符能力的搜索替换函数,注意这里只能包含一个通配符,例如下面是删除text结尾处的斜线
words
$(words text)
返回text中单词数量,如
word
$(word n,text)
firstword
$(firstword text)
等同于$(word 1,text)
,如
wordlist
$(wordlist start,end,text)
重要杂项函数
sort
$(sort list)
对list进行排序并删除重复的项目
shell
$(shell command)
command被丢给subshell执行,make把执行结果当做函数返回值,结果中出现的换行符会被缩成单一空格,标准错误和任何程序状态不会被返回
下面可以测试word-list变量是否包含重复内容
文件名函数
wildcard
$(wildcard pattern...)
下面sources就保存了是.c和.h文件名列表,如果没有从.c、.h则返回空
dir
$(dir list...)
notdir
$(notdir name...)
suffix
$(suffix name...)
basename
$(basename name...)
addsuffix
$(addsuffix suffix,name...)
给name添加suffix后缀
addprefix
$(addprefix prefix,name...)
给name添加prefix前缀
join
$(join prefix-list,suffix-lis)
流程控制
if
$(if condition,then-part,else-part)
if函数(注意不要和条件指令ifeq、ifne、ifdef、ifndef搞混了),如果condition扩展之后包涵任何字符(空格也算),则为真,会对then-part进行扩展动作,否则condition为假,对else-part进行扩展。
如想要判断makefile是否在windows上运行,查看COMSPEC,只有windows会定义次变量
要求make版本要在3.80之后
error
$(error text)
输出“无法挽回的”错误信息,上面if函数检查MAKE_VERSION版本例子中,如果condition为假,则error会当当前make停止执行并输出后面错误信息
**foreach **
$(foreach variable,list,body)
让variable依次等于list列表中的值,让后variable代入body展开作为返回值
下面这个例子可用来判断测试一组变量是否定义过
如果把strerr去掉
较不重要的杂项函数
strip
$(strip text)
去掉text前后导空格
**origin **
$(origin variable)
返回描述变量来自何处的字符串,
**warning **
$(warning text)
类似于error函数,但是不会导致make结束运行
自定义函数
下面是一个简单的调试跟踪函数来打印函数调用情况和入口参数,$0
用来表示访问当前所执行的函数名称
foreach的body加上了''
,所以foreach返回结果是每个参数带上单引号的以空格为分隔符的列表串,再用subst把参数之间的单引号空格单引号
替换成单引号$(coma)单引号
,上面这个追踪最多只能列出9个参数,因为foreach的list是1~9
eval
eval函数是将文本直接放入make解析,下面我是参考下面2篇文章
https://blog.csdn.net/xiaoyink/article/details/89671428
https://blog.csdn.net/k7arm/article/details/67637340
https://www.cnblogs.com/merlindu/p/6542805.html