一、总体介绍
该文件在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。