Melody_zhou 发表于 2016-03-28 09:28

makefile命令sed的解读,好复杂,求帮助

....................................
$(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>$@;\                                          //这个命令好复杂,完全时各种功能的叠加,谁能分析一下?

Melody_zhou 发表于 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原程序

reg2012 发表于 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的范畴了。
页: [1]
查看完整版本: makefile命令sed的解读,好复杂,求帮助