目录
1.格式
Makefile 中函数的调用格式如下:
$(function arguments)
其中,function 为函数名,arguments 为参数。
函数名与参数之间由空格或Tab分隔,如果有多个参数,这些参数之间由逗号分隔。
2.常用函数介绍
内核的 Makefile 中用到大量的函数,以下介绍一些常用的函数。
2.1 字符串替换和分析函数
- $(subst from,to,text)
功能:
其中,subst 为 substitude(v 替代) 的缩写。
在字符串 text 中,使用 to 替换每一处 from.
返回:替换过后产生的新的字符串。
举例:
$(subst ee,EE,feet on the street)
返回结果:
fEEt on the strEET
- $(patsubst pattern,replacement,text)
功能:
其中,patsubst 为 pattern 和 substitude 的缩写。
查找 text 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 pattern ,如果匹配
的话,则以 replacement 替换。这里, pattern 可以包括通配符“%”,表示任意长度的字串。如果
replacement 中也包含“%”,那么replacement 中的这个“%”将是 pattern 中的那个“%”所代表的字串。
(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)。
返回:替换过后产生的新的字符串。
举例:
$(patsubst %.c,%.o,x.c.c bar.c)
返回结果:
x.c.o bar.o
一种更为简单的批量替换文件后缀的方法–变量的替换引用
$(VAR:PATTERN=REPLACEMENT)
它相当于 $(patsubst PATTERN,REPLACEMENT,$(VAR))
举例:
假设有变量定义为“objects = foo.o bar.o baz.o”。为了得到这些.o文件所对应的.c源文件。
我们可以使用以下两种方式的任意一个:
$(objects:.o=.c)
$(patsubst %.o,%.c,$(objects))
- $(strip string)
功能:
strip意为“脱去”
去除 string 中前导和结尾的空格,并将中间的多个空格压缩为一个空格。
返回:脱掉冗余空格之后的新的字符串。
举例:
$(strip a b c)
返回结果:
a b c
- $(findstring find,in)
功能:
在字符串 in 中搜寻 find ,如果找到,则返回值是传入的参数 find, 否则返回值为空。
举例:
$(findstring a,a b c)
返回结果:
a
举例:
$(findstring a,b c)
返回结果:
- $(filter pattern…,text)
功能:
过滤掉 text 中不符合 pattern 的字符串
举例:
$(filter %.c %.s,foo.c bar.c baz.s ugh.h)
返回结果:
foo.c bar.c baz.s
- $(filter-out pattern…,text)
功能:
$(filter pattern…,text) 的反函数,过滤掉 text 中符合 pattern 的字符串。
举例:
$(filter %.c %.s,foo.c bar.c baz.s ugh.h)
返回结果:
ugh.h
- $(sort list)
功能:
将 list 中的单词以首字母为准进行升序排序,并去掉重复的单词。
举例:
$(sort foo bar lose foo)
返回结果:
bar foo lose
2.2 文件名函数
- $(dir names…)
功能:
从文件名序列 names… 中取出各个文件名的目录部分。文件名的目录部分就是包含在文件名中的最后一个
斜线(“/”)(包括斜线)之前的部分。如果没有反斜杠,那么返回./。
举例:
$(dir src/foo.c hacks)
返回结果:
src/ ./
- $(notdir names…)
功能:
从文件名序列 names 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分,即文件名
举例:
$(notdir src/foo.c hacks)
返回结果:
foo.c hacks
- $(basename names…)
功能:
抽取 names 中每一个文件名中除后缀外的一切字符
举例:
$(basename src/foo.c src-1.0/bar hacks)
返回结果:
src/foo src-1.0/bar hacks
- $(addsuffix suffix,names…)
功能:
添加后缀
举例:
$(addsuffix .c foo bar)
返回结果:
foo.c bar.c
- $(addprefix prefix,names…)
功能:
把前缀 prefix 加到 names 中的每个单词后面
举例:
$(addprefix src/,foo bar)
返回结果:
src/foo src/bar
2.3 其他函数
- $(foreach var,list,text)
功能:
把参数 list 中的单词逐一取出放到参数 var 所指定的变量中,然后再执行 text 所包含的表达式。每
一次 text 会返回一个字符串,循环过程中,text 的所返回的每个字符串会以空格分隔,最后当整个循
环结束时, text 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
举例:
names := a b c d
files := $(foreach n,$(names),$(n).o)
返回结果:
a.o b.o c.o d.o
- $(if condition,then-part)
功能:
或是 $(if condition,then-part,else-part)
if 函数可以包含 else 部分,或是不含。即 if 函数的参数可以是两个,也可以是三个。 condition
参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是, then-part
会被计算,否则 else-part 会被计算。
而 if 函数的返回值是,如果condition 为真(非空字符串),那个 then-part 会是整个函数的返回
值,如果 condition 为假(空字符串),那么 else-part 会是整个函数的返回值,此时如果
else-part 没有被定义,那么,整个函数返回空字串。
所以,then-part 和 else-part 只会有一个被计算。
- $(origin variable)
功能:
origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的。
注意, variable 是变量的名字,不应该是引用。所以你最好不要在 variable 中使用$字符。
Origin 函数会以其返回值来告诉你这个变量的“出生情况”。
返回值:
undefined 如果 variable 从来没有定义过,origin 函数返回这个值。
default 如果 variable 是一个默认的定义,比如“CC”这个变量。
environment 如果 variable 是一个环境变量,并且当 Makefile 被执行时, -e 参数没有
被打开。
file 如果 variable 这个变量被定义在 Makefile 中。
command line 如果 variable 这个变量是被命令行定义的。
override 如果 variable 是被 override 指示符重新定义的。
automatic 如果 variable 是一个命令运行中的自动化变量。
- $(shell command argument)
功能:
相当于在 shell 中执行 command argument。
3. 转载地址
https://www.cnblogs.com/outs/p/7147206.html