https://blog.csdn.net/ustc_dylan/article/details/6963248 Makefile常用函数总结
$(subst ,,
示例:
$(subst ee,EE,feet on the street),
把“feetonthestreet”中的“ee”替换成“EE”,返回结果是“fEEtonthestrEEt”。
模式字符串替换函数——patsubst。
示例:
(
p
a
t
s
u
b
s
t
把
字
串
“
x
.
c
.
c
b
a
r
.
c
”
符
合
模
式
[
备
注
:
例
如
有
:
o
b
j
e
c
t
s
=
f
o
o
.
o
b
a
r
.
o
b
a
z
.
o
,
那
么
,
“
(patsubst %.c,%.o,x.c.c bar.c) 把字串“x.c.cbar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.obar.o” 备注: 例如有:objects=foo.obar.obaz.o, 那么,“
(patsubst把字串“x.c.cbar.c”符合模式[备注:例如有:objects=foo.obar.obaz.o,那么,“(objects:.o=.c)”和“
(
p
a
t
s
u
b
s
t
(patsubst%.o,%.c,
(patsubst(objects))”是一样的。
名称:去空格函数——strip。
功能:去掉字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip a b c )
把字串“abc”去到开头和结尾的空格,结果是“abc”。
$(findstring , )
名称:查找字符串函数——findstring。
功能:在字串中查找字串。
返回:如果找到,那么返回,否则返回空字符串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一个函数返回“a”字符串,第二个返回“”字符串(空字符串)
filter <pattern…>,
名称:过滤函数——filter。 --选择符合的
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc
(
f
i
l
t
e
r
(filter %.c %.s,
(filter(sources)) -o foo
(
f
i
l
t
e
r
(filter %.c %.s,
(filter(sources))返回的值是“foo.c bar.c baz.s”。
(
f
i
l
t
e
r
−
o
u
t
<
p
a
t
t
e
r
n
.
.
.
>
,
<
t
e
x
t
>
)
名
称
:
反
过
滤
函
数
—
—
f
i
l
t
e
r
−
o
u
t
。
−
−
删
去
符
合
的
排
序
函
数
—
—
s
o
r
t
。
(filter-out <pattern...>,<text> ) 名称:反过滤函数——filter-out。 --删去符合的 排序函数——sort。
(filter−out<pattern...>,<text>)名称:反过滤函数——filter−out。−−删去符合的排序函数——sort。(word ,
(
s
o
r
t
<
l
i
s
t
>
)
名
称
:
排
序
函
数
—
—
s
o
r
t
。
功
能
:
给
字
符
串
<
l
i
s
t
>
中
的
单
词
排
序
(
升
序
)
。
返
回
:
返
回
排
序
后
的
字
符
串
。
示
例
:
(sort <list> ) 名称:排序函数——sort。 功能:给字符串<list>中的单词排序(升序)。 返回:返回排序后的字符串。 示例:
(sort<list>)名称:排序函数——sort。功能:给字符串<list>中的单词排序(升序)。返回:返回排序后的字符串。示例:(sortfoobarlose)返回“barfoolose”。
备注:sort函数会去掉中相同的单词。
名称:取单词函数——word。
功能:取字符串
$(word2,foobarbaz)返回值是“bar”
$(wordlist ,,
名称:取单词串函数——wordlist。
功能:从字符串
开始到的单词串。
和是一个数字。
$(firstword
名称:首单词函数——firstword。
功能:取字符串
返回:返回字符串
示例:
(
f
i
r
s
t
w
o
r
d
f
o
o
b
a
r
)
返
回
值
是
“
f
o
o
”
。
备
注
:
这
个
函
数
可
以
用
w
o
r
d
函
数
来
实
现
:
(firstwordfoobar)返回值是“foo”。 备注:这个函数可以用word函数来实现:
(firstwordfoobar)返回值是“foo”。备注:这个函数可以用word函数来实现:(word1,
文件名操作函数
$(dir <names…> ) 名称:取目录函数——dir。
notdir <names…> ) 名称:取文件函数——notdir
$(suffix <names…> ) 名称:取后缀函数——suffix。从文件名序列中取出各个文件名的后缀。
$(basename <names…> ) 取前缀函数——basename。
加后缀函数——addsuffix。
(
a
d
d
s
u
f
f
i
x
.
c
,
f
o
o
b
a
r
)
返
回
值
是
“
f
o
o
.
c
b
a
r
.
c
”
加
前
缀
函
数
—
—
a
d
d
p
r
e
f
i
x
。
示
例
:
(addsuffix.c,foobar)返回值是“foo.cbar.c” 加前缀函数——addprefix。 示例:
(addsuffix.c,foobar)返回值是“foo.cbar.c”加前缀函数——addprefix。示例:(addprefixsrc/,foobar)返回值是“src/foosrc/bar”。
(
j
o
i
n
<
l
i
s
t
1
>
,
<
l
i
s
t
2
>
)
`
连
接
函
数
—
—
j
o
i
n
。
示
例
:
(join <list1>,<list2> ) `连接函数——join。 示例:
(join<list1>,<list2>)`连接函数——join。示例:(joinaaabbb,111222333)返回值是“aaa111bbb222333”。
四、$(foreach ,,
foreach函数是用来做循环用的,Makefile 中的foreach 函数几乎是仿照于 Unix 标准 Shell(/bin/sh)中的 for 语句,或是 C-Shell(/bin/csh)中的foreach语句而构建的。
把参数中的单词逐一取出放到参数
所指定的变量中,然后再执行
所以,最好是一个变量名,可以是一个表达式,而
这个参数来依次枚举中的单词。举个例子:
names := a b c d
files :=
(
f
o
r
e
a
c
h
n
,
(foreach n,
(foreachn,(names),$(n).o)
注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数
的变量将不在作用,其作用域只在 foreach 函数当中。
if函数
(
i
f
<
c
o
n
d
i
t
i
o
n
>
,
<
t
h
e
n
−
p
a
r
t
>
)
或
是
(if <condition>,<then-part> )或是
(if<condition>,<then−part>)或是 (if ,, )
而if函数的返回值是,如果为真(非空字符串),那个会是整
个函数的返回值,如果为假(空字符串),那么会是整个函数的
返回值,此时如果没有被定义,那么,整个函数返回空字串。
所以,和只会有一个被计算。
$(call ,,,…)
reverse = $(1) $(2)
foo = $(call reverse,a,b)
那么,foo的值就是“ab”。当然,参数的次序是可以自定义的,不一定是顺序的,如:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的foo的值就是“ba”。
七、origin函数
origin 函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里
来的?注意,是变量的名字,不应该是引用。所以你最好不要在中使用“
”
字
符
。
其
语
法
是
:
”字符。 其语法是:
”字符。其语法是:(origin )
Origin 函数会以其返回值来告诉你这个变量的“出生情况”,下面,是 origin
函数的返回值:
“undefined”:如果从来没有定义过,origin函数返回这个值“undefined”。
“default”:如果是一个默认的定义,比如“CC”这个变量,这种变量我们将在后面讲述。
“environment”:如果是一个环境变量,并且当Makefile被执行时,“-e”参数没有被打开。
“file”:如果这个变量被定义在Makefile中。
“command line”:如果这个变量是被命令行定义的。
“override”:如果是被override指示符重新定义的。
“automatic”如果是一个命令运行中的自动化变量。
例如,假设我们有一个Makefile其包
了一个定义文件Make.def,在Make.def中定义了一个变量“bletch”,而我们的环境中
也有一个环境变量“bletch”,此时,我们想判断一下,如果变量来源于环境,那么我
们就把之重定义了,如果来源于Make.def或是命令行等非环境的,那么我们就不重新
定义它。于是,在我们的Makefile中,我们可以这样写:
ifdef bletch
ifeq “$(origin bletch)” “environment”
bletch = barf, gag, etc.
endif
endif
当然,你也许会说,使用override关键字不就可以重新定义环境中的变量了吗?为什
么需要使用这样的步骤?是的,我们用override是可以达到这样的效果,可是override
过于粗暴,它同时会把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来
的,而不想重新定义命令行传来的。
八、shell函数
它的参数应该就是操作系统 Shell 的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数返回。于是,我们可以用操作系统命令以及字符串处理命令awk,sed等等命令来生成
一个变量,如:
contents := $(shell cat foo)
files := $(shell echo *.c)
注意,这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果
你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统
性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你
想像的多得多。