转自: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后,一切正常了,如果你知道为什么,请留言告诉我吧

makefile中的wildcard和notdir和patsubst相关推荐

  1. Makefile中的wildcard用法

    Makefile中的wildcard用法 在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数"wildcar ...

  2. Makefile中的常用函数subst、foreach、wildcard、notdir、patsubst

    Makefile中函数参数间以逗号分隔,函数名和参数间以空格分隔,$ 是取值符号,$val相当于获取val变量的值. subst函数的调用语法 subst FROM, TO, TEXT 即将字符串TE ...

  3. makefile 中 wildcard、notdir、patsubst、addprefix 解释

    原文链接:https://blog.csdn.net/huofire001/article/details/83684446 目录 wildcard 获取跟当前模式匹配的文件名 查找一层目录 查找多层 ...

  4. Makefile中wildcard、notdir、patsubst函数的用法

    Makefile 里的函数跟它的变量很相似--使用的时候,你用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后用关括号结束. 在 GNU Make 里有一个叫 'wildcard' ...

  5. android file函数,Android Makefile中wildcard、notdir、patsubst函数的用法

    Makefile 里的函数跟变量的使用方法很相似--用一个$符号跟左括号,函数名,空格后跟一列由逗号分隔的参数,最后用右括号回括. 在GNU Make里有一个叫 'wildcard' 的函数,它有一个 ...

  6. Makefile中的wildcard patsubst

    在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数"wildcard",它的用法是:$(wildc ...

  7. Makefile:wildcard 、notdir和patsubst用法

    1.wildcard : 扩展通配符 2.notdir : 去除路径 3.patsubst :替换通配符 例子: 建立一个测试目录,在测试目录下建立一个名为sub的子目录 $ mkdir test $ ...

  8. makefile中的wildcard 、patsubst、

    在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效. 这种情况下如果需要通配符有效,就需要使用函数"wildcard",它的用法是:$(wild ...

  9. MAKEFILE【4】-Makefile中的wildcard用法

    文章目录 前言 前言 语法: $(wildcard PATTERN...) 在Makefile中,它被展开为已经存在的.使用空格分开的.匹配此模式的所有文件列表 一般我们可以使用"$(wil ...

  10. makefile中的wildcard

    wildcard : 扩展通配符 例子: 建立一个测试目录,在测试目录下建立一个名为sub的子目录 $ mkdir test $ cd test $ mkdir sub 在test下,建立a.c和b. ...

最新文章

  1. 为什么阿里不允许用Executors创建线程池
  2. 征服Perl——输入输出相关知识——里程碑M6
  3. win8 开发之旅(16)---------足球游戏揭秘(2)
  4. mxnet统计运算量
  5. vue组件间的5种传值方式
  6. Activiti+oracle 启动项目时不能自动建表或更新表的问题分析及解决办法
  7. MyBatis 缓存详解-一级缓存的不足
  8. CF1131 G. Most Dangerous Shark (单调栈优化dp)
  9. JSP的自定义标签(一)
  10. [ javascript ] 司徒正美的fadeOut-fadeIn效果!
  11. 泰坦尼克号数据挖掘项目实战——Task6 模型调优
  12. 【保研】-- 保研夏令营中线上面试注意事项
  13. 通配符 或 怎么浓_浓咖啡的咖啡渣新鲜度
  14. 行无疆靠谱讲述拼多多推广方法有哪些?
  15. android中的所有activity间动画跳转
  16. 获取当前日期的上一个月和后三个月。
  17. Bootstrap 徽章
  18. 如何用Python爬取股市数据,并进行数据可视化
  19. 微信开发-微信公共账号申请与接入(1)
  20. 终于有人把Web 3.0和元宇宙讲明白了

热门文章

  1. 初始runtime(运行时机制)
  2. Cordova for iOS
  3. 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML...
  4. MS SQL Server 2000 游标的使用方法
  5. linux搭建harbor与使用
  6. 标准C程序设计七---03
  7. 【android】uiselectoer 自动化测试
  8. 花小钱办大事 888元血汗钱如何装电脑
  9. 剑指offer【书】之简历抒写
  10. system.out输出到文件上