多目标规则

多目标规则,可以简单的理解为是一种将多条具有1)相同依赖和2)相同生成命令的规则,合并成一条规则的语法,其基本格式为:

targets...: prerequisites...

commands

...

假设我们有以下makefile:

利用多目标规则,可以将makefile改写成makefile文件

这里我们可以观察到,虽然多目标规则中要求命令必须相同,但是配合上自动化变量的使用,就是可以针对不同的目标有不同的执行结果。

多规则目标

Makefile中,一个目标可以同时出现在多条规则中。

这种情况下,此目标文件的所有依赖文件将会被合并成此目标一个依赖文件列表,其中任何一个依赖文件比目标更新(比较目标文件和依赖文件的时间戳)时,make将会执行特定的命令来重建这个目标。对于一个多规则的目标,重建此目标的命令只能出现在一个规则中(可以是多条命令)。

如果多个规则同时给出重建此目标的命令,make将使用最后一个规则的命令,同时提示错误信息。

静态模式规则

可以理解为一种特殊的多目标规则,它仅要求多条规则具有相同的命令,而依赖可以不完全一样。

静态模式规则,其基本语法:

TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...

COMMANDS

...

其大致意思就是,用TARGET-PATTERN: PREREQ-PATTERNS ...描述的模式,从TARGETS ...取值来形成一条条规则,所有规则的命令都用COMMANDS。

TARGETS ...代表具有相同模式的规则的目标列表,在我们的项目中就是main.o和complicated.o,我们可以直接引用我们先前定义的objects变量。

TARGET-PATTERN: PREREQ-PATTERNS ...部分定义了,如何为目标列表中的目标,生成依赖;TARGET-PATTERN称为目标模式,PREREQ-PATTERNS称为依赖模式;目标模式和依赖模式中,一般需要包含模式字符%

目标模式的作用就是从目标列表中的目标匹配过滤出需要的值,目标模式中的字符%表示在匹配过滤的过程中不做过滤的部分,目标模式中的其他字符表示要与目标列表中的目标精确匹配,例如,目标模式%.o, 表示从目标列表的目标中匹配所有已.o结尾的目标,然后过滤掉匹配目标的.o部分, 因此目标main.o经过目标模式%.o匹配过滤后,得到的输出就是main。

依赖模式的作用就是表示要如何生成依赖文件。具体的生成过程,就是使用目标模式过滤出来的值,替换依赖模式字符%所表示的位置。因此,如果依赖模式为%.c, 则使用上述例子过滤出来的main来替换字符%, 最终得到依赖文件main.c。

伪目标

当我们将一个目标定义成伪目标时,意味着它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令。

定义一个伪目标的基本语法:

.PHONY: <伪目标>

对于make clean操作,如果不设置为伪目标,则如果存在一个clean文件,则会出现问题。

一起学Makefile(五)的更多相关文章

  1. Mina、Netty、Twisted一起学(五):整合protobuf

    protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化.反序列化),一般应用于网络传输,可支持多种编程语言. protobuf如何使用这里不再介绍, ...

  2. 从头开始学JavaScript (五)——操作符(二)

    原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:*      乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...

  3. 跟我学Makefile(三)

    紧接着跟我学Makefile(二)继续学习:变量高级用法 (1)变量值的替换 :替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,把变量“var”中所有以“a”字串 ...

  4. 跟我学Makefile(五)

    文件名操作函数 每个函数的参数字符串都会被当做一个或是一系列的文件名来对待. $(dir <names...>) 名称:取目录函数——dir. 功能:从文件名序列<names> ...

  5. 一起学makefile

    Unix.Linux必学知识哈哈,网上看到一哥们写得挺好挺详细的,直接复制地址就分享哈哈哈. 跟我一起写 Makefile(一) 概述 跟我一起写 Makefile(二) make是如何工作的 跟我一 ...

  6. Linux就该这么学--第五期 学习笔记

    第一节:基础 <Linux就该这么学>第二期视频 Linux就该这么学第5期第二节: ------------你的价值:你对公司做出的共享和你的不可替代性------------瑞尔系统R ...

  7. 跟我一起学Makefile

    概述 什么是makefile?或许很多Winodws程序员都不知道这个东西,因为那些Windows IDE都为你做了这个工作,但我觉得要做一个好的和professional的程序员,makefile还 ...

  8. 跟我一起写Makefile(五)

    使用变量———— 在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方.其与C/C++所不同的是, ...

  9. 跟我学Makefile(七)

    定义模式规则 使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符.“%”的意思是表示一个或多个任意字符.在依赖目标中同样可以使用“%”,只是依赖 ...

随机推荐

  1. The instance of entity type 'Menu' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.

    这里记录一个在使用.net core中ef core执行数据库操作时遇到的问题: 我在代码中使用DbContext下的Update方法准备将更改后的数据像这样步到数据库: _context.Menus ...

  2. 转载 VUE+WebPack环境搭建 https://segmentfault.com/a/1190000010960666

    一.vue有两种使用方式: 1.下载vue.js <script src="vue.js"></script> 2.使用npm npm install vu ...

  3. 使用httpClient 调用get,Post接口

    1.httpClient 调用get接口 private async Task<IList<(int columnId, string columnName)>> GetFun ...

  4. C#中如何禁止WindowsMediaPlayer双击全屏显示

    问题描述:在项目中使用WindowsMediaPlayer播放视频时,双击会出现视频全屏的效果,而且视频恢复后会暂停,除非再次双击返回后才能正常播放.那么如何禁止WindowsMediaPlayer的 ...

  5. localStorage、sessionStorage、Cookie的区别及用法

    1.webstorage 本地存储,存储在客户端,包括localStorage和sessionStorage. (1)localStorage:生命周期是永久,这意味着除非用户显示在浏览器提供的UI上 ...

  6. 使用node+vue实现简单的WebSocket聊天功能

    最近学习了一下websocket的即时通信,感觉非常的强大,这里我用node启动了一个服务进行websocket链接,然后再vue的view里面进行了链接,进行通信,废话不多说,直接上代码吧, 首先, ...

  7. 编写可维护的JavaScript-随笔(三)

    UI层的松耦合 本章提出了一个概念就是耦合 假设修改一个组件的时候需要修改很多其他的组件的话则表示组件之间存在紧耦合 如果修改一个组件而不需要修改其他组件的时候就做到了松耦合 页面是由HTML.CSS ...

  8. Unity编辑器扩展中,使用Unity自带的GUIStyle

    在进行编辑器扩展时,创建组件的方法一般都会提供GUIStyle参数,可以让我们自定义样式.修改背景图,字体大小,颜色等等. 比如,创建Button组件的方法:public static bool Bu ...

  9. RxJS——Operators

    RxJS 的操作符(operators)是最有用的,尽管 Observable 是最基本的.操作符最基本的部分(pieces)就是以申明的方式允许复杂的异步代码组合简化. 什么是操作符? 操作符是函数 ...

  10. kali 使用John破解zip压缩包的密码

    kali  使用John破解zip压缩包的密码 准备工具: zip压缩包带密码   1个 kali Linux机器       1个 操作步骤: 首先将压缩包上传至kali机器,然后使用zip2joh ...