【makefile函数】makefile 常用函数汇总

文章详细介绍了Makefile中的各种函数,包括名称处理函数如wildcard、dir、notdir等,字符串替换与分析函数如subst、patsubst,以及控制函数如info、warning、error。这些函数在构建自动化过程中的文件管理和信息输出方面起着关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

makefile 函数格式:

# 基本格式: $(函数名, 参数列表...)
# 形参列表:不同参数之间使用逗号隔开
$(<function>, <argument1>, <argument2> ...)

参考文章:Makefile函数 - 腾讯云开发者社区-腾讯云


目录

一、名称处理函数

1、wildcard —— 获取指定格式的文件列表

2、dir —— 获取文件所在目录

3、notdir —— 获取文件路径非目录部分

4、suffix —— 获取文件后缀

5、basename —— 去除文件后缀

二、字符串替换与分析函数

1、subst —— 直接替换字符

2、patsubst —— 按格式替换字符

3、$(C_SOURCES:.c=.o) —— 按指定格式替换后缀

4、strip —— 去掉开头和结尾的空白字符

5、findstring —— 在某个字串中查找指定字符串

6、filter —— 保留指定格式的字符串

7、filter-out —— 去除指定格式的字符串

8、addprefix —— 为字符串添加前缀

三、控制函数(信息打印函数)

1、info —— 打印提示信息

2、warning —— 打印报警信息

3、errror —— 打印错误信息

四、其他函数

1、foreach —— 循环函数

2、call —— 调用函数

3、shell —— 执行命令行命令

4、eval 


一、名称处理函数

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>)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值