zoukankan      html  css  js  c++  java
  • uboot配置和编译过程详解

    根据朱有鹏老师讲解整理

    一、uboot主Makefile分析

    1、uboot version确定(Makefile的24-29行)

    • include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了

    2、HOSTARCH和HOSTOS

    • HOSTARCH:表示主机的CPU的架构,值会影响后面的CROSS_COMPILE环境变量的值。HOSTOS:主机

    3、静默编译(50-54行)

    • 不希望看到这些编译信息,就后台编译即可。这就叫静默编译。

    4、两种编译方法(Makefile的78-123行)。

    • 编译复杂项目,Makefile提供2种编译管理方法。默认情况下是当前文件夹中的.c文件,编译出来的.o文件会放在同一文件夹下。这种方式叫原地编译。原地编译的好处就是处理起来简单。
    • 原地编译有一些坏处:第一,污染了源文件目录。第二的缺陷就是一套源代码只能按照一种配置和编译方法进行处理,无法同时维护2个或2个以上的配置编译方式。
    • 为了解决以上2种缺陷,uboot支持单独输出文件夹方式的编译(linux kernel也支持,而且uboot的这种技术就是从linux kernel学习来的)。基本思路就是在编译时另外指定一个输出目录,将来所有的编译生成的.o文件或生成的其他文件全部丢到那个输出目录下去。源代码目录不做任何污染,这样输出目录就承载了本次配置编译的所有结果。
    • 具体用法:默认的就是原地编译。如果需要指定具体的输出目录编译则有2种方式来指定输出目录。(具体参考Makefile 56-76行注释内容)

    第一种:make O=输出目录 

    第二种:export BUILD_DIR=输出目录 然后再make

    如果两个都指定了(既有BUILD_DIR环境变量存在,又有O=xx),则O=xx具有更高优先级,听他的。

    5、记录编译后的.o文件往哪里放

    • OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录。
    • SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
    • 总结:在默认编译下,OBJTREE和SRCTREE相等;在O=xx这种编译下OBJTREE和SRCTREE不相等。Makefile中定义这两个变量,其实就是为了记录编译后的.o文件往哪里放,就是为了实现O=xx的这种编译方式的。

    6、MKCONFIG(Makefile的101行)

    • Makefile中定义的一个变量(在这里定义,在后面使用),它的值就是我们源码根目录下面的mkconfig。这个mkconfig是一个脚本,这个脚本就是uboot配置阶段的配置脚本。后面要用至少3节课详细讲这个配置脚本的工作。

    7、包含config.mk(133行)

    • include/config.mk不是源码自带的(你在没有编译过的源码目录下是找不到这个文件的),要在配置过程(make x210_sd_config)中才会生成这个文件。因此这个文件的值和我们配置过程有关,是由配置过程根据我们的配置自动生成的。
    • 调用MKCONFIG脚本传参时的参数

    8、定义交叉编译工具链的前缀(136-182

    • CROSS_COMPILE是被ARCH所确定的,只要配置了ARCH=arm,那么我们就只能在ARM的那个分支去设置CROSS_COMPILE的值

    9、包含/uboot/config.mk(188)

    10、主Makefile中第一个目标all(291)

    二、uboot配置过程详解  mkconfig分析(make  x210_sd_config)

    1.mkconfig脚本的6个参数

    • $(@:_config=) arm s5pc11x x210 samsung s5pc110
    • x210_sd_config里的_config部分用空替换,得到:x210_sd,这就是第一个参数,所以:
    • $1: x210_sd
    • $2: arm
    • $3: s5pc11x
    • $4: x210
    • $5: samsumg
    • $6: s5pc110
    • 所以,$# = 6

    2、确定BOARD_NAME="$1"(23)

    3、判断传参的个数,传参正确往下执行(25)

    4、创建符号链接(33-118)

    • 第一个:在include目录下创建asm文件,指向asm-arm。(46-48行)
    • 第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110
    • 第三个:在include目录下创建regs.h文件,指向include/s5pc110.h
    • 删除第二个。
    • 第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x
    • 第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv

    5、创建include/config.mk文件(123-129)

    6、创建(默认情况)/追加(make -a时追加)include/config.h文件(134-141)

    三、config.mk详解

    • 编译工具定义(config.mk 94-107行)
    • 包含开发板配置项目(config.mk, 112行)
    • 定义链接脚本名称(145)
    • 指定链接地址TEXT_BASE = 0xc3e00000
    •  自动推导规则(239-256)

  • 相关阅读:
    [笔记] 辛普森积分
    Luogu P4175 [CTSC2008]网络管理
    Luogu P4331 [BOI2004]Sequence 数字序列
    Luogu P1456 Monkey King
    Luogu P3261 [JLOI2015]城池攻占
    Luogu P4309 [TJOI2013]最长上升子序列
    Luogu P4246 [SHOI2008]堵塞的交通
    Luogu P3638 [APIO2013]机器人
    Luogu P4294 [WC2008]游览计划
    CF613D Kingdom and its Cities
  • 原文地址:https://www.cnblogs.com/zyj23/p/12312606.html
Copyright © 2011-2022 走看看