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
https://blog.csdn.net/liangkaiming/article/details/6267357 ↩︎