系统地介绍了Makefile中常用函数的用法,包括字符串处理、文件名处理、条件函数和输出函数等多个方面。通过详细的示例和说明,读者能够了解每个函数的语法和用途。
1. 函数
1.1 函数的调用方法
函数以$开头,其余部分被()
或{}
包裹。
$(function args1,args2,....) |
function:函数名
args:函数参数,每个函数需要的参数个数不一样,参数之间用逗号隔开
1.2 函数分类
make里的函数大致分为字符串处理函数,文件名处理函数,条件函数,信息输出函数和一些其他函数。
1.3 自定义函数
make支持自定义函数,你可以使用自定义函数实现各种功能,但这跟我对make的使用理念相违背,我认为makefile的内容应该是简单明了,让人一目了然的,所以个人并没有对自定义函数有过多的学习,想要深入学习的朋友可以参考一些其他教程。
在函数的示例代码里我会使用info函数,它是一个简单的用于信息输出函数,格式为$(info something),你可以在something的位置放置任何你想输出的内容。
2.字符串处理函数
2.1 subst
作用:text里的所有old都会被替换成new
语法:$(subst old,new,text)
返回值:被替换后的文本
示例:把.c替换成.o
var1 = demo1.c demo2.c demo3.c |
2.2 patsubst
作用:模式替换
语法:$(patsubst pattern, replacement, text)
- pattern:需要替换的模式
- replacement:需要替换为
- text:待处理文本
返回值:被替换后的文本
示例:
var1 = demo1.c demo2.c demo3.c |
2.3 strip
作用:去除前后的空格
语法:$(strip text)
返回值:去除后的问文本
示例:
var1 = xx demo1.c demo2.c |
2.4 findstring
作用:查找字符串
语法:$(findstring 需查找的字符串,待查找的list)
返回值:如果找到了,则返回对应的字符串,如果没找到,则反回空串
示例:
var1 = demo1.c demo2.c demo3.c |
2.5 filter
作用:过滤字符串,把符合模式的字符串都返回,如果没有,为空
语法:$(filter 模式1 模式2 ... ,list)
返回值:空/符合的字符串
示例:
var1 = demo1.c demo2.c demo1.h demo2.h demo1.o demo2.o |
2.6 filter-out
作用:与filter相反,保留不符合的
语法:$(filter-out 模式1 模式2 ... ,list)
返回值:不符合任何一个模式的内容
示例:
var1 = demo1.c demo2.c demo1.h demo2.h demo1.o demo2.o |
2.7 sort
作用:将list内容按照字典序排序,移除重复项
语法:$(sort list)
示例:
var1 = aa aa ab bb c d |
2.8 word
作用:取出list里的某个元素,n从1开始。
语法:$(word n,list)
返回值:word里的一个元素。n<=0, 报错。n > 列表项数,空
示例:
var1 = a b c d e |
2.9 wordlist
作用:返回文本指定范围内的单词列表
语法:$(wordlist start,end,list)
返回值:start>0,否则error。 end无要求,大于列表的
示例:
var1 = a b c d e |
2.10 words
作用:返回列表中的字符串个数
语法:$(words list)
返回值:一个数字
示例:
var1 = a b c d e |
2.11 firstword
作用:返回第一项
语法:$(firstword list)
示例:
var1 = a b c d e |
2.12 lastword
作用:返回最后一项
语法:$(lastword list)
示例:
var1 = a b c d e |
3.文件名处理函数
3.1 dir
作用:返回目录名,就是把文件名去掉
语法:$(dir text)
返回值:目录名
示例:
var1 = demo/a.c c.c |
3.2 notdir
作用:获取文件名
语法:$(notdir text)
返回值:文件名
示例:
var1 = demo/a.c c.c |
3.3 suffix
作用:返回文件的扩展名
语法:$(suffix text)
返回值:文件的扩展名
示例:
var1 = demo/a.c c.c |
3.4 basename
作用:返回文件的名称,就是去除文件的扩展名,会保留路径
语法:$(basename text)
返回值:
示例:
var1 = demo/a.c c.c a |
3.5 addsuffix
作用:为列表里的每一项都添加后缀名
语法:$(addsuffix suffix,list)
返回值:添加完后的列表
示例:
var1 = a b c d |
3.6 addprefix
作用:
语法:$(addprefix prefix,list)
示例:
var1 = a b c d |
3.7 join
作用:把第二个list的内容添加到第一个后,一一对应,如果数量不相等,直接放进去
语法:$(join list1,list2)
示例:
var1 = a b c d e |
3.8 wildcard
作用:返回符合通配符的文件列表,在当前目录下查找
语法:$(wildcard pattern)
示例:
var1 = $(wildcard %.c) #当前路径下的.c文件 |
3.9 realpath
作用:返回文件的绝对路径。如果文件不存在,就不返回相关的东西。
语法:$(realpath files)
示例:
var1 = demo.c |
3.10 abspath
作用:返回文件的绝对路径。如果文件不存在,就返回当前目录的绝对路径。
语法:$(abspath files)
示例:
var1 = demo.c |
4. 条件函数
4.1 if
作用:如果条件不为空,就返回第一部分,为空,返回第二部分
语法:$(if condition,then-part,else-part)
示例:
var1 = $(if ,1 2 3 ,4 5 6 ) |
4.2 or
作用:返回第一个不为空的变量。如果全都为空,返回空
语法:$(or condition1,condition2,....)
示例:
var1 = |
4.3 and
作用: 如果条件中有一个为空串,则返回空,如果全都不为空,则返回最后一个条件。
语法:$(and condition1,condition2,...)
示例:
var1 = 000 |
5. 输出函数
5.1 info
作用: 打印一些信息
语法:$(info something)
示例:
$(info 使用info) |
5.2 warning
作用: 打印警告信息,带行号,但不会终止
语法:$(warning something)
示例:
$(info 使用info) |
5.3 error
作用: 打印错误信息,带行号,并终止make运行
语法:$(error something)
示例:
$(info 使用info) |
foreach
作用:对每一项进行操作,把操作的结果返回给接收的变量
语法:$(foreach each,list,op)
示例:
list = 1 2 3 4 5 |
file
作用:读写文件。覆盖写入:> 追加:>> 读取:<
语法:$(file op filename,text)
示例:
result1 = $(file > demo1,text1) # 覆盖写入,无返回 |
eval
作用:把一段文本当作makefile内容
语法:$(eval $(text))
示例:
define var = |
shell
作用:把shell的值作为返回值
语法:$(shell shell指令)
示例:
var = $(shell ls -al) |