Makefile patsubst 学习
这个函数用于进行模式替换,它接受三个参数:
- 第一个参数是查找模式;
- 第二个参数是替换模式;
- 第三个参数是单词列表。
例如:
FOO = foo1.c foo2.c bar.c
BAR = $(patsubst %.c,%.o,$(FOO))
all:
@echo $(BAR)
执行make all后,会在命令行中打印foo1.o foo2.o bar.o
:
[06:54:35] (*^~^*) ~/workbase/test> make all
foo1.o foo2.o bar.o
示例2
OBJS := trace32.o
DIRS :=
上面写法可以替换为:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
DIRS :=
让我们分解这行脚本的不同部分来理解它是如何工作的:
objs
:这是一个 Makefile 变量,你可以在 Makefile 的其他地方通过$(objs)
引用它。:=
:这是一个简单的赋值操作,它会立即评估右侧的表达式,并将结果赋值给变量objs
。与之相对的是=
,它在每次使用变量时才会对右侧的表达式进行评估。$(patsubst pattern,replacement,text)
:这是一个 Makefile 函数,用于模式字符串替换。它会在text
中查找匹配pattern
的词,并将其替换为replacement
。%.c
:这是一个模式,%
是一个通配符,匹配任何字符串。%.o
:这是替换后的结果,它会将模式中匹配到的部分(即%
部分)保留,并将.c
后缀替换为.o
。
$(wildcard *.c)
:又是一个 Makefile 函数,用于列出所有当前目录下匹配通配符模式*.c
的文件。在这个例子中,它会列出所有.c
后缀的文件。
综合以上内容,这行脚本的工作流程是:
- 使用
wildcard
函数找到当前目录下所有的.c
源文件。 - 将找到的每个
.c
文件名传给patsubst
函数。 patsubst
函数将每个.c
后缀替换为.o
后缀。- 最后,所有替换后的文件名被赋值给
objs
变量。
举例来说,如果当前目录下有 main.c
和 utils.c
两个文件,那么 objs
变量将会被赋值为 main.o utils.o
。这个变量通常被用在 Makefile 的编译规则中,来指定所有的 .o
文件,这样你就可以使用一个规则来构建所有的目标文件。