`
scm002
  • 浏览: 317075 次
社区版块
存档分类
最新评论

Makefile之wildcard

 
阅读更多
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub

在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件

建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )

all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"

执行结果分析:
第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c

wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

第二行输出:
a.c b.c sa.c sb.c
notdir把展开的文件去除掉路径信息

第三行输出:
a.o b.o sa.o sb.o

在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
任何输出。
或者可以使用
obj=$(dir:%.c=%.o)
效果也是一样的。

这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。
它的标准格式是
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a

今天在研究makefile时在网上看到一篇文章,介绍了使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,这下好了,不用手工一个一个指定需要编译的.c文件了,方法如下:

SRC = $(wildcard *.c)

等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

也可以指定汇编源程序:
ASRC = $(wildcard *.S)

这样一来,makefile模板可修改的基本就是AVR名称和时钟频率了,其它的一般不用动了。
分享到:
评论

相关推荐

    Makefile之通配符探究

    ### Makefile之通配符探究 #### 一、引言 Makefile 是一种用于构建项目的自动化工具,通过定义目标和依赖关系来管理软件构建过程。本文将深入探讨 Makefile 中常用的三种通配符处理方式:`wildcard`、`notdir` 和 ...

    Makefile进阶 Makefile进阶

    SRCS = $(wildcard *.c) OBJS = $(SRCS:.c=.o) PROG = myprogram ``` - **宏的引用**:在 Makefile 中引用宏时,需要在宏名前面加上 `$` 符号。例如: ```make all: $(OBJS) $(CC) $(CFLAGS) -o $(PROG) $...

    makefile实例

    此外,`Makefile`还支持条件语句(ifeq, ifneq等)和函数(如patsubst, wildcard等),可以实现更复杂的逻辑和路径处理。例如,你可以使用`wildcard`函数获取当前目录下的所有`.c`文件,然后自动构建规则: ```make...

    Windows 下的 Makefile 编写(一)Makefile的基本规则

    3. **函数**:如 `$(wildcard pattern)` 可以匹配文件模式,返回所有匹配的文件列表。 #### 六、总结 Makefile 是一个非常强大的工具,尤其适合大型项目的构建管理。通过对 Makefile 的学习和实践,可以显著提高...

    shell脚本与Makefile区别.docx

    其次,Makefile 中的通用函数(如 wildcard)和通配符不能在 shell 脚本中使用。在 Makefile 中,通用函数和通配符是用来匹配文件名的,而在 shell 脚本中,它们没有这种功能。 再次,shell 中所有以 $ 开头引用的...

    makefile基本语法规则

    Makefile还提供了一些内置函数,如`$(patsubst pattern,replacement,text)`用于模式替换,`$(wildcard pattern...)`用于匹配文件名等。例如: ```makefile SOURCES := $(wildcard *.c) OBJECTS := $(SOURCES:.c=.o)...

    Makefile手册中文版

    第六章“Makefile中的变量”是本手册的重点章节之一,详细介绍了变量在Makefile中的使用方法,包括变量的引用、两种类型的变量定义(递归展开式变量和直接展开式变量)、变量的高级用法(变量的替换引用和套嵌引用)...

    跟我一起学Makefile(PDF版)

    此外,还有一系列内置函数,如$(wildcard)用于获取当前目录下的所有匹配模式的文件,$(filter-out)用于过滤出列表中的部分元素。 5. **隐含规则**:Makefile中存在许多预定义的隐含规则,例如,它知道如何编译.c...

    写Makefile_word版

    Makefile还提供了内置函数,如`$(wildcard)`, `$(patsubst)`等,用于字符串操作和文件处理。 ### 5. 预定义规则 GNU Make预定义了一些规则,如编译C/C++文件,因此有时你无需显式写出编译命令: ```make my_...

    教你来写Makefile

    **函数(Functions)**:Makefile还提供了许多函数,如`$(wildcard)`查找所有匹配模式的文件,`$(shell)`执行shell命令等。 通过学习和实践这个“跟我一起写Makefile”的资料,你将能熟练地编写和理解Makefile,...

    Makefile详解 && Makefile中文文档.zip

    总之,理解和熟练使用Makefile是每个系统级开发者必备的技能之一。通过深入学习“Makefile详解.pdf”和“GNU_Make_3.80_cn.pdf”,你可以全面了解Makefile的语法、规则和最佳实践,从而更高效地管理你的项目构建流程...

    makefile中文手册

    Make还提供了内置函数,如`$(patsubst)`用于字符串替换,`$(wildcard)`用于获取目录中的文件列表。 3. **规则和目标**:目标通常是需要构建的文件,如可执行文件或库。依赖项是构建目标所需的文件。当依赖文件更新...

    MakeFile 中文手册.pdf

    Makefile还提供了许多内置函数,如wildcard、patsubst、notdir等,它们可以用来处理文件名匹配和转换,使得编写Makefile更为灵活和强大。 6. 清理工作 在Makefile中通常会定义一个名为clean的目标,用来清除编译...

    Makefile教程.pdf

    比如`wildcard`函数用于获取符合特定模式的文件名列表,`shell`函数用于执行shell命令并捕获其输出。 在书写命令时,make允许使用`@`来隐藏命令的执行输出,使得make运行时只显示命令结果,不显示命令本身。此外,...

    一个项目的通用Makefile的写法

    OBJS := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.o)) all: $(OBJS) $(CC) $(CFLAGS) -o main $(OBJS) clean: $(foreach dir, $(SRCDIRS), make -C $(dir) clean;) ``` 2. **子目录Makefile**: ...

    makefile说明文章-详细介绍了makefile的用法

    Makefile支持一些函数,如`$(patsubst pattern,replacement,text)`用于替换文本模式,`$(wildcard pattern)`用于匹配目录中的文件等。 ### 6. 清理目标(Clean Target) 清理目标通常命名为`clean`,用于删除编译...

    makefile讲解

    ### Makefile详解 #### 一、引言 随着软件项目的规模不断扩大,手动管理源文件的编译变得愈发困难。为了提高开发效率并确保构建过程的一致性和可重复性,Makefile 应运而生。本文将详细介绍 Makefile 的概念、语法...

    多文件夹下编写Makefile

    在多文件夹结构中编写Makefile是一项常见的任务,特别是在大型软件开发项目中。Makefile是自动化构建工具Make的配置文件,用于编译、链接、测试等步骤,提高开发效率。以下将详细介绍如何在多文件夹结构下编写有效的...

    stm32自写makefile工程

    SRCS := $(wildcard src/*.c) OBJS := $(SRCS:.c=.o) ``` 2. **编译规则**:定义如何从源文件生成目标文件。这通常涉及预处理、编译和链接步骤: ```make %.o: %.c $(CC) $(CFLAGS) -c $$@ ``` 其中,`$(CC...

Global site tag (gtag.js) - Google Analytics