Makefile之patsubst

 常常要手写项目的Makefile,或者看其余项目的遗留项目的Makefile,有些makefile内置函数经常使用,函数

却用完就忘记了,最近项目中使用patsubst,感受挺好用的测试

 

 

格式:$(patsubst <pattern>,<replacement>,<text> ) .net

名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,若是匹配的话,则以<replacement>替换。字符串

   这里,<pattern>能够包括通配符“%”,表示任意长度的字串。若是<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所表明的字串。get

   (能够用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换事后的字符串。class

示例:变量

$(patsubst %.c,%.o, a.c b.c)扩展

把字串“a.c b.c”符合模式[%.c]的单词替换成[%.o],返回结果是“a.o b.o”file

 

make中有个变量替换引用引用

 

对于一个已经定义的变量,可使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。格式为“$(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”。



例子:

使用如下3个内置函数

一、wildcard : 扩展通配符
二、notdir : 去除路径
三、patsubst :替换通配符


创建一个测试目录,在测试目录下创建一个名为sub的子目录
$ mkdir  mk
$ cd mk
$ mkdir sub

在mk下,创建a.c和b.c 2个文件,在sub目录下,创建aa.c和bb.c 2 个文件

创建一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
file=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(src) )


all:
  @echo $(src)  
  @echo $(file)
  @echo $(obj) 执行结果分析: 第一行输出: a.c b.c ./sub/aa.c ./sub/bb.c wildcard把 指定目录 ./ 和 ./sub/ 下的全部后缀是c的文件所有展开。 第二行输出: a.c b.c aa.c bb.c notdir把展开的文件去除掉路径信息 第三行输出: a.o b.o aa.o bb.o 在$(patsubst %.c,%.o,$(src) )中,patsubst把$(file)中的变量符合后缀是.c的所有替换成.o, 任何输出。 或者可使用 obj=$(file:%.c=%.o) 效果也是同样的。

相关文章
相关标签/搜索