Makefile的常用函数

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。
功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式,如果匹配的话,则以替换。这里,可以包括通配符“%”,表示任意长度的字串。如果中也包含“%”,那么,中的这个“%”将是中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

示例:

$(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值