声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。
参考博客 :
原文链接:http://c.biancheng.net/makefile/
Makefile函数
函数的调用和变量的调用很像。
引用变量的格式为$(变量名)
函数调用的格式如下:
$(<function> <arguments>)
或者是
${<function> <arguments>}
- function 是函数名 , arguments 是函数的参数
Makefile常用字符串函数
把符合某一格式的字符串进行替换 patsubst
$(patsubst <pattern>,<replacement>,<text>)
函数说明:函数功能是查找 text 中的单词是否符合模式 pattern,如果匹配的话,则用 replacement 替换。返回值为替换后的新字符串。
- text:范围
- pattern:寻找的样式
- replaceme:替换的样式
【举例】
OBJ=$(patsubst %.c,%.o,1.c 2.c 3.c)
all:
@echo $(OBJ)
解释:在所有test中查找(1.c 2.c 3.c),是否有符合.c样式的,如果有,替换成.o样式。
结果:
1.o 2.o 3.o
字符串替换函数 subst
$(subst <from>,<to>,<text>)
函数说明:函数的功能是把字符串中的 form 替换成 to,返回值为替换后的新字符串。
- from 替换前文本
- to 替换后文本
- text 替换的范围
【举例】
OBJ=$(subst ee,EE,feet on the street)
all:
@echo $(OBJ)
解释:把这些feet on the street文本中所有的ee替换成EE
结果:
fEEt on the strEEt
整理空格函数 strip
strip
v. 脱光衣服; 脱掉大部分衣服; 扒光…的衣服; 进行脱衣表演; 表演脱衣舞; 除去,剥去(一层); (尤指)剥光;
n. (纸、金属、织物等)条,带; (陆地、海域等)狭长地带; 带状水域; 队服;
$(strip <string>)
函数说明:函数的功能是
- 去掉字符串的开头和结尾的字符串
- 将其中的多个连续的空格合并成为一个空格。
- 返回值为去掉空格后的字符串
OBJ=$(strip a b c)
all:
@echo $(OBJ)
结果:
a b c
查找字符串函数 findstring
$(findstring <find>,<in>)
函数说明:函数的功能是查找 in 中的 find ,如果我们查找的目标字符串存在。
返回值为目标字符串,如果不存在就返回空。
【实例】
OBJ=$(findstring a,a b c)
all:
@echo $(OBJ)
结果:a
过滤函数filter 和 反过滤函数filter-out
过 滤 函 数 f i l t e r 过滤函数filter 过滤函数filter
$(filter <pattern>,<text>)
函数说明:函数的功能是过滤出 text 中符合模式 pattern 的字符串,可以有多个 pattern 。返回值为过滤后的字符串。
OBJ=$(filter %.c %.o,1.c 2.o 3.s)
all:
@echo $(OBJ)
解释:从text文本1.c 2.o 3.s中,过滤出所有的.c和.o文件
结果:
1.c 2.o
反 过 滤 函 数 f i l t e r − o u t 反过滤函数filter-out 反过滤函数filter−out
$(filter-out <pattern>,<text>)
函数说明:函数的功能是功能和 filter 函数正好相反,但是用法相同。
去除符合模式 pattern 的字符串,保留符合的字符串。返回值是保留的字符串。
OBJ=$(filter-out 1.c 2.o ,1.o 2.c 3.s)
all:
@echo $(OBJ)
结果:
3.s
排序函数 sort
$(sort <list>)
函数说明:函数的功能是将 中的单词排序(升序)
OBJ=$(sort foo bar foo foo lost)
all:
@echo $(OBJ)
结果:
bar foo lost
注意:sort会去除重复的字符串。
取单词函数 word
$(word <n>,<text>)
数说明:函数的功能是取出函数
OBJ=$(word 2,1.c 2.c 3.c)
all:
@echo $(OBJ)
Makefile常用文件操作函数
很多情况下需要对文件名进行操作。例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等。
注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待。与该路径上实际有没有文件无关!!!
下述例子均以src/foo.c 和 hacks 两个路径为案例
取目录路径函数 dir
$(dir <names>)
函数说明:
函数的功能是从文件名序列 names 中取出目录部分,
返回值为目录部分,指的是最后一个反斜杠之前的部分。
- 如果没有 names 中没有 “/” ,取出的值为 “./” 。
- 如果没有反斜杠将返回“./”。
【实例】
OBJ=$(dir src/foo.c hacks) #
all:
@echo $(OBJ)
解释:找到src/foo.c的目录 (就是src/),找到hacks的目录(没有写目录路径,默认为./)
结果:
src/ ./
解释:
文件 foo.c 的路径是 “/src”
文件 hacks 的路径 “./”。
取文件名 函数 notdir
$(notdir <names>)
函数说明:
函数的功能是从文件名序列 names 中取出非目录的部分。
非目录的部分是最后一个反斜杠之后的部分。
返回值为文件非目录的部分。
OBJ=$(notdir src/foo.c hacks)
all:
@echo $(OBJ)
结果:
foo.c hacks
取后缀名 函数 suffix
suffix
n. 后缀
$(suffix <names>)
函数说明:
函数的功能是从文件名序列中 names 中取出各个文件的后缀名。
返回值:
- 有后缀名,文件名序列 names 中的后缀序列
- 文件没有后缀名,则返回空字符串。
OBJ=$(suffix src/foo.c hacks)
all:
@echo $(OBJ)
结果:
.c NULL(实际为什么都没有)
取前缀 函数 notdir
$(basename <names>)
函数说明:函数的功能是从文件名序列 names 中取出各个文件名的前缀部分。
- 返回值为被取出来的文件的前缀名
- 如果文件没有前缀名则返回空的字符串
- 如果文件没有后缀名,则整个就是他的前缀名
OBJ=$(notdir src/foo.c hacks)
all:
@echo $(OBJ)
结果:
src/foo hacks
添加后缀名函数 addsuffix
$(addsuffix <suffix>,<names>)
函数说明:函数的功能是把后缀 suffix 加到 names 中的每个单词后面。
OBJ=$(addsuffix .c,src/foo.c hacks)
all:
@echo $(OBJ)
结果:
sec/foo.c.c hack.c
添加前缀名函数 addperfix
$(addperfix <prefix>,<names>)
函数说明:函数的功能是把前缀 prefix 加到 names 中的每个单词的前面。
OBJ=$(addprefix src/, foo.c hacks)
all:
@echo $(OBJ)
结果:
src/foo.c src/hacks
链接函数 join:拼接
$(join <list1>,<list2>)
函数说明:函数功能是把 list2 中的单词对应的拼接到 list1 的后面。
OBJ=$(join src car,abc zxc qwe)
all:
@echo $(OBJ)
一一对应拼接,list1.01-list2.01 list1.02-list2.02 list02.03,对应索引位置拼接。对应位置若为空,则保留多出来的
结果:
srcabc carzxc qwe
获取匹配模式文件名函数 wildcard
$(wildcard PATTERN)
函数说明:函数的功能是列出当前目录下所有符合模式的 PATTERN 格式的文件名。
OBJ=$(wildcard *.c *.h)
all:
@echo $(OBJ)
执行 make 命令,可以得到当前函数下所有的 ".c " 和 “.h” 结尾的文件。
结果:与实际存储的.c和.h文件有关
Makefile中的其它常用函数
foreach
$(foreach <var>,<list>,<text>)
函数的功能是:把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。
每一次<text>会返回一个字符串,循环过程中,<text>的返所返回的每个字符串会以空格分割,最后当整个循环结束的时候,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。
name:=a b c d
files:=$(foreach n,$(names),$(n).o)
all:
@echo $(files)
解释:把name中的a b c d分别放到$(n).o中,最后作为一整个字符串输出
结果:
a.o b.o c.o d.o
if
(if<condition>,<then-part>,<else-part>)
如果condition为真(非空字符串),那么then-part会是整个函数的返回值。
如果condition为假(空字符串),那么else-part将会是这个函数的返回值。
OBJ:=foo.c
OBJ:=$(if $(OBJ),$(OBJ),main.c)
all:
@echo $(OBJ)
call 创建新的参数化的函数\
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
当 make 执行这个函数的时候,expression参数中的变量
(
1
)
、
(1)、
(1)、(2)、$(3)等,会被参数parm1,parm2,parm3依次取代。
而expression的返回值就是 call 函数的返回值。
reverse = $(1) $(2)
foo = $(call reverse,a,b)
all:
@echo $(foo)
结果:
a b
reverse = $(2) $(1)
foo = $(call reverse,a,b)
all:
@echo $(foo)
结果:
b a
origin 寻找变量的来源
$(origin <variable>)
origin的返回值:
- “undefined”:如果从来没有定义过,函数将返回这个值。
- “default”:如果是一个默认的定义,比如说“CC”这个变量。
- “environment”:如果是一个环境变量并且当Makefile被执行的时候,“-e”参数没有被打开。
- “file”:如果这个变量被定义在Makefile中,将会返回这个值。
- “command line”:如果这个变量是被命令执行的,将会被返回。
- “override”:如果是被override指示符重新定义的。
- “automatic”:如果是一个命令运行中的自动化变量。