免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2333 | 回复: 2
打印 上一主题 下一主题

[Linux] makefile命令sed的解读,好复杂,求帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-28 09:28 |只看该作者 |倒序浏览
....................................
$(EXE)(OBJS)
        $(CC) -o $@ $^                                                                                 //exe里是可执行文件
$(DIRS_OBJS)/%.o:%.c                                                                             #moshi
        $(CC) -o $@ -c $^                                                                             //objs里是.o文件
$(DIRS_DEPS)/%.dep:%.c                                                                                 
        @echo "Making $@..."                                                                    //deps里是依赖关系文件
        @set -e ;\
        $(RM) $(RMFLAGS) $@.tmp;\
        $(CC) -E -MM $^>$@.tmp;\
        sed 's,\(.*\)\.o[:]*,objs/\1.o:,g' <$@.tmp>$@;\                                   //这个命令看不懂?
        $(RM) $(RMFLAGS) $@.tmp

clean:
        $(RM) $(RMFLAGS) $(DIRS)





sed 's,\(.*\)\.o[:]*,objs/\1.o:,g' <$@.tmp>$@;\                                          //  这个命令好复杂,完全时各种功能的叠加,谁能分析一下?

论坛徽章:
0
2 [报告]
发表于 2016-03-28 09:30 |只看该作者
.PHONY:all clean
MKDIR=mkdir
RM=rm
RMFLAGS=-fr
CC=gcc

DIRS_OBJS=objs
DIRS_DEPS=deps
DIRS_EXES=exes
DIRS=$(DIRS_OBJS) $(DIRS_EXES) $(DIRS_DEPS)


EXE=main
EXE:=$(addprefix $(DIRS_EXES)/,$(EXE))
SRCS=$(wildcard *.c)

OBJS=hello.o hello1.o
OBJS:=$(addprefix $(DIRS_OBJS)/,$(OBJS))


DEPS=$(SRCS:.c=.dep)
DEPS:=$(addprefix $(DIRS_DEPS)/,$(DEPS))

all(DIRS) $(DEPS) $(EXE)
$(DIRS):
        $(MKDIR) $@

$(EXE)(OBJS)
        $(CC) -o $@ $^
$(DIRS_OBJS)/%.o:%.c                        #moshi
        $(CC) -o $@ -c $^
$(DIRS_DEPS)/%.dep:%.c
        @echo "Making $@..."
        @set -e ;\
        $(RM) $(RMFLAGS) $@.tmp;\
        $(CC) -E -MM $^>$@.tmp;\
        sed 's,\(.*\)\.o[:]*,objs/\1.o:,g' <$@.tmp>$@;\
        $(RM) $(RMFLAGS) $@.tmp

clean:
        $(RM) $(RMFLAGS) $(DIRS)


       
这个是makefile原程序

论坛徽章:
0
3 [报告]
发表于 2016-04-26 12:46 |只看该作者
sed 's,\(.*\)\.o[:]*,objs/\1.o:,g' <$@.tmp>$@;\   

拆解一下
其实就是个替换命令,不过要注意,“s”后面接的任何字符都会成为分隔符,这里分隔符就成了“,”也就是解读为:
在整行范围内(g)将【\(.*\)\.o[:]*】 替换成【objs/\1.o:】

先说\(.*\)\.o[:]*的意思
分解为【\(.*\)】、【\.o】、【[:]*】三部分
【\(.*\)】:“.*”不用我说,表示任意多个字符,然后使用“( )”扩起来,表示将里面查找的字符串分组存储起来,但是“( )"在shell中属于特殊mete,所以需要转义符,也就成了"\( \)"
【\.o】:很好理解,就是表示".o"两个字符了,"."被\转义成了普通字符
【[:]*】:表示0到无数个:,这个我不是很理解,为什么加入[],按理说不加[]也可以的,[]表示多个字符中匹配一个

后面的【objs/\1.o:】也来分解一下,分为【objs/】、【\1】、【.o:】
前后两个都好理解,只是普通字符串,中间“\1”表示将刚刚在查找时存储的字符串分组1调出来,也就是之前的“.*”

那么连起来就是
查找以任意字符开头,后面跟着“.o”,紧接着有零或多个“:”的字符串,其中“.o”之前的部分存入“组1”
替换为objs/加上刚刚“组1”中的内存,后面再加上“.o:”

举例说明:
123123.o  
123123.o:
123123.o: :
都被替换为objs/123123.o:

最后面的部分就是stdin(标准输入)和stdout(标准输出)重定向了,已经不是sed的范畴了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP