【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义

简介: 【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义

patsubst 是 Makefile 里的一个函数

语法

#查找text中的单词,如果匹配pattern,那么就用replacement的内容替换
#返回:函数返回被替换过后的字符串。
#$(patsubst 原模式, 目标模式, 文件列表)
$(patsubst <pattern>,<replacement>,<text>) 

功能详解

patsubst函数在Makefile中是一个非常强大的文本处理工具,它允许用户按照特定的模式查找和替换文本。以下是对其功能的详细描述:

  1. 查找与替换
    patsubst的核心功能是查找并替换文本中的单词。这里的“单词”是指由空格、Tab、回车或换行符分隔的文本片段。
  2. 模式匹配
    函数的工作方式是,它会检查每个单词是否与给定的匹配。这个模式可以是一个具体的文本,也可以包含通配符“%”来匹配任意长度的字符串。
  3. 通配符的使用
    通配符“%”在patsubst中起到了关键的作用。它可以匹配文本中的任意长度的字符串,这使得函数在处理文件名和路径时非常有用。
  4. 替换文本
    当一个单词与匹配时,它将被替换。这个替换文本可以是一个固定的字符串,也可以包含通配符“%”。如果中的“%”与中的“%”匹配,那么它将被替换为中的“%”所匹配的文本。
  5. 转义字符
    在某些情况下,我们可能需要在文本中使用真正的“%”字符,而不是作为通配符。在这种情况下,可以使用“\”来转义它,即“%”。
  6. 应用场景
    patsubst在Makefile中有许多应用场景,如文件名转换、路径修改、添加前缀或后缀等。它为文本处理提供了强大而灵活的工具,使得Makefile的编写更加简洁和高效。

通过对patsubst函数的深入理解,我们可以更好地利用它来简化和优化Makefile的编写。


示例

  1. 基本的文件名替换
sources := main.c foo.c bar.c
objects := $(patsubst %.c,%.o,$(sources))

这个例子中,我们将sources中所有的.c文件名替换为.o,所以objects的值将是 main.o foo.o bar.o。


  1. 替换目录
vpath := src/foo
new_vpath := $(patsubst src/%,obj/%,$(vpath))

这里我们将vpath中的src/替换为obj/,所以new_vpath的值将是 obj/foo。


  1. 替换文件扩展名
txt_files := file1.txt file2.txt file3.txt
md_files := $(patsubst %.txt,%.md,$(txt_files))

在这个示例中,我们将txt_files中所有的.txt文件名替换为.md,所以md_files的值将是 file1.md file2.md file3.md。


  1. 添加前缀
names := apple orange banana
prefixed_names := $(patsubst %,fruit_%,$(names))

这里我们为names中的每个名字添加了前缀"fruit_",所以prefixed_names的值将是 fruit_apple fruit_orange fruit_banana。


  1. 从路径中提取文件名
full_paths := /home/user/main.c /home/user/foo.c
file_names := $(patsubst /home/user/%.c,%,$(full_paths))

在这个例子中,我们从full_paths中提取了每个文件的文件名,所以file_names的值将是 main foo。


这些示例展示了patsubst函数在Makefile中的多种用途,从基本的文件名替换到更复杂的路径操作,都可以通过这个函数轻松实现。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

目录
相关文章
关于如何选择正确的U-boot版本
关于如何选择正确的U-boot版本
596 0
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
2923 0
|
算法 安全 网络安全
简单认识一下mbedTLS
简单认识一下mbedTLS
3234 0
|
安全 Unix Linux
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
150787 65
|
数据安全/隐私保护 UED
2025 年 Adobe Acrobat Reader、万兴 PDF 阅读器、Sumatra PDF 三款高性价比 PDF 阅读器推荐
本文介绍了三款PDF阅读器:`Adobe Acrobat Reader DC`、`万兴PDF阅读器`和`Sumatra PDF`。其中,`Adobe Acrobat Reader DC`功能全面,支持签名、批注、表单处理等高阶操作,适合专业需求;`万兴PDF阅读器`不仅阅读便捷,还提供强大的格式转换与编辑功能,支持批量操作;`Sumatra PDF`则以轻量级和快速打开著称,适合简单阅读需求。根据个人需求选择合适的工具,下载链接已提供。
1036 0
|
Ubuntu
在Ubuntu 20.04 x64系统中增加中文支持
将 Ubuntu 系统语言设置为中文: 1. 更新系统语言包: `sudo apt update` 和 `sudo apt install language-pack-zh-hans`。 2. 修改区域设置:编辑 `/etc/default/locale` 文件,设置 `LANG=zh_CN.UTF-8` 和 `LANGUAGE=zh_CN:zh`。 3. 生成中文 locale: `sudo locale-gen zh_CN.UTF-8` 和 `sudo update-locale`。 4. 重启系统: `sudo reboot`。 5. 验证设置: `locale` 命令检查是否生效。
3705 1
|
存储 缓存 Linux
Ramfs、rootfs和initramfs【ChatGPT】
Ramfs、rootfs和initramfs【ChatGPT】
1109 2