1、u-boot2015.7版本编译没有在顶层目录中生成.config文件,而生成了include/autoconf.mk和include/autoconf.mk.dep两个文件,并在每个模块编译的时候包含着两个文件,作用相当于高版本u-boot中的.config文件。

2、autoconf.mk的生成过程

在顶层目录下的Makefile中:


1110 quiet_cmd_autoconf_dep = GEN $@ # log中打印:GEN include/autoconf.mk.dep
1111 cmd_autoconf_dep = $(CC) -x c -DDO_DEPS_ONLY -M $(c_flags) \
1112 -MQ include/autoconf.mk $(srctree)/include/common.h > $@ || rm $@
# -DDO_DEPS_ONLY -> #define DO_DEPS_ONLY
# -M生成依赖关系,如:gcc –M main.c -> main.o : main.c /usr/include/xx1.h /usr/include/xx2.h …
# -MQ 指定依赖关系中的目标名字
# -M -MQ include/autoconf.mk include/common.h -> include/autoconf.mk : include/common.h
# > $@ 结合1114、1115两行代码分析,将以上依赖关系写到目标文件autoconf.mk.dep
# || 如果前面命令返回失败,执行rm $@,即rm autoconf.mk.dep,否则不执行。
1113
1114 include/autoconf.mk.dep: include/config.h include/common.h
1115 $(call cmd,autoconf_dep) # $(call <expression>,parm1,parm2,…) 调用cmd_autoconf_dep命令
1116
1117 quiet_cmd_autoconf = GEN $@ # log中打印:GEN include/autoconf.mk
1118 cmd_autoconf = \
1119 $(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/ include/common.h > $@.tmp && \
1120 sed -n -f $(srctree)/tools/scripts/define2mk.sed $@.tmp > $@; \
1121 rm $@.tmp
# -dM 输出include/common.h中所有的宏定义到include/autoconf.mk.tmp文件
# && 如果前面的命令成功,执行下一步,否则不执行
# tools/scripts/define2mk.sed 宏处理规则,处理以“#define CONFIG_”为前缀的所有宏
# sed -n -f tools/scripts/define2mk.sed $@.tmp > $@ 取出include/autoconf.mk.tmp文件
# 以“#define CONFIG_”为前缀的所有宏,按define2mk.sed 宏处理规则处理后写入include/autoconf.mk
1122
1123 include/autoconf.mk: include/config.h
1124 $(call cmd,autoconf) # 调用cmd_autoconf命令

以上两段代码可以简化为:

include/autoconf.mk.dep: include/config.h include/common.h
@echo GEN $@
$(CC) -x c -DDO_DEPS_ONLY -M $(c_flags) \
-MQ include/autoconf.mk $(srctree)/include/common.h > $@ || rm $@ include/autoconf.mk: include/config.h
@echo GEN $@
$(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/ include/common.h > $@.tmp && \
sed -n -f $(srctree)/tools/scripts/define2mk.sed $@.tmp > $@; \
rm $@.tmp

3、总结

这段代码都做了些什么,有什么用:

1)       生成了两个文件autoconf.mk和autoconf.mk.dep;

2)       autoconf.mk.dep是为了在顶层目录Makefile中生autoconf.mk所被包含;

3)       把include/common.h以及它所包含的头文件中的以“CONFIG_”为前缀的所有宏提取出来,按tools/scripts/define2mk.sed 宏处理规则来处理宏定义,并写入autoconf.mk文件,在make 命令编译源码的时候,包括autoconf.mk文件,形成源码或模块的编译规则,决定哪些模块编入镜像。

u-boot-2015.07 autoconf.mk生成过程分析的更多相关文章

  1. Myeclipse 2015 stable 1.0 完美破解方法(转自 http://yangl.net/2015/07/14/myeclipse_2015stable_1/)

    Myeclipse 2015 stable 1.0 完美破解方法 http://yangl.net/2015/07/14/myeclipse_2015stable_1/ 破解包(注册机)下载地址:链接 ...

  2. Murano Weekly Meeting 2015.07.21

    会议时间: 2015.07.21 主持人: Kirill Zaitsev, core from Mirantis 会议摘要:  1.murano client和murano dashboard升级到y ...

  3. Murano Weekly Meeting 2015.07.14

    会议时间: 2015.07.14 主持人: Kirill Zaitsev, core from Mirantis 会议摘要:  1.periodic nightly builds,然后通过mailin ...

  4. spring boot是一个应用框架生成工具?

    spring boot是一个应用框架生成工具?

  5. Spring Boot中使用Swagger CodeGen生成REST client

    文章目录 什么是Open API规范定义文件呢? 生成Rest Client 在Spring Boot中使用 API Client 配置 使用Maven plugin 在线生成API Spring B ...

  6. Archlinux 2015.07.01 和 Windows7 双系统 安装教程

    提前在windows7下给Archlinux预留一个分区,大小最好在20G以上(根据自己硬盘情况分配). 第一步,安装前的准备 从arch官网下载最新的ISO文件archlinux-2015.07.0 ...

  7. Spring boot中使用springfox来生成Swagger Specification小结

    Rest接口对应Swagger Specification路径获取办法: 根据location的值获取api   json描述文件 也许有同学会问,为什么搞的这么麻烦,api json描述文件不就是h ...

  8. linux 内核 zImage 生成过程分析

    1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号表的最初的内核,大小约23MB: arm ...

  9. spring boot中利用mybatis-generator插件生成代码

    使用Idea在spring boot中集成mybatis-generator,自动生成mapper.xml  model  dao 文件 一.配置 pom.xml 在pom.xml的<plugi ...

随机推荐

  1. Flask之session相关

    Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...

  2. (2.13)备份与还原--sql server数据库主要状态和切换路径

    SQLSERVER数据库主要状态和切换路径 关键词:数据库状态 一个SQLSERVER数据库会处于很多种状态,例如 ONLINE .RESTORING .RECOVERING .RECOVERY_PE ...

  3. PAT 1048 Find Coins[比较]

    1048 Find Coins (25 分) Eva loves to collect coins from all over the universe, including some other p ...

  4. Objective-C中的引用计数

    导言 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器.如果想使某个对象继续存活,那就递增其引用计数:用完了之后,就递减其计数.计数为0,就表示没人关注 ...

  5. java初学一

    1.区分大小写 public static void main String args[]  是类体中的一个方法,之后的两个大括号以及之间的内容叫做方法体,一个java应用程序中必须有一个类且只有一个 ...

  6. 利用trigger同步Oracle数据库

    oracle不同数据库之间进行同步数据时,可以用触发器来实现,但需要数据库A访问数据库B,那么可以通过创建数据连接来实现,代码如下: CREATE DATABASE LINK dblink_test ...

  7. 一道仅有7人通过的超5星微软比赛题目-------解题思路&优秀代码分享,邀你来“找茬儿”

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目,截止活动结束共有300多名编程爱好者参与线上答题,而最终通过者仅有7人,通过率仅为2%.为什么成绩如此出人意料?是因为题目的英文描述难以理解? ...

  8. apache服务器设置

    服务器目录 目录说明 bin: apache常用的一些命令 cgi-bin:存放一些脚本语言命令 conf:apache配置文件 error:错误记录 htodcs存放站点文件 logs:记录日志 m ...

  9. Linux中find

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  10. IIS如何确定请求的处理程序

    1. 给定一个url请求,IIS需要确定它的文件名,扩展名,以及最相似的与本请求资源合适的"ScriptMaps"metadata (缓存的ISAPI扩展 - 应用程序扩展名映射列 ...