在嵌入式开发过程中,经常和Makefile打交道,今天总结下Makefile中最常用的三个函数:

1、wildcard:扩展通配符函数

经常可以看到这样的用法src=$(wildcard *.c),匹配所有.c文件,列表赋值给src

2、notdir:去掉目标的路径函数

经常可以看到这样用dir=$(notdir $(wildcard ./sub/*.c)),目的是去除掉./sub/ 路径

3、patsubst:替换通配符函数

经常可以看到这样用obj=$(patsubst %.c,%.o,$(wildcard *.c)),目的是将.c文件替换.o


下面举例说明三个函数的用法:


1)创建目录test :mkdir test

2)test下创建两个文件a.c b.c:touch a.c b.c

3)test下创建sub目录:mkdir sub

4)sub下创建两个文件sa.c sb.c:touch sa.c sb.c

5)test创建Makefile文件


src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(wildcard *.c ./sub/*c))
obj=$(patsubst %.c,%.o,$(dir))
all:
@echo $(src)
tdir:
@echo $(dir)
tobj:
@echo $(obj)

运行结果:

1)make all或者make(默认make匹配 all伪目标) 

a.c b.c ./sub/sa.c ./sub/sb.c

2)make tdir

a.c b.c sa.c sb.c

3)make tobj

a.o b.o sa.o sb.o


另外:@echo 和echo 的区别:前者隐藏命令,后者不隐藏命令


如果将@去掉后运行结果:

1)make all或者make

echo a.c b.c ./sub/sa.c ./sub/sb.c

a.c b.c ./sub/sa.c ./sub/sb.c

2)make tdir

echo a.c b.c sa.c sb.c

a.c b.c sa.c sb.c

3)make tobj

echo a.o b.o sa.o sb.o

a.o b.o sa.o sb.o