uboot移植之主makefile分析

author author     2022-08-29     449

关键词:

1:#uboot 的版本号

VERSION      = 1                        #主版本号

PATCHLEVEL   = 3                   #次版本号

SUBLEVEL     = 4                     #再次版本号

EXTRAVERSION =                     #关于uboo的一些另外的描述

#变量U_BOOT_VERSION用来保存uboot的版本信息

U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

VERSION_FILE = $(obj)include/version_autogenerated.h    //存放变量U_BOOT_VERSION,也就是版本信息

# 这个文件是编译时产生的中间文件include/version_autogenerated.h,这个文件的内容为   #define U_BOOT_VERSION "U-Boot 1.3.4"。

2:HOSTARCH(主机架构)和HOSTOS(主机操作系统)

HOSTARCH := $(shell uname -m |  

sed -e s/i.86/i386/

   -e s/sun4u/sparc64/

   -e s/arm.*/arm/

   -e s/sa110/arm/

   -e s/powerpc/ppc/

   -e s/ppc64/ppc/

   -e s/macppc/ppc/)


HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ |

   sed -e ‘s/(cygwin).*/cygwin/‘)


export HOSTARCH HOSTOS

(1)shell uname -m,脚本执行的方法,可以通过shell + 命令来直接执行, uname -m表示获取主机架构

(2)| 表示管道,前面的表达式的结果作为后面表达式的一个输入,从而得到最终的输出,这里也就是shell uname -m得到的结果通过管道作为 sed -e的输入。

(3)sed -e 直接在命令模式下进行sed的动作,s 表示替代。所以这部分的意识就是,通过执行uname -m来获取主机的架构,然后通过管道的方法根据主机的架构来得到我们需要的主机架构,比如,我的主机架构是i686,那么sed -e s  /i.86/i386,所以HOSTARCH :=  i386。(:=表示覆盖之前的内容)

(4)uname -s 表示获取操作系统的名字 ,我们在ubuntu下开发,所以操作系统就是Linux,然后通过tr ‘[:upper:]‘ ‘[:lower:]‘将大写字母改为小写,也就是HOSTOS := linux


3:ifeq (,$(findstring s,$(MAKEFLAGS)))

XECHO = echo

else

XECHO = :

endif

判断是否为静默编译,静默编译就是不在控制台打印Makefile里面的信息,但是其他文件的信息还是会被打印出来。

$(findstring s,$(MAKEFLAGS)的意思是在MAKEFLAGS查找字符 s ,也就是假如我们编译的时候输入的是 make -s 则为静默编译。


4:ifdef O

ifeq ("$(origin O)", "command line")

BUILD_DIR := $(O)

endif

endif

原地编译或者是单独文件编译,

单独文件编译实现的方法有两种

(1)通过make  O = xxx(输出文件的pathname)来实现,主要这种方式在我们配置和清除的时候也要添加   O = xxx,也就是

make distclean  O = xxx

make x210_sd_config  O = xxx

make O = xxx

(2)通过定义 export BUILD_DIR=xxx(输出文件的pathname)来实现, O=xxx的优先级高于export BUILD_DIR=xxx


5:OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))    #输出文件目录

SRCTREE := $(CURDIR)   #当前目录,Makefile的当前目录也就是uboot的根目录

TOPDIR := $(SRCTREE)     #顶层目录

LNDIR := $(OBJTREE)     #链接文件目录

export TOPDIR SRCTREE OBJTREE

根据上面选择的是原地编译还是单独文件编译来确定并且导出这几个环境变量,用于后面使用,当选择原地编译时OBJTREE = SRCTREE

OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))

如果 (if $(BUILD_DIR)为真(也就是BUILD_DIR被赋值)则OBJTREE = BUILD_DIR,否则OBJTREE =  CURDIR。


6:MKCONFIG := $(SRCTREE)/mkconfig

export MKCONFIG

定义并保存环境变量MKCONFIG。uboot根目录下的mkconfig文件是一个很重要的文件,uboot的配置就是根据这个文件的内容来实现的。


7:include $(obj)include/config.mk

export ARCH CPU BOARD VENDOR SOC

包含$(obj)目录下的include目录下的config.mk文件,这个文件的内容为

ARCH   = arm

CPU    = s5pc11x

BOARD  = x210

VENDOR = samsung

SOC    = s5pc110

config.mk文件也是在配置的时候生成的

obj = OBJTREE,当原地编译的时候OBJTREE = SRCTREE = 源码根目录,


8:ifeq ($(ARCH),arm)              

#CROSS_COMPILE = arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-

CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

通过ARCH的值来确定交叉编译工具链的前缀,CROSS_COMPILE的值其实就是交叉编译工具链的前缀。


9:include $(TOPDIR)/config.mk

添加根目录下的config.mk文件,这个文件的主要作用是

(1)补全交叉编译工具链,前面,在CROSS_COMPILE变量中我们保存了交叉编译工具链的前缀,其后缀就是在这个文件中补全的

(2)sinclude $(OBJTREE)/include/autoconf.mk:添加编译目录下的/include/autoconf.mk文件,这个文件是配置后生成的,里面全是CONFIG_开头的宏,这些宏定义左右着配置的uboot属于哪一款开发板。而这个文件的生成材料是顶层目录下的include/configs/xxx.h这个头文件,里面的一个头文件对应一款开发板,这个头文件的内容就是去描述或者说是配置这个开发板的硬件相关的信息。

(3)TEXT_BASE:链接地址的值


10:OBJS  = cpu/$(CPU)/start.o,以及后面的LIBS  = lib_generic/libgeneric.a等是在指定编译时需要添加的文件。


11:ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis

ifeq ($(ARCH),blackfin)

ALL += $(obj)u-boot.ldr

all: $(ALL)


$(obj)u-boot.hex: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O ihex $< [email protected]

当我们make编译的时候其实就是make all,当我们make all的时候又会生成类似于u-boot.hex的很多小目标,其中要注意的是最后一个目标unconfig

unconfig:

@rm -f $(obj)include/config.h $(obj)include/config.mk

$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

$(obj)board/$(VENDOR)/$(BOARD)/config.mk

unconfig这个目标就是rm -f移除我们在配置的时候生成的配置文件,这也是我们在make x210_sd_config之后再次执行make x210_sd_config时得到的效果是一样的,原因就是x210_sd_config依赖于unconfig,unconfig而将我们之前配置的文件全部移除了。


12:x210_sd_config : unconfig

@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110

@echo "TEXT_BASE = 0xc3e00000" >

           $(obj)board/samsung/x210/config.mk

@表示静默执行

$(MKCONFIG) 表示引用MKCONFIG这个环境变量,也就是根目录下的mkconfig,并且向这个文件传递了$(@:_config=) arm s5pc11x x210 samsung s5pc110这6个参数。

当我们执行make x210_sd_config的时候其实就是执行了这里的x210_sd_config这个目标。




本文出自 “11664570” 博客,请务必保留此出处http://11674570.blog.51cto.com/11664570/1919951

uboot移植之九鼎提供的uboot的文件分析

....gitignore:git管理工具相关的文件。(2)arm_config.mk:一个Makefile文件,将来会被Makefile里面的某句代码调用。(3)CHANGELOG、Changelog_Samsung、CHANGELOG-before-U-Boot-1.1.5:三个CHANELOG文件,其实就是该版本的uboot的变迁记录。(4)config.mk... 查看详情

uboot之初体验

...regit忽略文件列表,在uboot分析时可以直接忽略。XXX.mkMakefile文件,会被Makefile调用。image_split分割uboot.bin到bl1的脚本文件。MAKEALL用于编译uboot的脚本。Makefileuboot源代码的主要Makefile 查看详情

uboot移植一uboot架构分析

开发环境:  1.开发板mini2440  2. u-boot-2010.12参考i资料:https://blog.csdn.net/androidbbc/article/details/50961163     http://www.cnblogs.com/kele-dad/p/8969174.html一、下载u-boot-2010.12,并且解压二、分析u-boor-2010.12a 查看详情

uboot配置编译源码分析

一、X210官方uboot配置编译实践1、找到官方移植好的uboot(BSP概念)(1)源头的源代码是uboot官网下载的。这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的SoC对应的移植版本。(2)SoC厂商在推出一... 查看详情

一,移植uboot,分析uboot启动流程(代码片段)

文档时间:2018-08-08交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10uboot启动流程简要如下:    a,设置CPU为管理模式    b,关闭看门狗    c,关闭中断    d,设置时钟频率    e,进入lowlevel_init.S,... 查看详情

linux系统移植:u-boot顶层makefile分析(上)(代码片段)

目录Linux系统移植:U-Boot顶层Makefile分析(上)一、版本号二、传递变量到子make三、命令输出四、静默输出五、编译输出目录六、代码检查七、模块编译八、获取主机架构和系统九、设置目标架构、交叉编译器和配置... 查看详情

linux内核顶层makefile详解

...c;在具体移植之前,我们先来学习一下Linux内核的顶层Makefile文件,因为顶层Makefile控制着Linux内核的编译流程。 查看详情

uboot移植之start_armboot()函数分析

/********************************uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件。主要是SoC外部硬件(譬如iNand网卡芯片.......)uboot本身的一些东西(uboot的命令环境变量等.....)。然后最终初始化完必要的东西后进入到u... 查看详情

uboot移植之九鼎提供的uboot的文件夹分析

...到的一些函数,这些函数都是硬件无关的,所以和我们的移植没多大关系(2)api_examples:api的示例代码(3)board:开发板相关的文件夹,这个文件夹里面存放的一个文件夹对应一款开发板或者是一个芯片厂商。我们在config配置... 查看详情

从0移植uboot_配置分析(代码片段)

来源:Linux社区 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141018.htm 和绝大多数源码编译安装一样,uboot的编译流程也类似于"makeconfig->make->makeinstall"**三步,只是由于uboot本身是针对多种平台的bootloader,软件... 查看详情

从0移植uboot_启动流程分析(代码片段)

来源:Linux社区 作者:xiaojiang1025 : http://www.linuxidc.com/Linux/2017-02/141019.htm 经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求... 查看详情

uboot移植之start.s分析

uboot的函数入口要查看链接脚本中ENTTRY的入口参数,我们这里的链接脚本在board/samsung/x210/u-boot.lds,这个文件里面的开头有一句ENTRY(_start),所以uboot的入口就是在_start这个标识的地方。 * Base codes by scsuh (sc.su... 查看详情

1uboot移植和imx文件分析

 本系列使用的平台为百问网IMX6ULL,通过对NXP提供uboot的分析和修改,使其支持百问网IMX6ULL本系列参考了正点原子和百问网的IMX6ULL教程,在此表示衷心感谢本章参考文件有:《i.MX6BSPPortingGuide》、《ARMv7架构参考手册》百度网... 查看详情

基于335x平台的uboot中交换芯片驱动移植

...备,及所需所有驱动接口。(2)/driver/net/phy/目录下,修改Makefile,增加obj-$(CONFIG_MV88E6321_SWITCH)+=mv88e6321.o(3)、在/driver/net/phy/目录下的p 查看详情

uboot源码分析

...方的这份为对照。(2)不同版本的uboot或者同一版本不同人移植的uboot,可能目录结构和文件内容都有所不同。将来大家懂了后也可以自己根据需要去添加/删除/更改目录结构。(3)九鼎在以三星的uboot为原材料进行移植时,把三星版... 查看详情

uboot主makefile分析(代码片段)

一.Makefile配置  1.1.makexxx_config    1.1.1.笔者实验时是make x210_sd_config      a. x210_sd_config是Makefile下的一个目标    1.2.1. x210_sd_config相关代码分析      a.@表示静默执行      b.MKCONFIG是Mak... 查看详情

uboot主makefile解析

...nfig,make的时候都作了那些动作呢,这里我先大概介绍一下Makefile的内容,然后在大概理解一下命令执行的流程。如果有错的地方,希望大家指正,谢谢。1.u-boot顶层目录的Makefile分析:HOSTARCH:=$(shelluname-m|      &... 查看详情

bsp开发之ubootuboot常用命令以及代码分析(代码片段)

...197定制UBOOT命令UBOOT代码分析(通用UBOOT2016.01代码学习)顶层Makefile分析UBOOT启动过程代码分析第一阶段第二阶段打印测试命令行处理UBOOT代码分析(RTL8197定制uboot代码学习)顶层Makefile分 查看详情