`
全站唯一的我在这里
  • 浏览: 2678 次
文章分类
社区版块
存档分类
最新评论

makefile中的wildcard和notdir和patsubst

阅读更多

转自:https://blog.csdn.net/srw11/article/details/7516712

 

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名称和时钟频率了,其它的一般不用动了。
 
 
PS:针对patsubst我们来好好聊一聊
这是个模式替换函数

格式:$(patsubst <pattern>,<replacement>,<text> ) 
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

 

make中有个变量替换引用

 

对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是,替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。“结尾”的含义是空格之前(变量值多个字之间使用空格分开)。而对于变量其它部分的“A”字符不进行替换。例如:

 

foo := a.o b.o c.o

bar := $(foo:.o=.c)

 

在这个定义中,变量“bar”的值就为“a.c b.c c.c”。使用变量的替换引用将变量“foo”以空格分开的值中的所有的字的尾字符“o”替换为“c”,其他部分不变。如果在变量“foo”中如果存在“o.o”时,那么变量“bar”的值为“a.c b.c c.c o.c”而不是“a.c b.c c.c c.c”。

它是patsubst的一个简化,那么到底是简化成了什么样子呢

 

CROSS=

CC=$(CROSS)gcc

CFLAGS= -Wall 

LDFLAGS= 

 

PKG = src

 

SRCS = $(wildcard $(PKG)/inc/*.c) $(wildcard $(PKG)/*.c)

BOJS = $(patsubst %.c,%.o,$(SRCS))

#BOJS = $(SRCS: .c = .o)

 

#%.o:%.c

# $(CC) -c $< $(CFLAGS) -o $@

 

.PHONY:main

main:$(BOJS)

-$(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS)

-mv main ./myfile

起初使用的是变量替换引用的方式,但是却始终不生成中间的.o文件,但是使用patsubst后,一切正常了,如果你知道为什么,请留言告诉我吧

 

 

本文转载自:http://www.javaxxz.com/thread-360060-1-1.html

分享到:
评论

相关推荐

    MakeFile 中文手册.pdf

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

    Makefile常用命令

    Makefile 常用命令 Makefile 是一種自动化构建工具,通过编写 Makefile 文件来定义构建规则和依赖关系。...以上是 Makefile 中常用的命令和函数,通过这些命令和函数,可以实现自动化构建和字符串处理。

    Makefile手册中文版

    第八章“make的内嵌函数”向读者介绍了make的内嵌函数及其调用语法,包括文本处理函数(如subst、patsubst、strip等)和文件名处理函数(如wildcard、notdir等)的使用。 总结来看,GNU Make是一个用于简化编译过程...

    Makefile之通配符探究

    本文将深入探讨 Makefile 中常用的三种通配符处理方式:`wildcard`、`notdir` 和 `patsubst`,并结合具体示例进行解析。 #### 二、`wildcard` 扩展通配符 `wildcard` 函数的作用是从指定的路径中匹配出符合模式的...

    多文件夹下编写Makefile

    在Makefile中,使用变量可以简化和组织代码。例如,可以定义`SRC_DIR`、`HDR_DIR`和`OBJ_DIR`分别表示源代码、头文件和对象文件的路径。 ```makefile SRC_DIR = src HDR_DIR = include OBJ_DIR = obj ``` 4....

    makefile函数整理.pdf

    归纳整理makefile函数,包括 substr/patsubst/strip/findstring/filter...notdir/suffix/basename/addsuffix/addprefix/join/ wildcard/foreach/error/warning 等函数的定义,注意事项与例子 希望对编写makefile有用

    跟我学写Makefile

    - `notdir`:返回文件路径中的文件名部分。 - `suffix`:返回文件的扩展名。 - `basename`:返回文件名的部分(不包括扩展名)。 - `addsuffix`:在文件名后面添加扩展名。 - `addprefix`:在文件名前面添加...

    跟我一起写 Makefile.doc

    在Makefile中,通常通过指定编译器(如 gcc)和链接器(也是 gcc)的选项来实现这两个步骤。例如,`cc -c source.c -o object.o` 编译源文件,`cc object.o -o executable` 进行链接。 【Makefile 规则】 规则由...

    多目录Makefile的写法.zip

    在IT行业中,构建和管理项目通常涉及到自动化工具,如Makefile。Makefile是GNU Make的配置文件,用于编译、链接和其他构建过程。本案例关注的是"多目录Makefile的写法",这对于大型C/C++项目尤其重要,因为这些项目...

    免费:makefile编程

    - **包含其它 makefile 文件**:讲解如何在一个 makefile 文件中引入另一个 makefile 文件,以便于组织大型项目的构建脚本。 - **变量 MAKEFILES**:探讨如何通过 MAKEFILES 变量来控制 makefile 的加载顺序。 - **...

    Makefile中文手册

    2. **字符串替换**:如`patsubst`、`subst`和`wildcard`等函数,用于模式替换、字符串替换和通配符扩展。 3. **文件名函数**:如`basename`、`dirname`和`notdir`等,用于提取文件名的部分信息。 4. **循环与条件**...

    makefile详细教程

    - **函数**:Makefile 支持多种字符串处理和文件操作函数,例如 `subst`、`patsubst`、`strip` 等。 #### 四、Makefile中的条件判断与函数 ##### 1. 条件判断 - **语法**:使用 `ifeq`、`ifdef` 等条件语句进行...

    Linux GNU Makefile中文版手册

    通过深入了解 Makefile 的编写方法和技巧,可以极大地提高开发效率和构建质量。本书提供了丰富的实例和详尽的解释,帮助读者掌握 Make 的核心概念和实践技能。无论是初学者还是经验丰富的开发者,都能够从中受益匪浅...

    how to write makefile

    - make 通过分析 Makefile 中定义的目标文件和依赖关系来确定需要执行的操作。 #### 书写规则 1. **规则举例** - 规则可以指定目标文件、依赖文件及构建命令。 ```makefile prog: prog.o gcc -o prog prog.o ...

    makefile的全面分析

    - **指定变量**:Makefile支持定义变量,这些变量可以在规则中被引用,从而使得Makefile更加灵活和易于维护。 ```makefile CC=gcc CFLAGS=-Wall all: prog prog: main.o sub.o $(CC) $(CFLAGS) -o prog main.o...

    跟我一起写makefile

    Makefile 是 Linux 和 Unix 系统中用于管理软件构建过程的一种脚本文件。它通过定义一系列规则来描述如何生成程序的不同部分,并且能够自动处理文件之间的依赖关系,极大地简化了软件项目的编译和链接流程。 #### ...

    GNU MAKE 中文手册

    第六章:Makefile中的变量 6.1 变量的引用 6.2 两种变量定义(赋值 ) 6.2.1 递归展开式变量 6.2.2 直接展开式变量 6.2.3 如何定义一个空格 6.2.4 “?=”操作符 6.3 变量的高级用法 6.3.1 变量的替换引用 ...

Global site tag (gtag.js) - Google Analytics