zoukankan      html  css  js  c++  java
  • U-Boot Makefile分析(3) rules.mk分析

      浏览各个子Makefile可以发现,他们都会在文件的后面包含rules.mk,这个文件的作用就是更新源文件的依赖,并生成各种.depend文件。

    1 _depend:    $(obj).depend
    2 
    3 # Split the source files into two camps: those in the current directory, and
    4 # those somewhere else. For the first camp we want to support CPPFLAGS_<fname>
    5 # and for the second we don't / can't.
    6 PWD_SRCS := $(filter $(notdir $(SRCS)),$(SRCS))
    7 OTHER_SRCS := $(filter-out $(notdir $(SRCS)),$(SRCS))

      伪目标_depend依赖.depend文件,.depend文件是各个源文件依赖关系的汇总。

      这两句话是通过filter函数将SRCS中的文件分成两部分:当前文件夹下的和其他文件夹下的,并不知道有什么作用。

      那么.depend文件是这么生成的呢?看代码!

    1 # This is a list of dependency files to generate
    2 DEPS := $(basename $(patsubst %,$(obj).depend.%,$(PWD_SRCS)))

      DEPS是当前目录各源文件对应依赖文件的集合。patsubst函数将各个源文件的名字前面加上.depend.前缀,举例,s5p_nand.c被处理成.depend.s5p_nand.c,接着basename函数去除字符串后缀,得到.depend.s5p_nand,依次类推,DEPS就得到了当前目录下所有的依赖文件。

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

      .depend文件依赖:当前Makefile、顶层config.mk、文件依赖集合DEPS、OTHER_SRCS、HOSTSRCS。因此当他们中任意文件修改时,该文件就要更新。我只分析了第一条命令cat /dev/null $(DEPS) >$@,将各个依赖文件的内容汇总到.depend文件中。

     1 MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) 
     2         -MQ $(addsuffix .o,$(obj)$(basename $<)) $< >$@ 
     3 
     4 
     5 $(obj).depend.%:    %.c
     6     $(MAKE_DEPEND)
     7 
     8 $(obj).depend.%:    %.S
     9     $(MAKE_DEPEND)
    10 
    11 $(HOSTOBJS): $(obj)%.o: %.c
    12     $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c
    13 $(NOPEDOBJS): $(obj)%.o: %.c
    14     $(HOSTCC) $(

      这里两个静态模式描述了特定源文件的依赖文件的生成方式。先说说静态模式的匹配问题,还是以s5p_nand.c为例,它对应的依赖文件是.depend.s5p_nand,这就是一对目标和依赖,那么如何生成呢?看MAKE_DEPEND,$(addsuffix .o,$(obj)$(basename $<))的意思是当前依赖文件首先去除后缀,得到s5p_nand,然后加上后缀.o,得到s5p_nand.o,那么命令将变成:

    $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) -MQ s5p_nand.o s5p_nand.c >.depend.s5p_nand

    如果上面的命令看起来有些费劲,看个精简版本的:

    arm-linux-gcc -M -MQ s5p_nand.o s5p_nand.c >.depend.s5p_nand,清晰地描述了.depend.s5p_nand文件的生成。

      总结一下,每个源文件a.c/a.s对应一个依赖文件.depend.a,所有的.depend.xx汇总就得到了.depend,而.depend又是_depend的依赖,此外,当rules.mk被包含在某个Makefile中时,.depend还会是相关libxx.o的依赖。

  • 相关阅读:
    选择器的区别
    固定DIV样式
    图片自适应不变形
    CSS实现图片在div a标签中水平垂直居中
    2017年校招全国统一模拟笔试 页码统计
    LeetCode 23. Merge k Sorted Lists
    LeetCode 15. 3Sum
    LeetCode 12. Integer to Roman
    LeetCode 11. Container With Most Water
    LeetCode 8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/tech-lqh/p/8407136.html
Copyright © 2011-2022 走看看