Makefile中的函数
Posted hellokitty2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile中的函数相关的知识,希望对你有一定的参考价值。
1.strip函数
(1)语法:
$(strip string)
(2)说明:
strip是去空格函数
(3)举例:
#名称:去空格函数——strip。 #功能:去掉<string>字串中开头和结尾的空字符,并将中间的多个连续空字符(如果有的话)合并为一个空字符。 #返回:返回被去掉空格的字符串值。 #说明: 空字符包括空格,tab等不可显示的字符 #把字串" abc"开头的空格去掉,结果是"abc"。 str1 := abc str2 := abc str3 := a b c all: @echo bound$(strip $(str1))bound @echo bound$(strip $(str2))bound @echo bound$(strip $(str3))bound 执行结果: root@ubuntu# make boundabcbound boundabcbound bounda b cbound
2.call函数
(1)语法:
$(call <expression>,<parm1>,<parm2>,<parm3>...)
(2)说明:
call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式,这个表达式中,你可以定义许多参数,
然后你可以用call函数来向这个表达式传递参数。
(3)举例
例子1:反转参数的次序
reverse=$(2) $(1) foo=$(call reverse, a, b) all: @echo $(foo) #执行结果: #root@ubuntu# make #b a
例子2:使用模板语句
define target echo $1 echo $2 endef all: @$(call target, hello, world) root@ubuntu# make hello world
3.foreach函数
(1)语法:
$(foreach <var>,<list>,<text>)
(2)说明:
函数工作过程:如果需要(存在变量或者函数的引用),首先展开变量<var>和<list>的引用;而表达式<text>中的变量引用不展开。
执行时把<list>中使用空格分割的单词依次取出赋值给变量<var>,然后执行<text>表达式。重复直到<list>的最后一个单词。
<text>中的变量或者函数引用在执行时才被展开,但是如果在<text>中存在对<var>的引用,那么<text>的值在每一次展开式将会到的不同的值。
返回值为空格分割的多次表达式<text>的计算的结果。
(3)举例
names := a b c d files := $(foreach n, $(names), $(n).o) all: @echo $(files) root@ubuntu# make na.o b.o c.o d.o
4.sort函数
(1)语法:
$(sort <list>)
(2)说明:
排序函数,给字串<list>中的单词以首字母为准进行排序(升序),并去掉重复。
(3)举例:
val := $(sort foo bar lose foo) all: @echo $(val) root@ubuntu# make bar foo lose
5.subst函数
(1)语法:
$(subst <str1>,<str2>,$(str3))
(2)说明:
将字符串str3中的str1字段替换为str2.
(3)举例:将$(foo)中的空格替换为逗号。
comma := , empty := space := $(empty) $(empty) #使用两个empty定义中间的那个空格 foo := a b c bar := $(subst $(space),$(comma),$(foo)) all: @echo $(bar) str := $(subst ee,EE,feet on the street) all1: @echo $(str) root@ubuntu# make a,b,c root@ubuntu# make all1 fEEt on the strEEt,
6.patsubst函数
(1)语法:
$(patsubst <pattern>,<replacement>,<text>)
(2)说明:
模式替换函数,将<text>中符合<pattern>的字符串替换为<replacement>。注意<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,
那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“”来转义,以“\%”来表示真实含义的“%”字符),函数返回被替换过后的字符串。
(3)举例:
all: @ echo $(patsubst %.c, %.o, x.c.c bar.c) root@ubuntu# make x.c.o bar.o
7.findstring函数
(1)语法:
#$(findstring <str1>, <str2>)
(2)说明:
查找字符串函数,在str2中找str1,如果找到就返回str1,没有找到就返回空字符串。
(3)举例:
str1 := a b c str2 := b c all: @echo $(findstring a,$(str1)) @echo $(findstring a,$(str2)) root@ubuntu# make a
8.filter函数
(1)语法:
$(filter <parten…>,<text>)
(2)说明:
过滤函数,将字串<text>中所有不符合模式<parten…>的单词过滤掉,只保留所有符合此模式的单词。
(3)举例:
sources := foo.c bar.c baz.s ugh.h all: @echo $(filter %.c %.s,$(sources)) root@ubuntu# make foo.c bar.c baz.s
9.filter-out函数
(1)语法:
$(filter-out <pattern…>,<text>)
(2)说明:
过滤函数,将字串<text>中所有符合模式<parten…>的单词过滤掉,只保留不符合此模式的单词,于filter是相反的操作。
(3)举例:
objects := main1.o foo.o main2.o bar.o mains := main1.o main2.o all: @echo $(filter-out $(mains),$(objects)) root@ubuntu# make foo.o bar.o
10.wildcard函数
(1)语法:
$(wildcard <pattern...>)
(2)说明:
该函数被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
(3)举例:
all: @echo $(wildcard *.c) root@ubuntu# touch a.c bb.c root@ubuntu# make bb.c a.c
参考:https://blog.csdn.net/qxb1229/article/details/8651060 TODO还有很多没写完。
以上是关于Makefile中的函数的主要内容,如果未能解决你的问题,请参考以下文章
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段