zoukankan      html  css  js  c++  java
  • Makefile 自动产生依赖 ***

    代码如下:

    makefile 代码:
    %.d: %.c  
        $(CC) -M $(CPPFLAGS) $< > $@.$$$$;   
        sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@;   
        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个正则表示式的知识点。

           第一: (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。

  • 相关阅读:
    linux环境变量(一)
    linux常用命令-ps
    linux实用小命令--查看文本内容
    postman tests常用方法
    Vue 中嵌套 Iframe,用postMessage通信 踩坑记
    [Vue warn]: Error in nextTick: "RangeError: Maximum call stack size exceeded"
    对STM32所用位带操作宏的详细剖析
    移植Modbus TCP二
    移植Modbus TCP一
    STM32位带操作
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/5450517.html
Copyright © 2011-2022 走看看