由于makefile编译所有子目录中 sed 's,/($*/)/.o[ :],/1.o $@ : ,g' <$@ > $@ 的解释
鲜衣 人气:0这个语句分为好几层,我们一层一层来看
1. sed 's,/($*/)/.o[ :],/1.o $@ : ,g' <$@ > $@
首先看加粗这一层,$@表示目标参数中的.d文件, ‘<’ 将.d文件的内容交给sed处理.
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
此上。
加载全部内容