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

 _depend:    $(obj).depend

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

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

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

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

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

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

 $(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

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

 MAKE_DEPEND = $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \
-MQ $(addsuffix .o,$(obj)$(basename $<)) $< >$@ $(obj).depend.%: %.c
$(MAKE_DEPEND) $(obj).depend.%: %.S
$(MAKE_DEPEND) $(HOSTOBJS): $(obj)%.o: %.c
$(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c
$(NOPEDOBJS): $(obj)%.o: %.c
$(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的依赖。

U-Boot Makefile分析(3) rules.mk分析的更多相关文章

  1. U-Boot Makefile分析(2) config.mk分析

    浏览一下U-Boot各个子目录下的Makefile可以看到,几乎他们都会包含$(TOPDIR)/config.mk,那么这个文件进行了什么操作呢?简单概括:读入include/config.mk.in ...

  2. Spring Boot 启动(一) SpringApplication 分析

    Spring Boot 启动(一) SpringApplication 分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  3. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

  4. Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机

    文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多”开箱即用“的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内 ...

  5. Spring Boot自动装配原理源码分析

    1.环境准备 使用IDEA Spring Initializr快速创建一个Spring Boot项目 添加一个Controller类 @RestController public class Hell ...

  6. kubernetes/k8s CRI分析-kubelet创建pod分析

    先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...

  7. 手机自动化测试:Appium源码分析之跟踪代码分析九

    手机自动化测试:Appium源码分析之跟踪代码分析九   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  8. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  9. 手机自动化测试:Appium源码分析之跟踪代码分析七

    手机自动化测试:Appium源码分析之跟踪代码分析七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

随机推荐

  1. Linux - 远程管理常用命令

    远程管理常用命令 目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shut ...

  2. PDO查询语句结果中文乱码

    PDO::MYSQL_ATTR_INIT_COMMAND (整数)连接到MySQL服务器时执行的命令.重新连接时会自动重新执行.请注意,此常量只能driver_options 在构建新的数据库句柄时在 ...

  3. ceph mimc版本ceph-deploy安装与配置

    系统环境centos7.6 内核5.0.9 YUM源配置 [root@k8s-sys-10-82-4-200 ceph-cluster]# cat /etc/yum.repos.d/ceph.repo ...

  4. flock - 必应词典

    flock - 必应词典 美[flɑk]英[flɒk] v.聚集:群集:蜂拥 n.(羊或鸟)群:(尤指同类人的)一大群 网络羊群:大量:羊群,一群 变形复数:flocks:过去分词:flocked:现 ...

  5. crm--分页

    1. 给数据库添加数据 试图函数  (book表,含有title和price列) # 给数据库添加数据def index(request): book_list = [] for i in range ...

  6. php查询mysql中的json编码后的字符串内容的方法

    问题 mysql里存的是json编码后的字符串,其中中文会被转为unicode码,所以直接查询是查询不到的. mysql里的查询如 like "%\u6211\u662f%" 也是 ...

  7. php使用redis的GEO地理信息类型

    redis3.2中增中了对GEO类型的支持,该类型存储经纬度,提供了经纬设置,查询,范围查询,距离查询,经纬度hash等操作. <?php $redis = new Redis(); $redi ...

  8. ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh

    Linux常用指令通过上一教程,我们获得了ubuntu系统.Linux是一个很大的领域.但不要紧张,我们一步步来就是了,跟着教程,需要能用到新知识,会提前介绍给大家.下面学习几个常用的Linux指令. ...

  9. PEP8 规范

    Python PEP8 编码规范中文版   原文链接:http://legacy.python.org/dev/peps/pep-0008/ item detail PEP 8 Title Style ...

  10. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)

    解决方案: 1.(推荐)7.0之后你的app就算有权限,给出一个URI之后手机也认为你没有权限. 不用修改原有代码,在Application的oncreate方法中:(或者直接放在调用相机的activ ...