Makefile中 wildcard 、 addprefix 及 patsubst 的用法
本文链接:https://blog.csdn.net/FJDJFKDJFKDJFKD/article/details/83032146
wildcard的用法1
wildcard即通配符,通常包括?
以及*
。
在Makefile规则中,通配符会被自动展开。
但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数wildcard
。语法是:$(wildcard PATTERN)
在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。
addprefix的用法
addprefix
顾名思义,作用是给每个string添加前缀,string之间用空格隔开。
$(addprefix prefixstr, string1 string2 ...)
如: $(addprefix chapters/, docx pdf jpg)
添加了前缀后最终会得到chapters/docx
chapters/pdf
chapters/jpg
用法示例
src=main.
chap-dir=chapters
tmp-suffix = aux log out toc
tmp-files = $(addprefix ${src}, ${tmp-suffix})
tmp-files += $(wildcard $(addprefix ${chap-dir}/*, ${tmp-suffix}))
倒数第二句将 main.
作为前缀分别添加到aux log out toc
,于是展开得到 main.aux main.log main.out main.toc
。
最后一句首先将 chapters/*
添加到 aux log out toc
前,展开后得到 chapters/*aux chapters/*log chapters/*out chapters/*toc
。之后 wildcard
函数将得到匹配此模式的所有文件列表,即得到 chapters
目录下所有满足上述四种文件类型的文件名。
其他命令
- notdir: 去除路径名
- patsubst: 替换通配符(pattern substitute)
格式 $(patsubst <pattern>, <replacement>, <text>)
查找 <text>
中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 <pattern>
,如果匹配的话,则以 <replacement>
替换。这里,<pattern>
可以包括通配符“%”,表示任意长度的字串。如果 <replacement>
中也包含“%”,那么,<replacement>
中的这个“%”将是 <pattern>
中的那个“%”所代表的字串。
(可以用 “\”
来转义,以 “\%”
来表示真实含义的 “%”
字符)。
建立如下目录结构
src=$(wildcard *.c */*.c */*/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c, %.o, $(src))
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
第一句话获取了当前目录及子目录下所有的匹配 .c
的文件名(包括路径)。如果目录深度增加的话,加 */
即可。
第二句去除了或者文件名的路径信息。
第三句则是从第一句匹配到的字符串里将 .c
换成了 .o