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。

posted @ 2013-02-04 11:14  Mr.Shadow  阅读(332)  评论(0编辑  收藏  举报