代码如下:

其实这里主要是为每个C文件建立一个同名的后缀为.d。该文件的作用是使用gcc的-M属性来自动生成.o文件的头文件依赖关系。

第1,2,4都好理解。

第2行解释: 使用gcc -M 的属性将  $<(第1行的第一个依赖文件,就是%.c。 查看静态模式)的C文件的依赖关系输出到一个临时文件。  这里有点疑惑。  书里面说   .$$$$是当前进程好。   然到Makefile这个脚本将$$$$当成进程号了。姑且这么认为吧。

第4行解释:将第2行产生的临时文件删除。

对于第3行, 我知道sed的s命令是一个替换命令。但是里面的用到了太多高深的匹配规则了。  sed命令果真如传闻中的那么强大,对于现在的我来说还真的很陌生。不管咋样, 要把它解决。

首先,我们先要知道sed是什么概念。

sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而流编辑器是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕,接着读入下一行。

为了简化的阐述,下面将静态模式用一个特例代替---main.c 。 通过第2行,针对main.c编译器生成了如下的依赖关系:

main.o:main.c defs.h

而通过第三行将会被替换成main.o:main.d:main.c defs.h, 并且把这个依赖关系输出到文件main.d中。

OK,大致知道了它的意思,接下在,就细细的分析第三行命令的整个执行过程,如下:

1:将($@.$$$$)的临时文件中的字符串信息(main.o:main.c defs.h)通过 “<” 输送到sed命令中.

2:sed中的s符号告诉sed命令,这次要做一个替换的任务。s符号的格式为:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]。   下面来匹配上面的示例:

[address[,address]]:是指要处理的行的范围,在这次的操作中采用的是默认值。

pattern-to-find等价于\($*\)\.o[ :]*

replacement-pattern等价于\1.o $@ :

3:Makefile使用%=main进行替换后,命令变成了sed 's,\(main\)\.o[ :]*,\1.o main.d : ,g' < main.pid > main.d ;

接下来就比较好分析了,主要是正则表达式的知识了。   pattern-to-find使用到了4个正则表示式的知识点。

第一: \(main\)为创建一个字符标签,即正则表达式中的“分组模式”,给后面的replacement-pattern使用。如\1.o 正则表达式“后向引用”,展开后就是main.o

第二: \. 在正则表达式中‘.’作用是匹配一个字符。所以需要使用转义元字符‘\’来转义。

第三: [ :] 匹配一组字符里的任意字符 。

第四: *匹配0个或多个前一字符

4 : 通过sed的正则表达式,输入的main.o:main.c defs.h被替换成了main.o main.d : main.c defs.h。

这里还有个有趣的东西,平时我们对命令s符号使用‘/’作为参数分割符,其实‘/’只是一种默认的习惯罢了。你也可以使用','来作为分割符号,只要前后统一就OK。这里就是使用了','来作为分割符。

以上是个人的理解, 在一个复习了一下正则表达式与sed。

Makefile 自动产生依赖 ***的更多相关文章

  1. makefile自动生成依赖关系

    手工编写依赖关系不仅工作量大而且极易出现遗漏,更新也很难及时,修改源或头文件后makefile可能忘记修改.为了解决这个问题,可以用gcc的-M选项自动生成目标文件和源文件的依赖关系.-M选项会把包含 ...

  2. Makefile 自动生成依赖

    虽然以前对Makefile有个基本概念,但是真正到自己去写一个哪怕是简单的Makefile时也会遇到不少的麻烦.    现在我有如下文件 dList.h dList.c memory.c debug. ...

  3. Makefile自动生成头文件依赖

    前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖 ...

  4. Makefile 7——自动生成依赖关系 三颗星

    后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上“objs/”前缀.gcc的-E选项, ...

  5. 关于makefile中自动产生依赖的理解

    本博文是在学习了<GNU Make中文手册>后记录下来的自己的关于自动产生makefile依赖的语句的理解,向大家分享. <GNU make中文手册>中的相关章节见一下链接: ...

  6. makefile自动依赖生成

    自动依赖生成 基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列 举依赖. 这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法. 文章 ...

  7. make自动生成依赖文件的两种形式

    最近编译源文件发现当修改头文件后,make并不会自动把包含此头文件的所有源文件重新编译,而每次都是需要把对应的中间文件清除才能重新编译,非常的麻烦.因此需要make自动对源文件所依赖的头文件进行管理, ...

  8. Linux Makefile 生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明【转】

    转自:https://blog.csdn.net/qq1452008/article/details/50855810 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  9. Makefile 8——使用依赖关系文件

    Makefile中存在一个include指令,它的作用如同C语言中的#include预处理指令.在Makefile中,可以通过include指令将自动生成的依赖关系文件包含进来,从而使得依赖关系文件中 ...

随机推荐

  1. 从引物序列出发查找pcr产物的内容和在基因组上的位置

    1.利用primer_blast工具,找出这对引物序列在基因组上的位置: 结果大概会像这样: 2.这些结果都是根据hg38基因组来定位的,转换成hg19: 利用UCSCde hgLiftover 在线 ...

  2. PHP 面向对象及Mediawiki 框架分析(一)

    此文是一JAVA哥大神写的,虽然他不懂PHP.我这人PHP半桶水,面向对象更是半桶水都没有,此文原本是为了让我理解MediaWiki的运行机制的,愣是用他的JAVA的面向对象知识,对Mediawiki ...

  3. JavaWeb Cookie

    1. Cookie 1.1. Cookie概述 Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件.Cookie是以键值对形式存储在客户端主机硬盘中,由服务器 ...

  4. uiwebview 加载本地js、css、img,html从网站加载

    资源文件都是放在根目录下 1.index.html <html> <head> <title>My test Page</title> <link ...

  5. 简单web作业---书籍介绍的相关网页编写

    老师布置的web作业,我做了3个页面,其中有利用老师的css代码! 我有添加背景音乐,下面的是主界面的代码. <!DOCTYPE html> <html> <head&g ...

  6. C语言一个细节地方的说明【防止使用不当而出错】

    1.运行如下的代码: #include <stdio.h> #include <string.h> int main() { int a; a=1; int s[4]; mem ...

  7. maven install 找不到自定义jar包

    解决方案是在Prefernces-->Maven-->user Settings 里面点击Update settings 然后就好了.因为默认你配置settings.xml指向你的类库的时 ...

  8. 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...

  9. URAL 2062 树状数组

    一个长度为n的数组 每次对lr区间进行修改 如果要修改i 则对i i*2 i*3...都修改 最后单点查询值 思想是利用树状数组维护每一个区间的更新值 查询的时候得出这个点的所有因子的查询值的和 加上 ...

  10. Eclipse安装SVN客户端

    在Eclipse中安装SVN客户端有个好处,不用兼容其它操作系统都能保持一致的操作.比如再Linux下SVN客户端软件体验相对较差,但是基于命令行的操作却在Linux下无所不能. 一.通过在线安装 地 ...