上次问题(见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