转自:https://blog.csdn.net/srw11/article/details/7516712
1、wildcard : 扩展通配符
例子:
建立一个测试目录,在测试目录下建立一个名为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名称和时钟频率了,其它的一般不用动了。
格式:$(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后,一切正常了,如果你知道为什么,请留言告诉我吧
相关推荐
Makefile还提供了许多内置函数,如wildcard、patsubst、notdir等,它们可以用来处理文件名匹配和转换,使得编写Makefile更为灵活和强大。 6. 清理工作 在Makefile中通常会定义一个名为clean的目标,用来清除编译...
Makefile 常用命令 Makefile 是一種自动化构建工具,通过编写 Makefile 文件来定义构建规则和依赖关系。...以上是 Makefile 中常用的命令和函数,通过这些命令和函数,可以实现自动化构建和字符串处理。
第八章“make的内嵌函数”向读者介绍了make的内嵌函数及其调用语法,包括文本处理函数(如subst、patsubst、strip等)和文件名处理函数(如wildcard、notdir等)的使用。 总结来看,GNU Make是一个用于简化编译过程...
本文将深入探讨 Makefile 中常用的三种通配符处理方式:`wildcard`、`notdir` 和 `patsubst`,并结合具体示例进行解析。 #### 二、`wildcard` 扩展通配符 `wildcard` 函数的作用是从指定的路径中匹配出符合模式的...
在Makefile中,使用变量可以简化和组织代码。例如,可以定义`SRC_DIR`、`HDR_DIR`和`OBJ_DIR`分别表示源代码、头文件和对象文件的路径。 ```makefile SRC_DIR = src HDR_DIR = include OBJ_DIR = obj ``` 4....
归纳整理makefile函数,包括 substr/patsubst/strip/findstring/filter...notdir/suffix/basename/addsuffix/addprefix/join/ wildcard/foreach/error/warning 等函数的定义,注意事项与例子 希望对编写makefile有用
- `notdir`:返回文件路径中的文件名部分。 - `suffix`:返回文件的扩展名。 - `basename`:返回文件名的部分(不包括扩展名)。 - `addsuffix`:在文件名后面添加扩展名。 - `addprefix`:在文件名前面添加...
在Makefile中,通常通过指定编译器(如 gcc)和链接器(也是 gcc)的选项来实现这两个步骤。例如,`cc -c source.c -o object.o` 编译源文件,`cc object.o -o executable` 进行链接。 【Makefile 规则】 规则由...
在IT行业中,构建和管理项目通常涉及到自动化工具,如Makefile。Makefile是GNU Make的配置文件,用于编译、链接和其他构建过程。本案例关注的是"多目录Makefile的写法",这对于大型C/C++项目尤其重要,因为这些项目...
- **包含其它 makefile 文件**:讲解如何在一个 makefile 文件中引入另一个 makefile 文件,以便于组织大型项目的构建脚本。 - **变量 MAKEFILES**:探讨如何通过 MAKEFILES 变量来控制 makefile 的加载顺序。 - **...
2. **字符串替换**:如`patsubst`、`subst`和`wildcard`等函数,用于模式替换、字符串替换和通配符扩展。 3. **文件名函数**:如`basename`、`dirname`和`notdir`等,用于提取文件名的部分信息。 4. **循环与条件**...
- **函数**:Makefile 支持多种字符串处理和文件操作函数,例如 `subst`、`patsubst`、`strip` 等。 #### 四、Makefile中的条件判断与函数 ##### 1. 条件判断 - **语法**:使用 `ifeq`、`ifdef` 等条件语句进行...
通过深入了解 Makefile 的编写方法和技巧,可以极大地提高开发效率和构建质量。本书提供了丰富的实例和详尽的解释,帮助读者掌握 Make 的核心概念和实践技能。无论是初学者还是经验丰富的开发者,都能够从中受益匪浅...
- make 通过分析 Makefile 中定义的目标文件和依赖关系来确定需要执行的操作。 #### 书写规则 1. **规则举例** - 规则可以指定目标文件、依赖文件及构建命令。 ```makefile prog: prog.o gcc -o prog prog.o ...
- **指定变量**:Makefile支持定义变量,这些变量可以在规则中被引用,从而使得Makefile更加灵活和易于维护。 ```makefile CC=gcc CFLAGS=-Wall all: prog prog: main.o sub.o $(CC) $(CFLAGS) -o prog main.o...
- **3.9.1 变量取值**:解释了如何获取和使用Makefile中的变量。 - **3.9.2 条件语句**:Makefile支持条件语句,例如`ifeq`和`ifdef`等,用于根据不同的条件执行不同的代码块。 - **3.9.3 规则的定义**:进一步...
Makefile 是 Linux 和 Unix 系统中用于管理软件构建过程的一种脚本文件。它通过定义一系列规则来描述如何生成程序的不同部分,并且能够自动处理文件之间的依赖关系,极大地简化了软件项目的编译和链接流程。 #### ...
第六章:Makefile中的变量 6.1 变量的引用 6.2 两种变量定义(赋值 ) 6.2.1 递归展开式变量 6.2.2 直接展开式变量 6.2.3 如何定义一个空格 6.2.4 “?=”操作符 6.3 变量的高级用法 6.3.1 变量的替换引用 ...
- `wildcard`、`notdir` 等函数控制make的行为。 #### 九、运行make ##### 9.1 指定Makefile文件的参数 - 使用 `-f` 指定makefile文件。 - 示例: ``` make -f mymakefile ``` ##### 9.2 指定最终目标的参数 -...