Makefile中wildcard的介绍

在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。

一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件:

 

#sample Makefile

objects := $(patsubst %.c,%.o,$(wildcard *.c))

 

foo : $(objects)

cc -o foo $(objects)

这里我们使用了make的隐含规则来编译.c的源文件。对变量的赋值也用到了一个特殊的符号(:=)。

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

最新文章

  1. [Math & Algorithm] 拉格朗日乘数法
  2. IOS XIB Cell自适应高度实现
  3. 编写NPAPI plugin的命名问题
  4. Python 生产环境MySQL数据库增量备份脚本
  5. 错误: 找不到或无法加载主类 Files\apache-activemq-5.10.0\bin\..\conf\login.config
  6. Java应用程序实现屏幕的"拍照"
  7. @JsonFormat时间不对
  8. 关于UNION和UNION ALL的区别
  9. 福州大学 Problem 2169 shadow
  10. Maven实战——生命周期和插件
  11. JS--Div中数据滚动到最后一条重新从头开始滚动
  12. win32下Socket编程(转载)
  13. CALayer --> UIView
  14. java web response提供文件下载功能
  15. bat实现固定时间循环抓取设备log
  16. MyBatis框架基于XML的配置
  17. Kubenetes---Service--实践
  18. [转]web.xml中<url-pattern>详解
  19. 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
  20. jQuery碎语(4) 实用函数

热门文章

  1. Java JDK5.0新特性
  2. 基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出
  3. Mongo DB Java操作
  4. 微信小程序navigator跳转失效
  5. springMVC使用拦截器检查用户登录
  6. Hadoop之block研究
  7. c# 四则运算出错
  8. 《梦断代码Dreaming In Code》阅读笔记(一)
  9. Python 循环语句和运算符
  10. android入门 — PopupWindow