makefile 函数格式:
# 基本格式: $(函数名, 参数列表...)
# 形参列表:不同参数之间使用逗号隔开
$(<function>, <argument1>, <argument2> ...)
参考文章:Makefile函数 - 腾讯云开发者社区-腾讯云
目录
一、名称处理函数
1、wildcard —— 获取指定格式的文件列表
原型(不同格式之间使用空格隔开)
$(wildcard <pattern...>)
示例:获取当前目录下所有的 .cpp 文件和 test目录下所有的 .cpp 文件
$(wildcard *.cpp test/*.cpp)
2、dir —— 获取文件所在目录
获取文件所在目录,本质是获取最后一个反斜杠 '/' 以前的内容。如果没有反斜杠 '/' ,返回 ./
$(dir <names...>) # 不同文件名之间以空格隔开
示例:
$(dir src/foo.c sum.txt)
3、notdir —— 获取文件路径非目录部分
获取一个文件路径的非目录部分,也可以理解为获取文件名(含后缀),本质是获取最后一个反斜杠 '/' 之后的内容。如果没有反斜杠,直接返回本身。
$(notdir <names...>)
示例:
$(notdir src/foo.c sum.txt)
4、suffix —— 获取文件后缀
取出文件名的后缀,如果文件无后缀,返回空字符。注意其本质并非是单纯获取到最后一个点符号 '.' 之后的内容。
$(suffix <names…>)
示例:
$(suffix src/foo.c src-1.0/bar.c hacks)
5、basename —— 去除文件后缀
$(basename <names...>)
示例:
$(basename src/foo.c src-1.0/bar.c hacks)
二、字符串替换与分析函数
1、subst —— 直接替换字符
subst 直接将 <text> 中的字符 <src> 替换为字符 <dst>。
$(subst <src>,<dst>,<text>)
示例:注意逗号两边不要有空格
$(subst aa,AA,aabbaa aAfd)
2、patsubst —— 按格式替换字符
patsubs 函数的作用是使用目标字符(格式)替换源字符(格式),函数返回替换以后的结果,常常搭配通配符 % 使用,% 表示任意长度的字串,如果 <src_pattern> 和 <dst_pattern> 都包含 % ,那么此时 % 表示的字符内容是一样的。
函数调用原型如下:
# 将 <text> 中的 源格式 <src_pattern> 替换成目标格式 <dst_pattern>
ret = $(patsubst <src_pattern>,<dst_pattern>,<text>)
示例:将所有满足后缀为 .cpp 格式的字符串替换为 后缀为 .o 格式
$(patsubst %.cpp,%.o,add.cpp bar.cpp)
3、strip —— 去掉开头和结尾的空白字符
这里所说的空白字符可以是 空格键 或者 Tab 产生的
$(strip <string>)
示例:
$(strip, add.cpp bar.cpp )
4、findstring —— 在某个字串中查找指定字符串
在字符串 <src> 中查找目标字符或者字符串 <dst>,如果找到了就返回对应字符,如果没有找到返回空字符。
$(findstring <dst>,<src>)
示例:
$(findstring a,a b c)
5、filter —— 保留指定格式的字符串
保留指定格式的字符串,指定的格式可以有多个,返回保留的字符串
$(filter <pattern...>,<text>)
示例:
sources := foo.c bar.c baz.s ugh.h
result := $(filter %.c %.s,${sources})
6、filter-out —— 去除指定格式的字符串
去除指定格式的字符串,指定的格式可以有多个,返回去除以后的结果
$(filter-out <pattern...>,<text>)
三、控制函数(信息打印函数)
1、info —— 打印提示信息
向标准输出打印文本 <text> ,用于输出调试信息,make继续执行
$(info <text>)
示例:
$(info some debug info)
2、warning —— 打印报警信息
向标准输出打印文本 <text> ,用于输出警告信息。make继续执行
$(warning <text>)
示例:
$(warning some warning info)
3、errror —— 打印错误信息
向标准错误输出打印文本 <text> ,用于输出指明错误信息。make停止执行。
$(error <text>)
示例:
$(error some error info)
四、其他函数
1、foreach —— 循环函数
将 <list> 中的参数逐一取出放到 <var> 变量中,然后再执行 <expression> 中的表达式。
- 循环执行中:每执行一次循环都会返回一个字符串,foreach循环会将返回的字符串汇总,不同字符串通过空格分隔
- 循环执行结束:当整个循环结束的时候,返回汇总的字符串(不同字串以空格分隔)
$(foreach <var>,<list>,<text>)
示例:
names := a b c d
files := $(foreach n,${names},$(n).o)
2、call —— 调用函数
makefile中可以自定义函数,call 的作用就是调用自定义的函数或者表达式,也可以传参调用,关于函数的自定义和调用,可以参考:
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
3、shell —— 执行命令行命令
shell 可以执行操作系统的shell命令,返回的是命令行命令的执行结果
shell <commands>
示例:
$(shell ps ajx | grep test)
4、eval
eval 可以将 <text> 中的内容作为makefile的一部分,然后按照makefile的语法解析这些内容,无返回值。该函数在执行时会对参数展开两次,可以理解为第一次是eval函数检查<text>语法,第二次是解析 <text>内容。
$(eval <text>)