makefile中的patsubst、notdir、wildcard介绍以及用法

1.1 patsubst:模式替换函数

格式:格式:$(patsubst pattern, replacement, text)
功能:查找text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式pattern,如果匹配的话,则以replacement替换。这里,pattern可以包括通配符“%”,表示任意长度的字串。如果replacement中也包含“%”,那么,replacement中的这个“%”将是pattern中的那个“%”所代表的字串。(可以用“\”来转义,以“%”来表示真实含义的“%”字符)

1.2 在工作中的常见用法

在打包环境中,有些客户的程序是定制的,某些配置文件或者函数库是特殊的,在打包时可以通过条件编译去选择,打包不同路径下配置文件或者函数库。替换特殊库有两种思路:一种是在还没有添加该库时就用特殊库把常用路径下的库给覆盖掉;还有一种是已经添加了常用路径下库再去替换。前者可以用cp命令,后者用patsubst函数。关于如何同一环境如何打包出不同的程序,可以参考《Makefile中的条件编译:ifeq、ifneq、ifdef和ifndef》。

1.3 实例:

LIBS := $(patsubst Libs/libAormal.a, Specialities/libAormal.a, $(LIBS))

假设在打包环境中有“Libs/libAormal.a”库,通常情况下都是链接该路径下的libAormal.a,但是有客户提出了定制需求,于是添加了“Specialities/libAormal.a”,该路径下的libAormal.a是针对该客户定制,在打包该客户的程序时必须链接“Specialities/libAormal.a”,于是就存在了libAormal.a的替换问题。上面的代码,作用是在LIBS变量中查找是否存在“Libs/libAormal.a”字符串,如果存在就用“Specialities/libAormal.a”替代,这样就实现了链接“Specialities/libAormal.a”而不是链接“Libs/libAormal.a”。LIBS这个变量是专门用来记录打包程序需要用到的静态库的。
注意事项:一定要保证在“Libs/libAormal.a”已经添加到了LIBS变量后再去调用patsubst 函数进行替换,否则调用patsubst 函数时,LIBS变量里都没有“Libs/libAormal.a”,还谈何替换。

2.1 wildcard:扩展通配符

作用:将指定目录下的文件全部展开,包括文件路径和文件名

3.1 notdir:去除路径

作用:将文件的路径去除,只留下文件名。

wildcard和notdir实例:

//创建一个文件夹和文件
mkdir test
touch a.c b.c
mkdir subdirectory//创建子文件夹
cd subdirectory
touch d.c e.c

//在test/目录下创建Makefile
src=$(wildcard *.c ./subdirectory/*.c)
dir=$(notdir $(src))
all:
@echo $(src)
@echo $(dir)

//输出结果
第一行:a.c b.c ./subdirectory/d.c ./subdirectory/e.c
第二行:a.c b.c d.c e.c
上一篇:Makefile中的3个赋值符号“=”“:=”“?=”和一个追加符号"+="


下一篇:makefile 基础