痛苦的版本对齐(3) cygwin下的路径引用(sed解决篇)

上次问题(见http://www.cnblogs.com/yvivid/p/3546649.html),.depend信息路径错误的问题。

主要尝试了,在(虚拟机下构建)linux下编译,确实没有问题了。(工具链需要改为linux程序)

 

但回头看来,好像忽视了什么。

对于rules.mk更多的关注了gcc工具,即gcc -M的作用,忽视了 代码中 sed的作用。

1 _depend:    $(obj).depend
2 
3 $(obj).depend:    $(src)Makefile $(TOPDIR)/config.mk $(SRCS)
4         @rm -f $@
5         @for f in $(SRCS); do \
6             g=`basename $$f | sed -e 's/\(.*\)\.\w/\1.o/'`; \
7             $(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
8         done

重新分析了一下上面 sed的含义。

-e表示执行的匹配模板,

.*表示任意多个字符;\(.*\)是用来做后向引用的,后面的\1就是它了;
\.是一个点,\w用于匹配字母,数字或下划线字符;

实现的功能,将源文件*.c  和 *.cpp 文件变为 *.o, 即提前文件名并改为.o类型名称。

 

sed确实很便利,利用 sed可以较为简单的实现 d:变为 /cygdrive/d ,

在 rules.mk中, 增加 sed -i 's/d:/\/cygdrive\/d/g' $@

由于 /cygdrive/d 包含了 “/”,该符号是 替换操作的分隔符,所以需要用 \/表示“\”为转义符。

1 _depend:    $(obj).depend
2 
3 $(obj).depend:    $(src)Makefile $(TOPDIR)/config.mk $(SRCS)
4         @rm -f $@
5         @for f in $(SRCS); do \
6             g=`basename $$f | sed -e 's/\(.*\)\.\w/\1.o/'`; \
7             $(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
8         done
9         sed -i 's/d:/\/cygdrive\/d/g' $@

 

后续要适当学习sed,和正则表达式,提供工作效率。

遗留的小缺失,所以上面 仅针对 d:进行了替换,如果是其他盘符,还需要修改rules.mk。

后续看看正则表达式是否可以解决。

 

扩展阅读

shell中sed用法:http://www.cnblogs.com/giraffe/p/sed-in-shell.html

【系统工程师的自我修养】sed篇:http://www.cnblogs.com/gnuhpc/archive/2013/02/20/2919340.html

Unix sed实用教程系列目录[已完成]:http://www.cnblogs.com/lazycoding/p/3248289.html

posted @ 2014-02-18 22:50  yvivid  阅读(1418)  评论(0编辑  收藏  举报