patsubst详解

发布时间:2023-05-20

一、概述

patsubst 是 GNU Make 中的字符串操作函数,用于将文件名中的模式进行字符串替换,得到新的文件名。它的格式如下:

$(patsubst PATTERN,REPLACEMENT,TEXT)

其中,PATTERN 是需要被替换的模式,REPLACEMENT 是用于替换的字符串,TEXT 是源字符串。patsubst 会扫描 TEXT,找到其中与 PATTERN 匹配的部分,并将它们替换成 REPLACEMENT,生成新的字符串。

二、基础用法

我们来看一个简单的例子:

$(patsubst %.c, %.o, foo.c bar.c)

这个语句的作用是,将字符串 "foo.c bar.c" 中所有以 .c 结尾的部分替换成以 .o 结尾的字符串,生成 "foo.o bar.o"。这在编译 C 程序时非常常见。 patsubst 也支持将模式中的通配符(%)进行替换,例如:

$(patsubst %hello, %world, hello kitty bonjour hello)

这个语句的作用是,将字符串 "hello kitty bonjour hello" 中所有以 hello 结尾的部分替换成以 world 结尾的字符串,生成 "world kitty bonjour world"

三、高级用法

1. 多个模式和替换字符串

patsubst 也支持多个模式和替换字符串的操作,例如:

$(patsubst %.c, %.o, $(wildcard *.c))

这个语句的作用是,将当前目录下所有以 .c 结尾的文件名替换成以 .o 结尾的文件名,并返回替换后的文件名列表。

2. 去掉前缀和后缀

patsubst 还可以用于去掉前缀和后缀,例如:

$(patsubst src/%.c, obj/%.o, $(wildcard src/*.c))

这个语句的作用是,将 src 目录下所有以 .c 结尾的文件名替换成 obj 目录下以 .o 结尾的文件名,生成替换后的文件名列表。 另外,还可以用 patsubst 去掉文件名的后缀,例如:

$(patsubst %.o, %.c, foo.o bar.o)

这个语句的作用是,将字符串 "foo.o bar.o" 中所有以 .o 结尾的部分替换成以 .c 结尾的字符串,生成 "foo.c bar.c"

3. 混合使用

patsubst 还可以和其他函数一起使用,例如:

$(addprefix obj/, $(patsubst %.c, %.o, $(wildcard src/*.c)))

这个语句的作用是,先找到 src 目录下所有以 .c 结尾的文件,然后将它们替换成以 .o 结尾的文件,在文件名前面加上 "obj/" 前缀,生成一个对象文件列表。

四、结论

patsubst 是 GNU Make 中一个非常常用且非常强大的字符串操作函数,它可以帮助我们在 Makefile 中快速、灵活地对文件名进行处理。