7.7.2. Makefile函数总结
makefile函数调用,很像变量的使用,也是以”$”来标识的,其语法如下
$(<function> <arguments>)
function就是函数名,arguments为函数参数,参数间以 ,
隔开,函数名与参数之间以空格隔开
7.7.2.1. 字符串处理函数
- subst from,to,text
字符串替换函数,将字符串text中的from替换为to
- 参数
from,to,text – from待替换的字符,to目标字符,text待处理的字符串
- 返回类型
返回替换完成的字符串
示例:
$(subst ee,EE,feet on eth street)
返回结果为fEEt on eth strEEt
- patsubst pattern,replacement,text
模式字符串替换函数,查找text中的单词(单词以空格、tab、回车、换行分割)是否符合pattern模式,如果匹配的话则以replacement替换
- 参数
pattern,replacement – pattern匹配的模式,replace替换的字符串
- 返回类型
返回替换完成的字符串
示例:
$(patsubst %.c,%.o,bar.c test.c
返回结果为bar.o test.o
- strip string
去空格函数,去掉sting字符串中开头和结尾的空字符,并将中间的连续多个空字符合并为一个空字符
- 参数
string – 要处理的字符串
- 返回类型
返回替换完成的字符串
示例:
$(strip a b c d)
返回结果为 a b c d
- findstring find,in
查找字符串函数,在字符串in中查找find字符串
- 参数
find,in – 输入字符串in,查找字符串find
- 返回类型
如果找到则返回find字符串,没有找到则返回空字符串
示例:
$(findstring cat,cat dog)
返回结果为 cat
- filter pattern, text
过滤函数,以pattern模式过滤text字符串中的单词,patter可以有多个模式
- 参数
text (pattern,) – pattern:过滤模式 text:需要处理的字符串
- 返回类型
返回符合模式pattern的字串
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
gcc $(filter %.c, %.s, $(sources)) -o foo
filter返回结果为 foo.c bar.c baz.s
- filter-out pattern, text
反过滤函数,以pattern模式过滤text字符串中的单词,去除符合模式的单词,patter可以有多个模式
- 参数
text (pattern,) – pattern:过滤模式 text:需要处理的字符串
- 返回类型
返回去除符合模式pattern后的字串
示例:
sources := foo.c bar.c baz.s
foo: $(sources)
gcc $(filter-out %.c, $(sources)) -o foo
filter-out返回结果为 baz.s
- sort list
排序函数,给字符串list中的单词进行排序(升序)
- 参数
list – 需要排序的字符串
- 返回类型
返回排序后的字符串
示例:
$(sort this is a test string)
返回结果为 a i string test this
- word n,text
取单词函数,取字符串text中的第n个单词,从一开始
- 参数
text (n,) – n第n个单词 text需要处理的字符串
- 返回类型
返回第n个单词
示例:
$(word 4, this is a test string)
返回结果为 test
- words text
字符串统计函数,统计text中单词的个数
- 参数
text – text需要处理的字符串
- 返回类型
返回text中有多个单词
示例:
$(words this is a test string)
返回结果为 5
- firstword text
取首单词函数,返回字符串的第一个单词
- 参数
text – text需要处理的字符串
- 返回类型
返回text的第一个单词
示例:
$(firstword this is a test string)
返回结果为 this
7.7.2.2. 文件名操作函数
- dir names
取目录函数,从文件名序列names中取出目录部分
- 参数
names – names需要处理的文件名
- 返回类型
返回names文件的目录部分
示例:
$(dir /usr/bin/bzip2)
返回结果为 /usr/bin
- notdir names
取文件函数,从文件名序列names中取出文件部分
- 参数
names – names需要处理的文件名
- 返回类型
返回names文件的文件部分
示例:
$(dir /usr/bin/bzip2)
返回结果为 bzip2
- suffix names
取后缀函数
- 参数
names – names需要处理的文件名
- 返回类型
返回names文件的后缀名
示例:
$(suffix foo.c bar.s)
返回结果为 .c .s
- basename names
取前缀函数
- 参数
names – names需要处理的文件名
- 返回类型
返回names文件的前缀
示例:
$(basename foo.c bar.s)
返回结果为 foo bar
- addsuffix suffix,names
增加后缀函数
- 参数
names (suffix,) – suffix添加的后缀名 names需要处理的文件名
- 返回类型
返回添加完后缀名的文件名序列
示例:
$(addsuffix .o, foo bar)
返回结果为 foo.o bar.o
- addsprefix prefix,names
增加前缀函数
- 参数
names (prefix,) – prefix添加的前缀名 names需要处理的文件名
- 返回类型
返回添加完前缀名的文件名序列
示例:
$(addsuffix test_, foo.c bar.c)
返回结果为 test_foo.c test_bar.c
- join list1,list2
字符串连接函数,把字符串list2对应的加到list1的后面,如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list1>中
- 参数
list2 (list1,) – 需要连接的字符串list1 list2
- 返回类型
返回连接过后的字符串
示例:
$(join aa bb, 11 22 33)
返回结果为 aa11 bb22 33
7.7.2.3. foreach函数
foreach函数和别的函数不一样,因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照shell中的for语句构建的
- foreach par,list,text
这个函数的意思是把参数list中的单词逐一取出放到参数所指定的变量中,然后再执行text中包含的表达式,每一次text会返回一个字符串,循环过程中返回的的字符串会以空格分割,循环结束时整个返回
- 参数
list (par,) – par变量, list循环列表
- 返回类型
返回text的所有返回值
示例:
- ::
names := foo bar $(foreach par,$(names),$(addsufix .c,$(par))) 返回结果为 foo.c bar.c
7.7.2.4. if 函数
- if condition, then-part, else-part
if判断函数,也可以不含else部分。表达式condition为真则执行then-part部分,否则执行else-part部分
- 参数
else-part (condition, then-part,) – condition条件判断表达式
- 返回类型
返回then-part或else-part的执行结果
示例:
source := Makefile.build xxx_defconfig
$(if $(filter %.c,$(source)), $(addprefix uboot_,$(source)), $(addsufix .cmd,$(source)))
返回结果为 uboot_Makefile.build uboot_xxx_defconfig
7.7.2.5. call函数
call函数是唯一一个可以用来创建新的参数化的函数,你可以写一个非常复杂的表达式,这个表达式中你可以定义很多参数,然后你可以用call函数来向这个表达式传递参数
- call expression, parm1, parm2
调用自定义的表达式expression
- 参数
param (expression,) – express调用的表达式 pram参数
- 返回类型
expression的返回值
示例:
reverse = $(2) $(1)
foo = $(call revers, a, b)
此时foo的值就等于 b a
7.7.2.6. origin函数
- origin variable
返回变量是从哪里来的
- 参数
variable – 需要判断的变量
- 返回类型
变量来源
7.7.2.7. shell函数
shell函数是Makefile中直接调用shell命令
contexts := $(shell cat foo)
files := $(shell echo *.c)