一、概述
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 中快速、灵活地对文件名进行处理。