1.2 patsubst 函数

patsubst 函数是一个字符串替换相关的函数。它可以根据由百分号(%)通配符组成模式来对目标字符串进行替换。

调用格式:

$(patsubst 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})

参数 patternreplacement 要使用通配符则只能使用百分号通配符(%)。

实验:

将上述示例中的 OBJECTS := $(patsubst %.c,%.o,${SOURCES}) 改写为 OBJECTS := $(SOURCES:%.c=%.o),然后运行 make 命令查看运行结果有何不同?