makefile是个很复杂的东西,但是只要有耐心层层剥下,也能看到你想看到的东西。很遗憾的事,很多人都没有耐心去层层看,我也是。

对于makefile,我也仅仅从基础上了解了它在uboot中的原理和作用,其实你不一定要完全了解,但是你又不能完全不了解,这就是这个世界的矛盾。

makefile 第一步

最开始当然要看顶层目录下的makefile文件,当你执行make命令是就是默认这个makefile。一般在最开始,你需要告诉makefile你要生成哪种uboot,命令如下:

[cpp] view plaincopy
  1. make *****_config

****就是你单板的名字。当你执行这个指令后,它的结果就是生成一个.config文件,具体形成的语句对应为:

[cpp] view plaincopy
  1. %_config::  unconfig
  2. @$(MKCONFIG) -A $(@:_config=)

unconfig又定义为

[cpp] view plaincopy
  1. unconfig:
  2. @rm -f $(obj)include/config.h $(obj)include/config.mk \
  3. $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
  4. $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

变量MKCONFIG定义为

[cpp] view plaincopy
  1. MKCONFIG    := $(SRCTREE)/mkconfig

通常SRCTREE就是空目录,因此就是根目录下的mkconfig文件。

而@:_config=表示将你输入的******_config替换为******,也就是将后面的去掉,因此命令实际上就成了

[cpp] view plaincopy
  1. $(SRCTREE)/mkconfig -A ******

mkconfig的作用

有很多文章写mkconfig的过程,我就不乱讲了,我也讲不太清楚,或者只能简单讲清楚。

简单来说,mkconfig会根据你输入的参数,比如-A , ******(单板号)去查询根目录下的boards.cfg文件,这个文件很关键,比如内容如下:

[cpp] view plaincopy
  1. # Target                     ARCH        CPU         Board name          Vendor         SoC         Options
  2. ###########################################################################################################
  3. integratorcp_cm1136          arm         arm1136     integrator          armltd         -           integratorcp:CM1136
  4. imx31_phycore                arm         arm1136     -                   -              mx31
  5. imx31_phycore_eet            arm         arm1136     imx31_phycore       -              mx31         imx31_phycore:IMX31_PHYCORE_EET
  6. qong                         arm         arm1136     -                   davedenx       mx31
  7. mx31ads                      arm         arm1136     -                   freescale      mx31
  8. mx31pdk                      arm         arm1136     -                   freescale      mx31         mx31pdk:NAND_U_BOOT
  9. tt01                         arm         arm1136     -                   hale           mx31
  10. imx31_litekit                arm         arm1136     -                   logicpd        mx31
  11. flea3                        arm         arm1136     -                   CarMediaLab    mx35
  12. mx35pdk                      arm         arm1136     -                   freescale      mx35

它会列举一些用得到的单板的名字,以及各种属性。

比如以tt01为例,当你输入make tt01_config的时候,mkconfig就会在borad.cfg里面找到这一行。

找到这一行之后,它的所有属性就出来了,比如你的ARCH=arm,CPU=arm1136等等,这些属性都会被mkconfig收集起来写入两个文件中,这两个文件就叫做include/config.mk和include/config.h

mkconfig中生成include/config.mk如下:

[cpp] view plaincopy
  1. 1 ARCH   = arm
  2. 2 CPU    = arm1136
  3. 3 BOARD  = tt01
  4. 4 VENDOR = hale
  5. 5 SOC    = mx31

而生成的config.h文件如下:

[cpp] view plaincopy
  1. 1 /* Automatically generated - do not edit */
  2. 2 #define CONFIG_SYS_ARCH  "arm"
  3. 3 #define CONFIG_SYS_CPU   "arm1136"
  4. 4 #define CONFIG_SYS_BOARD "tt01"
  5. 5 #define CONFIG_SYS_VENDOR "hale"
  6. 6 #define CONFIG_SYS_SOC    "mx31"
  7. 7 #define CONFIG_BOARDDIR board/hale/tt01
  8. 8 #include <config_cmd_defaults.h>
  9. 9 #include <config_defaults.h>
  10. 10 #include <configs/tt01.h>
  11. 11 #include <asm/config.h>
  12. 12 #include <config_fallbacks.h>
  13. 13 #include <config_uncmd_spl.h>

make的第二步

当make的第一步完成后,第二步就更简单了,直接输入make命令,然后就会按照你的预订配置编译了。

虽然操作简单了,但是实现过程更复杂了,如果要简单的说,那就是会执行All下面的所有操作

[cpp] view plaincopy
  1. all:        $(ALL-y) $(SUBDIR_EXAMPLES)
  2. $(obj)u-boot.dtb:   $(obj)u-boot
  3. $(MAKE) -C dts binary
  4. mv $(obj)dts/dt.dtb $@
  5. $(obj)u-boot-dtb.bin:   $(obj)u-boot.bin $(obj)u-boot.dtb
  6. cat $^ >$@
  7. $(obj)u-boot.hex:   $(obj)u-boot
  8. $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
  9. $(obj)u-boot.srec:  $(obj)u-boot
  10. $(OBJCOPY) -O srec $< $@
  11. $(obj)u-boot.bin:   $(obj)u-boot
  12. $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
  13. $(BOARD_SIZE_CHECK)
  14. $(obj)u-boot.ldr:   $(obj)u-boot
  15. $(CREATE_LDR_ENV)
  16. $(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
  17. $(BOARD_SIZE_CHECK)
  18. $(obj)u-boot.ldr.hex:   $(obj)u-boot.ldr
  19. $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
  20. $(obj)u-boot.ldr.srec:  $(obj)u-boot.ldr
  21. $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary

我这里没有列全,但是的确是从这里开始运行,直至生成所有应该生成的文件。

makefile与uboot目录的关系

uboot的目录是非常庞大的,包含各种单板各种架构,如何得知哪个架构,进入哪个目录编译,这是makefile必须清楚地。反而言之,用户如果要新增文件,应该怎么增加,应该如何修改makefile,也需要了解。

makefile的参数非常关键,也就是上面介绍的boards.cfg里面的参数。

ARCH=type,对应的源目录为 arch/arm

CPU=arm1136,对应的源目录为arch/arm/arm/cpu1136

SOC=mx31,对应的源目录为arch/arm/arm/cpu1136/mx32

这里对应了三个最关键的源目录路径,在arch/arm目录下有arm公有的东西,比如初始化之类的。在arch/arm/cpu/***目录下就是每个cpu自己的东西了,用户可以将cpu特定的一些函数写在这个目录下。arch/arm/arm/cpu1136/mx32就是当前Soc的特殊函数了,比如定时器,DDR初始化之类的。

VENDOR=hale,对应的头文件目录为board\hale,这里面定义了这个公司的所有头文件。

BOARD=tt01,对应的头文件目录为board\hale\tt01,这里面定义了这个单板的所有头文件。

综上所述,基本和单板相关的文件定义结构就清楚了,但是其他的一些定义,比如flash,net之类的,这些有公共部分,也有私有部分,这个与makefile就关系不大了,这部分以后再详述。

ARM Uboot经历——makefile与uboot目录相关推荐

  1. u-boot 顶层Makefile 分析

    U-Boot 顶层Makefile 解析 u-Boot -Makefile(一)  声明 : 以下解析大部分来自网络大神之手 所以可以放心阅读  Good luck VERSION = 1 PATCH ...

  2. GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读

    自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:M ...

  3. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

  4. U-Boot顶层Makefile分析

    参考:U-Boot顶层Makefile介绍 作者:一只青木呀 发布时间: 2020-10-22 16:22:17 网址:https://blog.csdn.net/weixin_45309916/ar ...

  5. u-boot的Makefile分析

    U-BOOT是一个LINUX下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对ARM,编译器系列软件为arm-linux-*. U-BOOT的下载地址: http://source ...

  6. 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. U-Boot 顶层 Makefile 详解

    U-Boot 顶层 Makefile 详解 1.U-Boot 工程目录分析 我们在分析 uboot 源码之前一定要 先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成 ...

  8. uboot研读笔记 | 12 - uboot目录结构分析(2016.03版本)

    整个目录结构分析的思维导图:[腾讯文档]uboot 2016.03目录结构分析 背景说明 我使用的是已经移植到atk-imx6ull开发板上的uboot,基于NXP原厂提供的uboot,版本为2016 ...

  9. 模仿u-boot的makefile结构

    u-boot(2014.04)是通过顶层makefile调用各子目录中的makefile来实现整个工程的编译的,实际上子目录的makefile是include进来的.这里仿照这种结构写个模板测试一下. ...

最新文章

  1. 合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...
  2. ELECTRA:超越BERT,2019年最佳NLP预训练模型
  3. 系统检测到您正在使用网页抓取工具_【安全】58反抓取简介
  4. 使用vscode删除markdown空行
  5. open-falcon
  6. 前端vue实现pdf文件的在线预览
  7. 调研了10家公司的技术架构,我总结出了一套大数据平台的套路
  8. JavaScript——闭包函数及拓展题目
  9. 好用的python表白神器_Python|520表白神器
  10. java执行数学表达式_数学表达式解析-JAVA版
  11. java基础知识总结(经典)_Java基础知识总结(超级经典)(三)
  12. android ps icon图标制作,PS设计App图标教程
  13. 叮叮获取所有用户信息_钉钉小程序获取用户信息
  14. Realsense-Ros安装配置
  15. 百度App Android启动性能优化-工具篇
  16. Python中的对象实例化过程 用python解密__new__
  17. 一个点围绕另一个点旋转后的坐标
  18. 侧里——我最钟爱的张国枯照片之Top10来源w
  19. A7799之STM32程序——STM32测试高精度ADC篇(二)
  20. 进入日资企业全攻略(转)

热门文章

  1. linux 更新系统时间
  2. Android APP升级时解析程序包时出现问题
  3. STP的安全特性详解与环路保护机制
  4. Recap|Hadoop User Group France
  5. oa系统需要的服务器配置,oa办公系统需要服务器配置
  6. 传奇服务端:GOM GeeM2引擎更新时必须要修改哪些地方?
  7. android 记分牌效果,全能记分牌 Scoreboard
  8. A4纸是多少像素大小?
  9. 使用Codemirror的markdown编辑器和使用showdown的Vue.js预览器
  10. Composer下载以及安装