九、常用的函数
详细说明:https://seisman.github.io/how-to-write-makefile/functions.html
Makefile中函数的调用和变量的使用类似,都是用“$”来进行标识的。函数调用后,函数的返回值可以作为变量来使用,在第七章节的条件判断的使用中,我们已经有所应用。本章节的目录如下:
目录
9.1、字符串处理函数
1)字符串替换函数:subst
- 语法:$(subst <from>,<to>,<demo>)
- 功能:将<demo>中的<from>替换为<to>。
- 返回:被替换后的字符串
- 实例:
-
$(subst d,D,demo) 返回结果:Demo
2)模式字符串替换函数:patsubst
- 语法:$(patsubst <pattern>,<replacement>,<demo>)
- 功能:将<demo>内容符合模式<pattern>,则用<replacement>来进行替换。<pattern>中可以包含通配符“%”,也可以表示任意长度的字符串,假如<replacement>也存在通配符“%”,可以使用转译符“\”,即“\%”表示真正含义的“%”字符。
- 返回:被替换后的字符串
- 实例:
-
$(patsubst %.c,%.0,demo.c test.c) 返回结果:demo.o test.o
3)去空格函数:strip
- 语法:$(strip <string>)
- 功能:去掉<string>字符串中开头和结尾的空字符。
- 返回:返回被去掉空字符的字符串。
- 实例:
-
$(strip demo x _) 返回结果:demo x (PS:此处为了更明显的表示效果,使用了“_”表示空格)
4)查找字符串函数:findstring
- 语法:$(findstring <find>,<demo>)
- 功能:在<demo>字符串中查找<find>字符串。
- 返回:如果找到,返回<find>,反之返回空字符串。
- 实例:
-
$(findstring x,1 2 3 x) 返回结果:x
5)过滤函数:filter
- 语法:$(filter <pattern…>,<demo>)
- 功能:将<demo>字符串中的单词符合<pattern…>模式的进行过滤。
- 返回:符合<pattern…>模式的字符串。
- 实例:
-
sources := main.c demo.c common.c common.h test: $(sources) cc $(filter %c,$(sources)) –o test 其中$(filter %c,$(sources))返回的是:main.c demo.c common.c
6)反过滤函数:filter-out
与5)过滤函数:filter类似,只不过返回的是不符合<pattern…>模式的字符串。
7)首单词函数:firstword
- 语法:$(firstword <text>)
- 功能:取字符串<text>中的第一个单词。
- 返回:返回字符串<text>的第一个单词。
- 实例:
-
$(firstword demo test word) 返回结果:demo
9.2、文件名操作函数
1)取目录函数:dir
- 语法:$(dir <name……>)
- 功能:从文件名序列<name……>中取出目录部分,如果该文件路径不存在反斜杠,则表明该文件路径在当前目录,即返回“./”。
- 返回:返回文件名序列<name……>中的目录部分
- 实例:
-
$(dir home/lins/works/demo.c demo.c) 返回结果:home/lins/works ./
2)取文件函数:notdir
- 语法:$(notdir <name……>)
- 功能:从文件名序列<name……>中取出非目录部分,即最后一个 “/”之后的部分。
- 返回:返回文件名序列<name……>中的非目录部分
- 实例:
-
$(notdir home/lins/works/demo.c cmd.bin) 返回结果:demo.c cmd.bin
3)取后缀函数:suffix
- 语法:$(suffix <name……>)
- 功能:从文件名序列<name……>中取出各个文件名的后缀。
- 返回:返回文件名序列<name……>中各个文件名的后缀,若文件没有后缀则返回空字符串。
- 实例:
-
$(suffix home/lins/works/demo.c usr/bin/test.bin makefile) 返回结果是:.c .bin
4)取前缀函数:basename
- 语法:$( basename <name……>)
- 功能:从文件名序列<name……>中取出各个文件名的前缀。
- 返回:返回文件名序列<name……>中各个文件名的前缀,若文件没有前缀则返回空字符串。
- 实例:
-
$(suffix home/lins/works/demo.c usr/bin/test.bin makefile) 返回结果是:home/lins/works/demo usr/bin/test makefile
5)加后缀函数:addsuffix
- 语法:$(addsuffix <suffix>,<name……>)
- 功能:将后缀<suffix>加到字符串<name……>中的每个单词的后面。
- 返回:返回加过后缀的文件名序列。
- 实例:
-
$(addsuffix .c, demo test) 返回结果:demo.c test.c
6)加前缀函数:addprefix
- 语法:$( addprefix <prefix>,<name……>)
- 功能:将前缀< prefix >加到字符串<name……>中的每个单词的前面。
- 返回:返回加过前缀的文件名序列。
- 实例:
-
$( addprefix usr/works/, demo test) 返回结果:usr/works/demo usr/works/test
7)连接函数:join
- 语法:$(join <list1>,<list2>)
- 功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么<list1> 中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么<list2>多出来的单词将被复制到<list1>中。
- 返回:返回连接过后的字符串。
- 实例:
-
$(join aaa bbb ccc, 111 222) 返回结果:aaa111 bbb222 ccc $(join aaa bbb, 111 222 333) 返回结果:aaa111 bbb222 333
9.3、foreach函数
- 语法:$(foreach <var>,<list>,<text>)
- 功能:该函数的功能是将参数<list>中的单词逐一提取到参数<var>中,然后执行<text>中所包含的表达式。每执行一次<text>中的表达式会返回一个字符串,在这个循环的过程中,<text>处理所返回的每个字符串是以空格分隔的,当这个循环结束时,<text>处理的每一个字符串所组成的以空格间隔的整个字符串是该函数的返回结果。
- 返回:返回经过<text>处理过的字符串。
- 实例:
-
list := a b c d final := $(foreach value,$(list),$(value).c) 返回结果:$(final)的值是“a.c b.c c.c d.c”
PS:在上述操作中<var>参数是一个临时的局部变量,仅应用于该函数的中,该函数执行完后,参数<var>将不再作用。
9.4、call函数
- 语法:$(call <expression>,<parm1>,<parm2>,…,<parmn>)
- 功能:该函数是一个用于向表达式传递参数的函数。当执行这个函数时,<expression>参数中的变量就会被参数<parm1>,<parm2>,…,<parmn>等依次取代。
- 返回:返回被取代后的<expression>参数中的变量
- 实例:
-
demo = $(1) $(2) final = $(call demo,a,b) 返回结果:final的值是a b 该函数的使用时参数的次序是可以自定义的,如下所示: demo = $(2) $(1) final = $(call demo,a,b) 返回结果:final的值是b a
PS:在向call函数传递参数的时候,需要去除所有多余的空格。
9.5、origin函数
- 语法:$(origin <variable>)
- 功能:该函数的功能是将<variable>变量的来源告知与你。
- 返回:返回<variable>变量的来源。
9.6、wildcard函数
- 语法:$(wildcard <pattern>)
- 功能:获取匹配<pattern>的所有对象。
- 返回:使用空格分隔的匹配对象列表。
- 实例:
-
$(wildcard *c) 返回结果:当前目录下所有的.c文件列表。
9.7、控制make的函数
1)error函数
- 语法:$(error text……)
- 功能:产生致命错误,并提示“TEXT…”信息给用户,并退出make的执行.
- 返回:NULL
- 实例:
-
Ifdef ERROR1 $(error error is $(ERROR1)) Endif
2)warning函数
- 语法:$(warning text……)
- 功能:函数“warning”类似于函数“error”,区别在于它不会导致致命错误(make不退出),而只是提示“text…”,make的执行过程继续。
- 返回:NULL
- 实例:
-
$(waring there is a warning)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117009.html