关于makefile自动生成依赖性 sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' <$@.$$$$ > $@ 的解释

这个语句分为好几层,我们一层一层来看

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

首先看加粗这一层,$@表示目标参数中的.d文件, ‘<’ 将.d文件的内容交给sed处理. $@.$$$$是一个临时文件,.d文件中的内容输入到临时文件,再由临时文件输入到.d文件中(只有这样.d文件才能有数据)

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

这个 ’>‘ 将 sed处理之后的内容再返回给.d文件

3. 现在具体分析sed中的内容

由于sed中的分隔符可以自定义,这里的分割符为','逗号,逗号将整个语句分为四个部分

3.1 s,\($*\)\.o[ :],\1.o $@ : ,g

表示sed文件处理方式为替换文件内容,s,a,b 表示将a替换为b

3.2 's,\($*\)\.o[ :],\1.o $@ : ,g

\(\)表示保存文件的内容,$*表示文件名中除后缀名以外的文件名,同时可以使用\1来表示

.o 表示与 文件名中的.o匹配

[ :]中间是一个空格和一个分号,[]表示与其内容中的某一个字符匹配,因为.d中内容一般为 a.o : a.c a.h b.h之类的内容,[]中的内容对应':'以及左右的空格的内容。因此[ :]对应.o后面的空格或是分号。

3.3 's,\($*\)\.o[ :],\1.o $@ : ,g' 

 /1.o表示前面的$*,也就是a.o ;$@表示 a.d也就是.d文件,然后就是' : '

3.4 's,\($*\)\.o[ :],\1.o $@ : ,g'

g 获得内存缓冲区的内容,并替代当前模板块中的文本;

因此上述的内容就是将 a.o : a.c a.h b.h 替换为 a.o a.d : a.c a.h b.h

 

 

此上。

 

posted @ 2021-03-08 19:09  鲜衣  阅读(1167)  评论(0编辑  收藏  举报