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


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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值