首页 > 代码库 > Makefile常用函数
Makefile常用函数
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/ ./
注意:以上例子中其实是两个文件 src/foo.c 和 ./hacks
- $(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。
Makefile常用函数