字符串处理函数
1. 函数语法
${<function > <arguments >}
make支持的函数不多。参数间以逗号"," 分隔,而函数名和参数之间以"空格" 分隔,函数调用以"$" 开头,以圆
括号或花括号把函数名和参数括起。函数和变量的括号最好一样
2. 字符串替换函数
$(subst <from >,<to >,<text >)
功能:把字串<text >中的<from >字符串替换成<to >
返回:函数返回被替换过后的字符串
示例:
bar := $(subst a ,b,abc)
$(foo)的值是"abc" 。这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换
字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的a 替换成b,所以$(bar)的值是"bbc"
3. 模式字符串替换函数
$( patsubst <pattern>,<replacement>,<text >)
功能:查找<text >中的单词(单词以"空格" 、"Tab" 或"回车" "换行" 分隔)是否符合模式<pattern>,如果匹配的话,则以
<replacement>替换。这里,<pattern>可以包括通配符"%" ,表示任意长度的字串。如果<replacement>中也包含"%" ,那么,
<replacement>中的这个"%" 将是<pattern>中的那个"%" 所代表的字串。(可以用"\"来转义,以" \%" 来表示真实含义的"%" 字符)
返回:函数返回被替换过后的字符串
示例:
$( patsubst %. c,%. o,x.c.c bar.c)
把字串"x.c.cbar.c" 符合模式[%. c]的单词替换成[%. o],返回结果是"x.c.obar.o"
上式等同于:
obj = x .c .c bar.c
$(obj:%.c =%.o )
4. 去空格函数
$( strip <string >)
功能:去掉<string >字串中开头和结尾的空字符
返回:返回被去掉空格的字符串值
5. 查找字符串函数
$( findstring <find>,<in >)
功能:在字串<in >中查找<find>字串
返回:如果找到,那么返回<find>,否则返回空字符串
示例:
$( findstring a,a b c)
$( findstring a,b c)
第一个函数返回"a" 字符串,第二个返回" " 字符串(空字符串)
6. 过滤函数
$(filter <pattern...>,<text>)
功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式
返回:返回符合模式<pattern>的字串
示例:
sources := foo.c bar.c baz.s ugh.h
$(filter %.c %.s ,$(sources))
返回值是foo.c bar.c baz.s
7. 反过滤函数
$(filter-out <pattern... > ,<text > )
功能:以<pattern > 模式过滤<text > 字符串中的单词,去除符合模式<pattern > 的单词。可以有多个模式
返回:返回不符合模式<pattern > 的字串
示例:
上例返回值是ugh.h
8. 排序函数
$( sort <list>)
功能:给字符串<list>中的单词排序(升序)
返回:返回排序后的字符串
示例:$( sort foo bar lose)返回"bar foo lose"
备注:sort 函数会去掉<list>中相同的单词
9. 取单词函数
$(word <n > ,<text > )
功能:取字符串<text > 中第<n > 个单词。(从一开始)
返回:返回字符串<text > 中第<n > 个单词。如果<n > 比<text > 中的单词数要大,那么返回空字符串
示例:$(word 2,foo bar lose)返回"bar"
10. 取单词串函数
$(wordlist <s > ,<e > ,<text > )
功能:从字符串<text > 中取从<s > 开始到<e > 的单词串。<s > 和<e > 是一个数字
返回:返回字符串<text > 中从<s > 到<e > 的单词字串。如果<s > 比<text > 中的单词数要大,那么返回空字符串。如果<e > 大于<text > 的
单词数,那么返回从<s > 开始,到<text > 结束的单词串
示例:$(word 2,3,foo bar lose)返回"bar lose"
11. 单词个数统计函数
$(words <text >)
功能:统计<text >中字符串中的单词个数
返回:返回<text >中的单词数
示例:$(words foo bar lose)返回3
12. 首单词函数
$( firstword <text >)
功能:取字符串<text >中的第一个单词
返回:返回字符串<text >的第一个单词
示例:$( firstword foo bar lose)返回"foo"
文件名操作函数
1. 取目录函数
$( dir <names...>)
功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠("/" )之前的部分。如果没有反斜杠,那么返回"./"
返回:返回文件名序列<names>的目录部分
示例:$( dirsrc /foo.chacks)返回值是"/"
2. 取文件函数
$( notdir <names...>)
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠("/" )之后的部分
返回:返回文件名序列<names>的非目录部分
示例:$( notdir src/foo.chacks)返回值是"foo.chacks"
3. 取后缀函数
$( suffix <names...>)
功能:从文件名序列<names>中取出各个文件名的后缀
返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串
示例:$( suffix src/foo.c src-1.0 /bar.ch)返回值是".c .ch"
4. 取前缀函数
$( basename <names...>)
功能:从文件名序列<names>中取出各个文件名的前缀部分
返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字串
示例:$( basename src/foo.c src-1.0 /bar.ch)返回值是"src/foo src-1.0/bar"
5. 加后缀函数
$(addsuffix <suffix > ,<names... > )
功能:把后缀<suffix > 加到<names > 中的每个单词后面
返回:返回加过后缀的文件名序列
示例:$(addsuffix .c,foobar)返回值是"foobar.c"
6. 加前缀函数
$(addprefix <prefix > ,<names... > )
功能:把前缀<prefix > 加到<names > 中的每个单词后面
返回:返回加过前缀的文件名序列
示例:$(addprefix src/,foobar)返回值是"src/foosrc"
7. 连接函数
$(join <list1 > ,<list2 > )
功能:把<list2 > 中的单词对应地加到<list1 > 的单词后面。如果<list1 > 的单词个数要比<list2 > 的多,那么
<list1 > 中的多出来的单词将保持原样。如果<list2 > 的单词个数要比<list1 > 多,那么,<list2 > 多出来的单词将被复制到<list1 > 中
返回:返回连接过后的字符串
示例:$(join a b,1 2 3)返回值是"a1 b2 3"
foreach函数
$(foreach <var >,<list >,<text>)
功能:把参数<list >中的单词逐一取出放到参数<var >所指定的变量中,然后再执行<text>所包含的表达式。每一次
<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔
返回:循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach 函数的返回值
所以,<var >最好是一个变量名,<list >可以是一个表达式,而<text>中一般会使用<var >这个参数来依次枚举<list >中的单词
示例:
names := a b c d
files := $(foreach n,$(names),$(n).o)
$(name)中的单词会被挨个取出,并存到变量"n" 中,"$(n).o" 每次根据"$(n)" 计算出一个值,这些值以空格分隔,
最后作为foreach 函数的返回,所以,$(files)的值是"a.o b.o c.o d.o"
注意:foreach 中的<var >参数是一个临时的局部变量,foreach 函数执行完后,参数<var >的变量将不在作用,其
作用域只在 foreach 函数当中
if函数
$(if < condition> ,< then-part > )
或是
$(if < condition> ,< then-part > ,< else -part > )
功能:< condition> 参数是if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是,
< then-part > 会被计算,否则< else -part > 会被计算
返回值:如果< condition> 为真(非空字符串),那个< then-part > 会是整个函数的返回值,如果< condition> 为假
(空字符串),那么< else -part > 会是整个函数的返回值,此时如果< else -part > 没有被定义,那么,整个函数返回
空字串
call函数
$(call <expression>,<parm1>,<parm2>,<parm3>... )
表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。当make执行这个函数时,
<expression>参数中的变量,如$(1 ),$(2 ),$(3 )等,会被参数<parm1>,<parm2>,<parm3>依次取代。而
<expression>的返回值就是call函数的返回值
reverse = $(2 ) $(1 )
foo = $(call reverse,a,b)
foo的值就是"ba"
origin函数
$(origin <variable >)
origin 函数不像其它的函数,他只是告诉你你的这个变量是哪里来的
注意:<variable >是变量的名字,不应该是引用。所以你最好不要在<variable >中使用"$" 字符
1. 如果<variable >从来没有定义过,返回"undefined"
2. 如果<variable >是一个默认的定义,比如"CC" 这个变量,返回"default"
3. 如果<variable >是一个环境变量,并且当Makefile被执行时,"-e" 参数没有被打开,返回"environment"
4. 如果<variable >这个变量被定义在Makefile中,返回"file"
5. 如果<variable >这个变量是被命令行定义的,返回"command line"
6. 如果<variable >是被override指示符重新定义的,返回"override"
7. 如果<variable >是一个命令运行中的自动化变量,返回"automatic"
shell函数
它的参数应该就是操作系统 Shell 的命令。它和反引号"`" 是相同的功能
注意:这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能