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中的函数的主要内容,如果未能解决你的问题,请参考以下文章

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

Makefile

Makefile中的函数

通用 Makefile(及makefile中的notdir,wildcard和patsubst)

如何优化C ++代码的以下片段 - 卷中的零交叉

Makefile中的函数