爱他生活
欢迎来到爱他生活,了解生活趣事来这就对了

首页 > 趣味生活 正文

patsubst(在GNU Make中使用patsubst进行模式替换)

jk 2023-08-21 11:16:20 趣味生活180

在GNU Make中使用patsubst进行模式替换

在GNU Make中,patsubst是一个非常有用的函数,它允许我们可以使用模式替换的方式修改字符串。无论是修改文件名、路径名还是其他形式的字符串转换,patsubst都是一个功能强大的工具。

1. 理解patsubst函数的基本用法

patsubst函数的基本用法非常简单,它的语法如下:

$(patsubst PATTERN, REPLACEMENT, TEXT)

这个函数会在TEXT中查找出现的所有与模式PATTERN匹配的字符串,并将它们替换为REPLACEMENT。下面我们通过一个示例来理解这个函数的基本用法。

src_files := src/main.cpp src/utils/file.cpp src/models/model.cpp
obj_files := $(patsubst src/%.cpp, obj/%.o, $(src_files))

在上述示例中,我们将src_files列表中的每个文件名中的src/前缀替换为obj/前缀,并将结果存储在obj_files变量中。如果src_files中的文件名是src/main.cpp,则经过patsubst处理后,obj_files中的对应项将成为obj/main.o。

2. 使用patsubst进行路径名的转换

patsubst函数在处理路径名时非常有用。我们可以通过patsubst轻松转换目录结构,例如在编译项目时将源文件分别放入不同的目录中,而不需要手动构建目标路径。

SRCS := src/main.cpp src/utils/file_utils.cpp src/models/model.cpp
OBJS := $(patsubst src/%.cpp, obj/%.o, $(SRCS))
obj/%.o: src/%.cpp
    @mkdir -p $(@D)
    $(CXX) -c $< -o $@

在上述示例中,通过使用patsubst函数,我们将SRCS列表中的每个源文件路径从src/目录转换为obj/目录。在编译阶段,我们通过自动创建目标路径的方式,使用make命令自动将所有源文件编译为对应的目标文件。

3. patsubst函数的高级应用

patsubst还可以处理更复杂的字符串替换问题。例如,我们可以使用patsubst函数来自动构建目标文件的依赖关系。

SRCS := src/main.cpp src/utils/file_utils.cpp src/models/model.cpp
OBJS := $(patsubst src/%.cpp, obj/%.o, $(SRCS))
DEPS := $(patsubst src/%.cpp, obj/%.d, $(SRCS))
-include $(DEPS)
obj/%.o: src/%.cpp
    @mkdir -p $(@D)
    $(CXX) -MMD -c $< -o $@
obj/%.d: src/%.cpp
    @mkdir -p $(@D)
    $(CXX) -MM $< -MT $(patsubst obj/%.d, obj/%.o, $@) -MF $@

在上述示例中,我们使用patsubst函数生成了OBJS和DEPS两个变量。其中OBJS变量表示编译产生的目标文件列表,DEPS变量表示每个源文件的依赖关系文件。通过-include命令,我们将自动包含所有DEPS文件,从而在编译时自动处理依赖关系。

总结起来,patsubst函数在GNU Make中是一个非常实用的工具,它允许我们使用模式替换的方式修改字符串,从而实现各种字符串处理工作。无论是路径名转换、文件名修改还是其他字符串替换需求,patsubst都可以帮助我们轻松完成。

猜你喜欢