模式规则

模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个),包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。规则的依赖文件中同样可以使用“%”,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。
有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入Makefile时,而模式规则中的"%"则发生在运行时。

1、模式规则介绍

模式规则中,至少在规则的目标定义中要包含"%",否则,就是一般的规则。目标中的"%"定义表示对文件名的匹配,"%"表示长度任意的非空字符串。例如:"%.c"表示以".c"结尾的文件名(文件名的长度至少为3),而"s.%.c"则表示以"s."开头,".c"结尾的文件名(文件名的长度至少为5)。

如果"%"定义在目标中,那么,目标中的"%"的值决定了依赖目标中的"%"的值,也就是说,目标中的模式的"%"决定了依赖目标中"%"的样子。例如有一个模式规则如下:

%.o : %.c
    <command ......>

其含义是,指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标是"a.o b.o",那么"%c"就是"a.c b.c"。

一旦依赖目标中的"%"模式被确定,那么,make会被要求去匹配当前目录下所有的文件名,一旦找到,make就会规则下的命令,所以,在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标,此时,make关心的是依赖的文件名和生成目标的命令这两件事。

2、模式规则示例

下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.

%.o : %.c
    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

其中,"$@"表示所有的目标的挨个值,"$<"表示了所有依赖目标的挨个值。这些奇怪的变量我们叫"自动化变量",后面会详细讲述。

自动化变量

模式规则中,规则的目标和依赖文件名代表了一类文件名;规则的命令是对所有这一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去意义。那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点。

假如你需要书写一个将.c文件编译到.o文件的模式规则,那么你该如何为gcc书写正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时源文件名都是不一样的。为了解决这个问题,就需要使用“自动环变量”,自动化变量的取值是根据具体所执行的规则来决定的,取决于所执行规则的目标和依赖文件名。所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。

下面是所有的自动化变量及其说明:

$@
    表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%
    仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

$<
    依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?
    所有比目标新的依赖目标的集合。以空格分隔。

$^
    所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

$+
    这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

$*
   这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。

文章来自:http://hi.baidu.com/kj_28/blog/item/aa3b13d8c9abbf3c33fa1cab.html

转载于:https://blog.51cto.com/norawoo/284742

模式规则及自动化变量相关推荐

  1. makefile中的foreach、patsubst等函数及自动化变量

    参考链接: Makefile中foreach函数使用方法 Makefile中的$@, $^, $< , $?, $%, $+, $* Makefile之patsubst wildcard ,no ...

  2. Makefile:自动化变量 $@,$^,$<,$?

    Makefile有三个非常有用的自动化变量.分别是$@,$^,$<代表的意义分别是: $@ 表示目标文件 $^ 表示通过目录搜索得到的所有依赖文件的完整路径名(目录+文件名) $< 表示第 ...

  3. C语言的本质(37)——makefile之隐含规则和模式规则

    Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能.本节我们来看看这样一个例子还有哪些改进的余地. 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o ...

  4. Linux下的Makefile规则(隐式规则和模式规则)

    目录 1.Makefile规则 2.隐式规则 3.模式规则 Linux下编写C使用的GDB调试器 Ubuntu中关于C介绍以及编写C程序 Ubuntu换源教程 Linux中的Make工程管理 Linu ...

  5. DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode

    暗黑模式实现,最初的设计,就是参考之前的主题模式.所谓多套主题/配色/皮肤,就是我们很常见的换肤功能.换肤简单的实现就是更换 css实现不同样式呈现不同肤色. 之前做不同颜色的皮肤,暗黑模式可以单做其 ...

  6. linux_makefile文件编写,基本规则、工作原理、模式规则,wildcard函数、patsubst函数

    接上一篇:linux_GDB调试学习(调试运行.多文件设置断点)_C/C++程序调试 本次来分享linux下的makefile文件的编写,开始上菜: 目录 1.makefile文件的命名规则 2.用途 ...

  7. ip pim spare 源树 和 共享树_Pim通用规则+Dense模式规则+Sparse模式规则

    一.pim 通用规则 pim 通用规则1: 无论何时之创建一个(S,G)项而相应的父(*,G)项存在,就首先自动创建新的(*,G)项.(有(S,G)一定有(*,G),可以比喻为(*,G)是(S,G)的 ...

  8. makefile中模式规则的引入和介绍------%:%.cpp

    原文地址:http://blog.csdn.net/stpeace/article/details/53054679 目录下有test1.cpp, test2.cpp, test3.cpp三个独立文件 ...

  9. 计算机 cf比赛,CF端游PL职业联赛春季赛比赛模式规则介绍

    CF职业联赛春季赛已经开始一段 时间 啦,相信还有不少小伙伴不知道CFPL职业联赛春季赛比赛模式规则吧,接下来小编就给大家介绍一下 CFPL职业联赛春季赛比赛模式规则详细内容 吧,希望能给大家带来帮助 ...

最新文章

  1. android 生成随机不相同的数
  2. 求二叉树某个结点的祖先
  3. Exif文件格式描述
  4. 《JavaScript设计模式与开发实践》模式篇(3)—— 代理模式
  5. aes加密算法_令你的文件安全有了新方法AES-256-GCM加密网站免费用
  6. java基础判断题_java基础知识周测试题带答案
  7. 【转】MFC学习总结
  8. opensource项目_生日快乐,Opensource.com:9年
  9. How to Prevent the next Heartbleed
  10. 局域网传输文件_WinXP系统电脑局域网传输文件的操作方法
  11. sao java_Java开发中的几种对象的说明(PO,VO,DTO,BO,POJO,DAO,SAO等)
  12. jQuery+PHP+Mysql在线拍照和在线浏览照片
  13. Python 利用百度 API 进行图像识别
  14. 学计算机的应届生怎么面试自我介绍,最新应届生面试自我介绍(精选3篇)
  15. 商品搜索结果页用RecyclerView列表实现的单排和双排展示及切换
  16. LabVIEW操作者框架(Actor Framework)范例集锦之二:视频范例
  17. 05-----关于C++使用VS时出现 error C2248: “xxx“ 无法访问private成员(在“MySpdlog“类中声明)
  18. msconfig提示系统配置无法保存原始启动配置以便以后还原的解决方法
  19. BFS和DFS算法原理(通俗易懂版)
  20. docker安装及设置镜像源-zls

热门文章

  1. 8. Python 数据类型
  2. dedecms首页怎么调用公司简介的内容
  3. 博为峰Java技术文章 ——JavaSE Swing JPanel III
  4. Tomcat7基于Redis的Session共享实战二
  5. 大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
  6. 安装ORACLE 11。2.0.3 配置GRID执行脚本信息记录
  7. 碎片化趋势下手机浏览器或成赢家
  8. WebPart中的ReplaceTokens 方法
  9. 静态库和动态库(转)
  10. hbase的shell客户端中不同符号的含义