【makefile笔记】patsubst和wildcard函数使用小结

文章介绍了Makefile中wildcard和patsubst两个重要函数的用法。wildcard函数用于获取匹配特定模式的所有文件列表,解决通配符在函数中无法展开的问题。patsubst函数则根据指定模式进行字符串替换,常用于源文件到目标文件的转换。通过一个示例项目,演示了这两个函数的配合使用,展示了如何正确处理和展开通配符来生成目标文件列表。

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

0x00 前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

0x01 makefile函数调用语法

makefile函数调用原型:

$(<function> <arguments>)
#或
${<function> <arguments>}

函数的调用以$开头,用{}或者()将函数名以及参数包含起来,<function>为函数名,<arguments>为参数,两者之间以空格分隔,若存在多个<arguments>参数,使用,分开。例如:

#subst函数作用是将字符串“maktfilt中”的't'替换为'e',其中函数名为subst ,参数为t,e,maktfilt
$(subst t,e,maktfilt) 

0x02 wildcard函数

wildcard函数调用原型:

$(wildcard <PATTERN...>)

wildcard函数是针对通配符在函数或变量定义中展开无效情况下使用的,用于获取匹配该模式下的所有文件列表,<PATTERN...>参数若有多个则用空格分隔。若没有找到指定的匹配模式则返回为空。
例如:

#返回make工作下的所有.cpp以及.c文件
$(wildcard *.cpp *.c)

0x03 patsubst函数

patsubst函数调用原型:

$(patsubst  <pattern>,<replacement>,<text>)

patsubst函数返回被替换过后的字符串。patsubst函数判断<text>中字符串(若多个字符串以空格分隔)是否匹配<pattern>模式,若匹配则使用<replacement>替换<text><pattern>可以包括通配符%表示任意长度的字串。如果<replacement>中也包含%,则<replacement>中的这个%将是<pattern>中的那个%所代表的字符串。若字符串中含有%则可以用反斜杠\来转义,即\%来表示真实含义的%字符。

示例:

#把字符串“x.c.c bar.c”符合模式%.c的单词替换成%.o,返回“x.c.o bar.o”。
$(patsubst %.c,%.o,x.c.c bar.c)

0x04 patsubst和wildcard举例

建立一个目录patsubst_wildcard_Demo,新建a.cb.cmakefile文件,并建立一个子目录src,在src中新建src_a.csrc_b.c文件:

$ mkdir patsubst_wildcard_Demo
$ cd ./patsubst_wildcard_Demo
$ touch a.c
$ touch b.c
$ mkdir src
$ touch src_a.c
$ touch src_b.c

patsubst_wildcard_Demo的tree目录如下:

.
├── a.c
├── b.c
├── makefile
└── src
    ├── src_a.c
    └── src_b.c

编写makefie文件内容如下:

DIR_SRC = ./src

SRC_NONE =$(DIR_SRC)/*.c *.c
SRC_WILDCARD = $(wildcard $(DIR_SRC)/*.c *.c)

OBJ_NONE_NONE = $(patsubst %.c,%.o,$(DIR_SRC)/*.c *.c) 
OBJ_WILDCARD_NONE = $(patsubst %.c,%.o,$(wildcard $(DIR_SRC)/*.c *.c))

OBJ_NONE = $(patsubst %.c,%.o,$(SRC_NONE)) 
OBJ_WILDCARD = $(patsubst %.c,%.o,$(wildcard $(SRC_WILDCARD)))

all:
	@echo $(SRC_NONE)
	@echo $(SRC_WILDCARD)
	@echo $(OBJ_NONE_NONE)
	@echo $(OBJ_WILDCARD_NONE)
	@echo $(OBJ_NONE)
	@echo $(OBJ_WILDCARD)

输出:

$ make
./src/src_a.c ./src/src_b.c a.c b.c
./src/src_a.c ./src/src_b.c a.c b.c
./src/*.o *.o
./src/src_a.o ./src/src_b.o a.o b.o
./src/*.o *.o
./src/src_a.o ./src/src_b.o a.o b.o

可以看出,由于通配符*在函数定义中展开无效,所以OBJ_NONE在使用patsubst函数后echo的输出为./src/*.o *.o。而在OBJ_WILDCARD中使用wildcard函数使得通配符正确展开,最后echo输出了正确结果。

该Demo项目已经上传至github:https://github.com/fyw4/patsubst_wildcard_Demo

在参考文档2中列出了make所支持的函数,在编写makefile文件时可以参考。

以上。

参考文档:
1.makefile中的patsubst_charlie_2010的博客-优快云博客
2.Makefile函数 - 腾讯云开发者社区-腾讯云
3.Makefile中的patsubst和wildcard函数_wildcard 函数中间有多个不能用逗号_Jasonfang0118的博客-优快云博客

(1495条消息) 【makefile笔记】patsubst和wildcard函数使用小结_wangqingchuan92的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值