1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir Calc
$ cd Calc
$ mkdir sub
在Calc下,建立add.cpp, mul.cpp, div,cpp, main.cpp 5个文件,在sub目录下,建立sub.cpp文件
建立一个简单的Makefile
src=
(
w
i
l
d
c
a
r
d
∗
.
c
p
p
.
/
s
u
b
/
∗
.
c
p
p
)
d
i
r
=
(wildcard *.cpp ./sub/*.cpp) dir=
(wildcard∗.cpp./sub/∗.cpp)dir=(notdir
(
s
r
c
)
)
o
b
j
=
(src)) obj=
(src))obj=(patsubst %.cpp,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo “end”
执行结果分析:
第一行输出:
./div.cpp ./mul.cpp ./main.cpp ./add.cpp ./sub/sub.cpp
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是cpp的文件全部展开。
第二行输出:
div.cpp mul.cpp main.cpp add.cpp sub.cpp
notdir把展开的文件去除掉路径信息
第三行输出:
div.o mul.o main.o add.o sub.o
在
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(dir) )中,patsubst把
(
d
i
r
)
中
的
变
量
符
合
后
缀
是
.
c
的
全
部
替
换
成
.
o
,
任
何
输
出
。
或
者
可
以
使
用
o
b
j
=
(dir)中的变量符合后缀是.c的全部替换成.o, 任何输出。 或者可以使用 obj=
(dir)中的变量符合后缀是.c的全部替换成.o,任何输出。或者可以使用obj=(dir:%.c=%.o)
效果也是一样的。
这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。
它的标准格式是
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a
最终版的Makefile
TAR = app
src=$(wildcard ./*.cpp)
OBJ=$(patsubst %.cpp,%.o,$(src))
CC := g++
(
T
A
R
)
:
(TAR):
(TAR):(OBJ)
$(CC) $^ -o $@
%.o:%.cpp
$(CC) -c $< -o $@
.PHONY:
cleanall:
rm -rf $(OBJ) $(TAR)
clean:
-rm -rf $(OBJ)
格式:$(patsubst <pattern>,<replacement>,<text> )
名称:模式字符串替换函数——patsubst。
功能:查找
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
make中有个变量替换引用
对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。格式为“ ( V A R : A = B ) ” ( 或 者 “ (VAR:A=B)”(或者“ (VAR:A=B)”(或者“{VAR:A=B}”),意思是,替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。“结尾”的含义是空格之前(变量值多个字之间使用空格分开)。而对于变量其它部分的“A”字符不进行替换。例如:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
在这个定义中,变量“bar”的值就为“a.c b.c c.c”。使用变量的替换引用将变量“foo”以空格分开的值中的所有的字的尾字符“o”替换为“c”,其他部分不变。如果在变量“foo”中如果存在“o.o”时,那么变量“bar”的值为“a.c b.c c.c o.c”而不是“a.c b.c c.c c.c”。
它是patsubst的一个简化,那么到底是简化成了什么样子呢
CROSS=
CC=$(CROSS)gcc
CFLAGS= -Wall
LDFLAGS=
PKG = src
SRCS = $(wildcard $(PKG)/inc/.c) $(wildcard $(PKG)/.c)
BOJS = ( p a t s u b s t (patsubst %.c,%.o, (patsubst(SRCS))
#BOJS = $(SRCS: .c = .o)
#%.o:%.c
$(CC) -c $< $(CFLAGS) -o $@
.PHONY:main
main:$(BOJS)
-$(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS)
-mv main ./myfile