makefile进阶(五)-- 函数(转)
函数的调用语法为:
$(<function> <arguments> )
或
${<function> <arguments>}
函数名与参数间以空格分隔,参数之间以逗号分隔。
字符串处理的函数有:
$(subst <from>,<to>,<text>)把<text>里的<from>替换为<to>,返回替换后的字符串。
$(patsubst <pattern>,<replacement>,<text>)把<text>里匹配<pattern>的部分替换为<replacement>,返回替换后的字符串。
$(strip <string>)把<string>里开头和结尾的空格去掉,返回去空格后的字符。
$(findstring <find>,<in>)在<in>里查找<find>,返回<find>(找到)或空字符串(没找到)。
$(filter <pattern...>,<text>)过滤<text>以保留匹配模式<pattern>的单词,返回符合<pattern>的字符串。
$(filter-out <pattern...>,<test>)过滤掉<text>里匹配模式<pattern>的单词,返回不匹配<pattern>的字符串。
$(sort <list>)对字符串<list>里的单词进程升序排序,并去掉重复的单词。
$(word <n>,<text>)取出<text>里的第<n>个单词,从1开始。
$(wordlist <s>,<e>,<text>)取出<text>里的第<s>到第<e>个单词。
$(words <text>)计算<text>里的单词数。
$(firstword <text>)取出<text>里的第一个单词,等价于$(word 1,<text>)
文件名操作函数有:
$(dir <names...>)取出<names>序列中的目录部分。
$(notdir <names...>)取出<names>序列中的非目录部分,即文件名。
$(suffix <names...>)取出<names>序列的后缀部分。
$(basename <namex...>)取出<names>序列的除去后缀的部分,包括路径。
$(addsuffix <suffix>, <names...>)把<suffix>加到<names>的每个单词后面,返回加过后缀名的文件名序列。
$(addprefix <prefix>,<names...>)把<prefix>加到<names>的每个单词前面,返回加过前缀名的文件名序列。
$(join <list1>,<list2>)把<list1>和<list2>里的单词按顺序相继合并成一个序列。比如$(join a b,1 2 3)会生成a1 b2 3。
foreach函数用于循环,它的用法为:
$(foreach <var>,<list>,<text>)把<list>中的单词逐个取出放入变量<var>里,再作用到<text>表达式里生成新的单词。每次迭代生成的单词,在最后结果中组成一个序列,以空格分隔。<var>是局部变量,作用域只局限在foreach内部。
比如:
names := a b c d
files := $(foreach n,$(names),$(n).o)
$(files)的最后结果为:a.o b.o c.o d.o
if函数用于分支,用法为:
$(if <condition>,<then-part> )
或是
$(if <condition>,<then-part>,<else-part> )
call函数用于生成复杂的表达式,它类似于printf函数,用后续参数来替换第一个参数里的占位符:
$(call <expression>,<parm1>,<parm2>,<parm3>...)。
例如:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的 foo 的值就是“b a”。
它的作用决不仅于此。它是一种向用户自定义的函数传递参数的一种方式。
origin函数找到变量的起源,用法为:
$(origin <variable>),参数为变量名(不带$)。
如果变量没有定义,则返回“undefined”。
如果变量是默认定义,比如”CC“,则返回“default”。
如果变量是环境变量,且make的-e参数没有开启,则返回“environment”。
如果变量定义在makefile里,则返回“file”。
如果变量在命令行里定义,则返回“command line”。
如果变量被override重新定义,则返回“override”。
如果变量是自动化变量,比如$@,则返回“automatic”。
shell函数可以执行外壳命令,和反引号`是相同功能。用法为:
$(shell command)。
make的控制函数可以控制make的运行。包括:
$(error <text...>)输出致命错误信息,中断make。
$(warning <text..>)输出警告信息,但不中断make。
$(info <text...>)输出消息,但消息里不带有文件名和行号,不像error和warning。