Makefile中 wildcard 、 addprefix 及 patsubst 的用法

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 , , )

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

建立如下目录结构
Makefile中 wildcard 、 addprefix 及 patsubst 的用法_第1张图片

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
在这里插入图片描述


  1. https://blog.csdn.net/liangkaiming/article/details/6267357 ↩︎

你可能感兴趣的:(Makefile)