1.2 patsubst 函数
patsubst 函数是一个字符串替换相关的函数。它可以根据由百分号(%)通配符组成模式来对目标字符串进行替换。
调用格式:
$(patsubst pattern,replacement,text)
说明:
- pattern 通常是含有百分号(
%)通配符的字符串。 - replacement 是要替换的文字,内部可以使用 百分号(
%)通配符来代替匹配的内容。 - text 是要匹配的字符串。
- 此函数返回替换后的字符串
如:
OBJECTS := $(patsubst %.c,%.o,file1.c file2.c main.c)
替换后的 OBJECTS 变量的值为 file1.o file2.o main.o
示例:
使用 patsubst 函数,根据变量 SOURCES 中的 .c 文件组成的列表动态生成 .o 文件的列表,并存储到变量 OBJECTS 中。
改写后的 Makefile 如下
.PHONY: all clean
SOURCES := $(wildcard *.c)
HEADERS := ${wildcard *.h}
# 使用 SOURCE 中的值生成目标文件
OBJECTS := $(patsubst %.c,%.o,${SOURCES})
TARGET := myapp
CC = gcc
CFLAGS = -g -Wall
all: $(TARGET)
$(TARGET) : $(OBJECTS)
gcc -o $@ $^
%.o : %.c $(HEADERS)
gcc -o $@ -c $<
clean:
rm $(OBJECTS)
使用 make 编译结果如下:
weimingze@mzstudio:~/myapp$ make
gcc -o file1.o -c file1.c
gcc -o file2.o -c file2.c
gcc -o main.o -c main.c
gcc -o myapp file1.o file2.o main.o
从结果上看 make 执行编译的结果和之前没有任何区别,但此时的 Makefile 更加通用。在项目文件夹中新增 .c 和 .h 文件时,几乎可以不用改写 Makefile 文件。
字符替换的简洁写法:
上述 Makefile 中,$(patsubst %.c,%.o,${SOURCES}) 这个字符串替换函数有一种简洁的写法 $(SOURCES:%.c=%.o),即:
$(text:pattern=replacement)
等同于
$(patsubst pattern,replacement,${text})
参数
pattern和replacement要使用通配符则只能使用百分号通配符(%)。
实验:
将上述示例中的 OBJECTS := $(patsubst %.c,%.o,${SOURCES}) 改写为 OBJECTS := $(SOURCES:%.c=%.o),然后运行 make 命令查看运行结果有何不同?