uboot中自动生成依赖关系的rules.mk文件解读

一、总体介绍

该文件在uboot的子目录Makefile中多处被引用包含include,主要是用来生成.depend文件,该文件里面是生成依赖的规则,生成.depend文件后包含到子Makefile中供子Makefile使用

二、关键点

PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))
OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))

DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))

定义三个变量:$(obj)一般为空

PWD_SRCS 表示当前目录下的源文件,即采用滤波器去掉dir目录部分;

OTHER_SRCS 采用反滤波器保留其他目录下(非当前目录)的源文件;

DEPS 表示PWD_SRCS 代表的源文件使用.depend.%代替,例如:$(PWD_SRCS ) = test1.c,那么$(DEPS)就会为.depend.test1


MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \
-MQ $(addsuffix .o,$(obj)$(basename $<)) $< >$@

$(obj).depend.%: %.c
$(MAKE_DEPEND)

$(obj).depend.%: %.S

$(MAKE_DEPEND)

上面表示生成.depend.%文件的规则,如果依赖于c文件则会使用上面一条规则,如果依赖于.S文件则会使用下面一条规则。

以.depend.test1为例:

-M表示自动生成依赖文件;-MQ $(addsuffix .o,$(obj)$(basename $<)) 表示将目标替换成test1.o。

>$@ 表示创建一个文件,名字为.depend.test1,将生成的规则信息写入这个文件中

如下:

1 test1.o: test1.c /usr/include/stdc-predef.h /usr/inc    lude/stdio.h \
  2  /usr/include/features.h /usr/include/i386-linux-gnu    /sys/cdefs.h \
  3  /usr/include/i386-linux-gnu/bits/wordsize.h \
  4  /usr/include/i386-linux-gnu/gnu/stubs.h \
  5  /usr/include/i386-linux-gnu/gnu/stubs-32.h \
  6  /usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h \
  7  /usr/include/i386-linux-gnu/bits/types.h \
  8  /usr/include/i386-linux-gnu/bits/typesizes.h /usr/i    nclude/libio.h \
  9  /usr/include/_G_config.h /usr/include/wchar.h \
 10  /usr/lib/gcc/i686-linux-gnu/4.8/include/stdarg.h \
 11  /usr/include/i386-linux-gnu/bits/stdio_lim.h \

 12  /usr/include/i386-linux-gnu/bits/sys_errlist.h

接下来的代码是创建.depend文件,将所有的.depend.%文件写入到一个文件.depend中

$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(OTHER_SRCS) \
$(HOSTSRCS)
cat /dev/null $(DEPS) >$@
@for f in $(OTHER_SRCS); do \
g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \
$(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
done
@for f in $(HOSTSRCS); do \
g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \
$(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \

done

cat /dev/null $(DEPS) >$@这句话的作用就是创建.depend文件 

g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \使用正则表达式匹配将源文件中第一个.之前的字符串提取出来加上.o,简单的说test1.c被替换成test1.o。\(.*\)匹配任意多个字符,为后向引用,与后面1.o中的1相对应。接下来是\.表示'.'这个字符本身,[[:alnum:]_]表示匹配任意字符与下划线。sed命令为字符串替换,sed -e 's/ from/to/' 将from用to替换,可以使用正则匹配。

$(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ;与上面讲到的MAKE_DEPEND 作用类似。

注:

这整个文件中有两处用到了basename,这两处的basename是不同的,`basename`是在Makefile中使用shell命令,shell中的basename是去除掉文件前面的目录(路径)信息,比如/root/test.c变成test.c;$(basename)是Makefile中的命令,这个是去掉文件最后一个'.'字符后面的所有字符,比如/root/test.c变成/root/test。

猜你喜欢

转载自blog.csdn.net/wenlong_l/article/details/80874510