在Makefile中,patsubst
和wildcard
函数是两个非常实用的工具,它们可以帮助我们更方便地进行文件名模式匹配和替换,下面我们就来详细介绍一下这两个函数的用法。
patsubst函数
1、功能介绍
patsubst
函数用于根据指定的模式和替换字符串,对文件名进行替换,它的原型如下:
$(patsubst pattern,replacement,string)
pattern
是要匹配的模式,replacement
是替换后的字符串,string
是需要进行替换操作的原始字符串。
2、使用方法
下面我们通过一个例子来说明如何使用patsubst
函数,假设我们需要将所有的.c
文件替换为.cpp
文件,可以使用以下Makefile规则:
%.o: %.c $(CXX) $(CPPFLAGS) -c $< -o $@ $(LDFLAGS)
在这个规则中,我们使用了%.o: %.c
作为目标文件和源文件的依赖关系,接下来,我们需要将.c
文件替换为.cpp
文件,这时,我们可以使用patsubst
函数来实现这个需求:
%.o: %.c | %.cpp $(CXX) $(CPPFLAGS) -c $< -o $@ $(LDFLAGS)
这里,我们使用了管道符|
将两个模式连接起来,表示当存在.c
或.cpp
文件时,都需要执行后续的命令,这样,无论输入的是.c
还是.cpp
文件,输出的目标文件名都会被替换为对应的.cpp
文件名。
wildcard函数
1、功能介绍
wildcard
函数用于获取指定目录下的所有文件和文件夹列表,它的原型如下:
$(wildcard pattern)
pattern
是要匹配的文件名模式。
2、使用方法
下面我们通过一个例子来说明如何使用wildcard
函数,假设我们需要获取当前目录下所有的.c
和.cpp
文件,可以使用以下Makefile规则:
all: $(patsubst %.cpp,%.o,$(wildcard *.cpp)) $(patsubst %.c,%.o,$(wildcard *.c))
在这个规则中,我们首先使用wildcard *.cpp
获取当前目录下所有的.cpp
文件,然后使用patsubst %.cpp,%.o,$(wildcard *.cpp)
将这些文件名替换为对应的.o
文件名,同样的方法也适用于.c
文件,我们使用这两个列表作为目标文件和源文件的依赖关系。
相关问题与解答
问题1:如何使用wildcard
函数获取指定目录下的所有子目录?
答案:wildcard
函数只能获取文件和文件夹列表,无法直接获取子目录,如果需要获取子目录,可以在脚本中使用其他方法,例如Python的os模块或者shell命令。