Makefile中wildcard函数的应用理解

简介: Makefile中wildcard函数的应用理解

前言

如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make 支持三种通配符:"*","?" 和 "[...]"。这和 Unix 的 B-Shell 是相同的。

本篇主要讲述 "*" 通配符在变量中使用失效时,使用 wildcard 函数使能 "*" 通配符的通配功能。


1 "*"通配符使用场景

(1) 在命令中使用"*";

clean:
    rm -f *.o

这是操作系统 Shell 所支持的通配符,删除当前目录下的所有以 .o 结尾的文件。

这是在命令中的有效通配符,通配所有 .o 文件的集合。

(2) 在规则中使用"*";

print: *.c
    lpr -p $?
    touch print

上面这个例子说明通配符 "*" 也可以在我们的规则中使用,目标 print 依赖于所有的 .c 文件。

(3) 在变量中使用"*";

objects = *.o

上面这个例子,表示了通配符 "*" 同样可以在变量中使用。

但是 *.o 在变量中不会展开,objects 的值就是 *.o。Makefile 中的变量其实就是 C/C++ 中的宏。如果希望通配符 "*" 在变量中展开,也就是让 objects 的值是所有 .o 的文件名的集合,那么需要 wildcard 函数的配合。

objects := $(wildcard *.o)

这样,objects 的值就是所有 .o 的文件名的集合。

2 "*"通配符实例

这里我创建了 source_dir 目录和三个子目录: gpio、irq、usart。三个子目录中都有对应的 .c 文件。

d7e3d82ac7e34843b9dfbd75b7f9377c.png

$(foreach source, $(SOURCE_DIR), $(wildcard $(source)/*.c))

上面的例子中,$(SOURCE_DIR) 中的单词会被挨个取出,并存到变量 source 中,(wildcard $(source)/*.c) 每次根据 $(source)/*.c 计算出一个值(因为使用了 wildcard,所以匹配单词目录下 .c 文件集合),这些值以空格分隔,最后作为 foreach 函数的返回值。

对于 foreach 函数不理解的同学,可以参考:

Makefile中foreach函数的应用理解

本例程的最终目的,是将各子目录下的 .c 文件(可编译文件)列举出来。

总结

通配符 "*" 只有在命令和规则中使用它才会展开,如果在定义变量和函数中使用时,通配符 "*" 不会自动展开,这个时候就需要函数 wildcard 的配合使用。


相关文章
|
Shell Linux C语言
Makefile基础教程(自动生成依赖关系)
Makefile基础教程(自动生成依赖关系)
448 0
|
存储 C语言
C语言中a 和&a 有什么区别
在C语言中,"a" 是一个变量的名字,代表存储在内存中的某个值。而"&a" 则是获取该变量的内存地址,即变量a在计算机内存中的具体位置。这两者的主要区别在于:"a" 操作的是变量中的值,"&a" 操作的是变量的内存地址。
2168 23
|
机器学习/深度学习 数据采集 人工智能
探索AI驱动的自动化测试新纪元###
本文旨在探讨人工智能如何革新软件测试领域,通过AI技术提升测试效率、精准度和覆盖范围。在智能算法的支持下,自动化测试不再局限于简单的脚本回放,而是能够模拟复杂场景、预测潜在缺陷,并实现自我学习与优化。我们正步入一个测试更加主动、灵活且高效的新时代,本文将深入剖析这一变革的核心驱动力及其对未来软件开发的影响。 ###
|
测试技术 Linux Android开发
i2c总线及设备测试工具i2ctools:i2cdetect、i2cdump、i2cget、i2cset
本文介绍了i2ctools工具集的使用,包括i2cdetect、i2cdump、i2cget和i2cset,这些工具有助于I2C设备的开发和调试,通过检测设备、读写寄存器和数据块来提高开发效率。
4021 1
|
Linux 芯片
一篇文章讲明白Linux下控制GPIO的三种方法
一篇文章讲明白Linux下控制GPIO的三种方法
2262 3
|
存储 Linux 数据处理
在Linux中,什么是管道操作,以及如何使用它?
在Linux中,什么是管道操作,以及如何使用它?
|
自然语言处理 算法 前端开发
体验教程:通义灵码陪你备战求职季
本场景将带大家体验在技术面试准备场景下,如何通过使用阿里云通义灵码实现高效的编程算法题练习 、代码优化、技术知识查询等工作,帮助开发者提升实战能力,更加从容地应对面试挑战。
30304 9
|
物联网 开发者
NB-IoT 中 PTW 和 eDRX 周期配置 | 学习笔记
快速学习 NB-IoT 中 PTW 和 eDRX 周期配置
NB-IoT 中 PTW 和 eDRX 周期配置 | 学习笔记
|
Shell
makefile 自定义,预定义函数
makefile 自定义,预定义函数
330 0
汉化FC(红白机)游戏需要用到哪些技术?
这篇文章介绍了FC(红白机)游戏文本汉化的基本流程和技术知识。主要步骤包括分析游戏ROM、寻找文本字符串、学习游戏代码、修改文本、修改ROM头信息、重新映射、测试和修正。文章还提供了汉化实例,详细讲解了如何使用各种工具,如VirtuaNES Debugger、NO$NES、6502 Simulator等进行ROM分析和修改。此外,文章还介绍了如何使用汇编语言编写自定义程序以实现大字体汉化和在游戏画面切换时恢复原来的VROM。整个过程需要对6502汇编语言、NES硬件架构和ROM结构有一定的理解和编程经验。