Living@Greatwall

Makefile函数

利用Makefile自带的函数能更一部精简我们的Makefile的编写,下面介绍一下常用的几个函数。

1. 通配符函数wildcard

Makefile中通配符扩展是在规则中自动进行的,但是如果要对一个变量进行类似的操作时,我们就需要使用这个wildcard 这个函数来进行扩展,用法如下: $(wildcard pattern...) 这个函数会将符合这个pattern模式的所有文件以空格为分隔符列出来,例如我们要获取src目录下所有的.c文件,则实现为: SRC = $(wildcard *.c) 假设src目录下有a.c和b.c两个文件,那么SRC相当于如下: SRC = a.c b.c

2. 字符串操作函数

常用的有notdir, subst, patsubst, strip, filter, findstring等。

1) $(notdir text) notdir用于去掉字符串中路径名,如:

NO_DIR = $(notdir src/a.c)

也就等同于:

NO_DIR = a.c

2) $(patsubst pattern, replacement, text) patsubst用于将字符串text中符合pattern的字串替换为replacement字串,如:

OBJS = $(patsubst %.c,%.o, a.c b.c)

则相当于:

OBJS = a.o b.o

3) $(subst from, to, text) subst用于将text中from字串替换为to字串,如:

OBJS = $(subst ee,EE, feet on the street)

也就相当于:

OBJS = fEEt on the strEEt

下面来通过一个例子来说明如何利用上面的函数来精简我们的Makefile。假设我们有个项目prj,c源代码都放在src目录中, 头文件都放在include目录下,我们想让生成的目标文件都在objs目录下,文件组织如下:

+++prj/
+++++++src/
+++++++include/
+++++++objs/
+++Makefile

此时我们可在Makefile中加上如下:

SRC = $(wildcard prj/*.c)
NO_DIR_SRC = $(notdir $(SRC))
OBJS = $(patsubst %.c, objs/%.o, $(NO_DIR_SRC))

这要我们就很方便的得到了SRC和OBJS。

References:

https://www.gnu.org/software/make/manual/