上次问题(见),.depend信息路径错误的问题。
主要尝试了,在(虚拟机下构建)linux下编译,确实没有问题了。(工具链需要改为linux程序)
但回头看来,好像忽视了什么。
对于rules.mk更多的关注了gcc工具,即gcc -M的作用,忽视了 代码中 sed的作用。
1 _depend: $(obj).depend2 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).depend2 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 done9 sed -i 's/d:/\/cygdrive\/d/g' $@
后续要适当学习sed,和正则表达式,提供工作效率。
遗留的小缺失,所以上面 仅针对 d:进行了替换,如果是其他盘符,还需要修改rules.mk。
后续看看正则表达式是否可以解决。
扩展阅读:
shell中sed用法:
【系统工程师的自我修养】sed篇:
Unix sed实用教程系列目录[已完成]: