makefile 函数格式:
# 基本格式: $(函数名, 参数列表...)
# 形参列表:不同参数之间使用逗号隔开
$(<function>, <argument1>, <argument2> ...)
参考文章:Makefile函数 - 腾讯云开发者社区-腾讯云
目录
3、$(C_SOURCES:.c=.o) —— 按指定格式替换后缀
一、名称处理函数
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、$(C_SOURCES:.c=.o) —— 按指定格式替换后缀
和上面 patsubst 达到的效果是一样的,只不过这里的写法更加简单,通常用于替换文件后缀,这里所表达的意思是:将 C_SOURCES 变量中所有 .c 后缀替换成 .o 。
比如 C_SOURCES 中包含的是
file1.c file2.c file3.c
那么最后会被替换成
file1.o file2.o file3.o
4、strip —— 去掉开头和结尾的空白字符
这里所说的空白字符可以是 空格键 或者 Tab 产生的
$(strip <string>)
示例:
$(strip, add.cpp bar.cpp )
5、findstring —— 在某个字串中查找指定字符串
在字符串 <src> 中查找目标字符或者字符串 <dst>,如果找到了就返回对应字符,如果没有找到返回空字符。
$(findstring <dst>,<src>)
示例:
$(findstring a,a b c)
6、filter —— 保留指定格式的字符串
保留指定格式的字符串,指定的格式可以有多个,返回保留的字符串
$(filter <pattern...>,<text>)
示例:
sources := foo.c bar.c baz.s ugh.h
result := $(filter %.c %.s,${sources})
7、filter-out —— 去除指定格式的字符串
去除指定格式的字符串,指定的格式可以有多个,返回去除以后的结果
$(filter-out <pattern...>,<text>)
示例: 去掉所有的 .h 文件
sources := foo.c bar.c baz.s ugh.h
result := $(filter %.h,${sources})
8、addprefix —— 为字符串添加前缀
该函数用于向字符串列表中的每个字符串添加指定的前缀。可以是添加路径前缀,也可以添加字符前缀。比如我们要在 所有文件名之前添加路径前缀。
OBJ_FILES = main.o util.o helper.o
PREFIXED_OBJ_FILES = $(addprefix obj/,$(OBJ_FILES))
此时 PREFIXED_OBJ_FILES 的输出如下:
obj/main.o obj/util.o obj/helper.o
三、控制函数(信息打印函数)
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>)