`
freesoftman
  • 浏览: 318773 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

由于GNU Make中文手册触发深入理解sed

阅读更多

最近由于要分析Uboot的代码。

于是乎,再一次开始复习《GNU Make中文手册》()

第一次看这本手册是在快一年前的事情了,当时是啥都不懂。一头雾水。

 

这次细细品味的时候,发现收获颇多。建议初学者去多看看。

 

今天看到 《4.14 自动产生依赖》的时候,一段代码在一次让我郁闷了。同样的地方,同样的不理解。

今天偶就要好好揭开这个惑!

 

代码如下:

1 %.d: %.c

2         $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

3         sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \

4         rm -f $@.$$$$
 

其实这里主要是为每个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个正则表示式的知识点。

       first, \(main\)为创建一个字符标签,给后边的replacement-pattern使用。如\1.o,展开后就是main.o

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

       third, [ :] 匹配一组字符里的任意字符 。

       forth, *匹配0个或多个前一字符

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

 

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

 

以上是个人的理解, 在一个复习了一下正则表达式与sed,   感觉挺好。学到了不少东西。


参考了如下网站资料:

http://blogold.chinaunix.net/u/29916/showart_2096163.html

 

学海无涯, 继续努力!

 

分享到:
评论
1 楼 unflynaomi 2016-02-27  
跪谢,写的很好!

相关推荐

    GNU make中文手册

    《GNU make中文手册》是一本全面介绍GNU make工具的指南,涵盖了从基础到高级的各个方面。GNU make是一个自动化构建工具,常用于管理软件项目的编译和构建过程,尤其是在Linux环境中。通过编写Makefile,程序员可以...

    GNU Make中文手册

    《GNU Make中文手册》是为开发者提供的一份详尽指南,专注于解释和解析make工具的使用,特别是如何编写和理解makefile。GNU Make是开源软件项目中最常用的自动化构建工具之一,它能帮助开发者自动化编译、链接和其他...

    GNU make中文手册_v_3.8.pdf

    GNU make是一款在Linux环境下广泛使用的自动构建工具,它通过读取Makefile文件中定义的依赖关系来自动化编译、链接和安装程序。Makefile是一种脚本文件,其中包含了如何编译和链接程序的规则和指令。学习makefile...

    GNU make中文手册.pdf

    GNU make中文手册;比较完整的讲述 GNU make 工具,涵盖 GNU make 的用法、语法。同时重点讨论如何为一个工程编写 Makefile。作为一个 Linux 程序员,make 工具的使用以及编写Makefile是必需的。

    GNU make 中文手册

    《GNU make 中文手册》是IT领域中关于构建自动化工具GNU make的重要参考资料,它详尽地阐述了如何使用make来管理软件项目的构建过程。GNU make是开源社区广泛使用的工具,尤其在C、C++等编程语言中,它通过读取名为...

    GNU MAKE 中文手册

    GNU MAKE的详细中文手册,目录如下: 目 录 第一章:概述 1.1 概述 1.2 准备知识 第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动...

    GNUMake使用手册(中译版) .pdf

    GNUMake是一款流行的构建工具,用于简化软件的构建过程。它是make工具的开源版本,支持多种操作系统平台,并且广泛应用于Linux系统中。make工具是Unix系统中早期由Stallman和McGrath开发的,旨在解决编译大型程序时...

    《GNU make中文手册-v3.80》.pdf

    《GNU make中文手册-v3.80》.pdf 这本书对GNU的make工具解析Makefile的规则做了说明,也就是学习Makefile的官方文档,是对书写GNU协议类Makefile的详细说明和工具参考书。包括make的显示隐式规则介绍,makefile中...

    GNU Make 中文手册

    《GNU Make 中文手册》是 GNU Make 的官方文档的中文翻译版,主要...通过阅读《GNU Make 中文手册》的 Ver3.8 版本,你不仅可以掌握 GNU Make 的基本用法,还能了解到高级特性和最佳实践,从而提升你的自动化构建技能。

Global site tag (gtag.js) - Google Analytics