uboot移植之makefile分析

/*

Name:uboot之makefile分析

Data:2015-3-3

Author:suj_un

*/

Uboot之makefile分析

编译uboot,内核或者其他软件只需要执行make命令就可以生成可执行文件。执行命令后是怎么工作的?要知道这个就要看makefile了。现在就来揭开这玩意神秘的面纱。其中会粘一些代码段来分析。。。

VERSION = 2010

PATCHLEVEL = 03

SUBLEVEL =

EXTRAVERSION =

ifneq "$(SUBLEVEL)" ""

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

else

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

endif

TIMESTAMP_FILE = $(obj)include/timestamp_autogenerated.h

VERSION_FILE = $(obj)include/version_autogenerated.h

/******************前面这部分是定义boot的版本号的*******************/

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/)

/*  这句是获得开发主机的架构。相当于在shell下执行uname -m,sed -e表示后面跟的是一串命令脚本,表达式s/axxx/bxxx表示从标准输入中查找内容为axxx并替换成bxxx,其中axxx中可以使用.作为通配符。*/

HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ | \sed -e ‘s/\(cygwin\).*/cygwin/‘)

/* ******这句是获得开发主机的操作系统,和上面类似。tr ‘[:upper:]‘ ‘[:lower:]‘的作用是将标准输入中的所有大写字母转换成小写字母**********/

# Set shell to bash if possible, otherwise fall back to sh

SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \

else if [ -x /bin/bash ]; then echo /bin/bash; \

else echo sh; fi; fi)

/* 定义执行shell脚本的shell。若执行当前makefile的shell中定义了$BASH环境变量,并且文件"$BASH"是可执行文件,则SHELL的值为$BASH,否则若/bin/bash是可执行文件,SHELL的值为/bin/bash,否则SHELL的值为sh*/

exportHOSTARCH HOSTOS SHELL

/*********************************************************************************************************************/

ifdef O

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

BUILD_DIR := $(O)

endif

endif

/* 自定义编译输出目录, 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,若variable在命令行中定义过,则origin函数返回值为"command line"。则将BUILD_DIR设置为variable的值。假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,而BUILD_DIR被设置为“/tmp/build”。*/

ifneq ($(BUILD_DIR),)

saved-output := $(BUILD_DIR)

# Attempt to create a output directory.

$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

/**********若${BUILD_DIR}表示的目录没有定义,创建该目录  ****************/

# Verify if it was successful.

BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)

$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))

endif # ifneq ($(BUILD_DIR),)

/*************若${BUILD_DIR}为空,则将当前路径赋值给BUILD_DIR ****************/

ifeq ($(ARCH),arm)

CROSS_COMPILE = /opt/toolchains/arm-2009q3/bin/arm-linux-

endif

export CROSS_COMPILE

/***************定义交叉编译链的路径并配置到环境变量**************/

/* 后面一大段是定义源码路径和库文件的部分,省略*/

/*再接着就是编译依赖及可执行文件生成依赖部分,省略*/

itop_config:unconfig

@$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210

/* 自己开发板的配置 依赖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

它的作用是清除上次执行make *_config生成的配置文件(include/config.h,include/config.mk等)

下面那句$(@:_config=)的作用是将传进来的参数中的_config替换为空,因此此处得到itop。故这条命令分析实际为

./mkconfig itop arm arm_cortexa9 smdkc210 samsung s5pc210。因此执行mkconfig就得到了目标板型号,目标板cpu架构,cpu,板子号,生产厂家,SOC等信息

*/

接着看看mkconfig干了什么事

# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

while [ $# -gt 0 ] ; do

case "$1" in

--) shift ; break ;;

-a) shift ; APPEND=yes ;;

-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;

-t) shift ; TARGETS="`echo $1 | sed ‘s:_: :g‘` ${TARGETS}" ; shift ;;

*)  break ;;

esac

done

/*上来先进行参数检查,$#表示参数的个数此处为6,shift的作用是进行参数转换,即切换到下一个参数。进入循环判断参数中是否有--,-a等,我们的参数中没有故这段代码永远不会执行*/

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

[ $# -lt 4 ] && exit 1

[ $# -gt 6 ] && exit 1

/****BOARD_NAME的值设置为$1的值,在这里就是itop,判断参数的个数是否少于4个或者大于6个,如果成立则认为参数错误退出****/

下面就是对目标板的配置过程

再看看config.mk

前面一段是指定交叉编译命令

#Load generated board configuration

sinclude $(OBJTREE)/include/autoconf.mk

ifdef ARCH

sinclude $(TOPDIR)/lib_$(ARCH)/config.mk# include architecture dependend rules

endif

ifdef CPU

sinclude $(TOPDIR)/cpu/$(CPU)/config.mk# include  CPUspecific rules

endif

ifdef SOC

sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk# include  SoCspecific rules

endif

ifdef VENDOR

BOARDDIR = $(VENDOR)/$(BOARD)

else

BOARDDIR = $(BOARD)

endif

ifdef BOARD

sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk# include board specific rules

endif

/*********这段是加载相应的config.mk文件。如果定义了相应的变量则加载对应路径下的文件,其中sinclude是如果后面路径中的文件存在则加载,如果不存在则什么事情都不干。*********/

至此makefile相关的东西基本就完了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

时间: 2024-11-05 18:53:26

uboot移植之makefile分析的相关文章

U-Boot移植之前期分析(上)

老是看别人移植uboot,用别人移植好的uboot,今天终于下定决心自己移植一个uboot来玩玩,好歹我也是个软件开发人员啊. 第一步:去ftp://ftp.denx.de/pub/u-boot/网站下载个uboot工程源码,为了防止环境出问题,我决定用个老一点的,于是就下了:u-boot-1.1.6.tar.bz2. 第二步:解压源码:tar  jxvf  u-boot-1.1.6.tar.bz2. 第三步:建立source insight工程 好了完成以上三步之后,我们需要的前提条件都准备好

U-Boot移植之前期分析(下)

接U-Boot移植之前期分析(上): 2. 顶层目录下mkconfig的分析过程 在上面的分析中知道了语句:"@$(MKCONFIG) $(@:_config=) arm arm920t MY_JZ2440 sumsung s3c24x0"对应于执行顶层目录下的mkconfig文件并传递了六个参数 ($0-$6):100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0.下面分析这句话的到底做了什么事情,具体可以阅读源码,由于比较简单这里直接列出具体

tiny210——uboot移植之Makefile剖析篇

这篇东东早就写好了,一直没时间发出来,现在终于有时间发一下了记录总结uboot的学习历程,好像够详细了,以后忘了也可以再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:可以先从编译目标开始顺藤摸瓜地分析,先不要关注具体细节,着重关注主要的代码结构和编译过程 技巧2:追踪分析时要通过文本或者其他途径暂时记录重要的线索 技巧3:将主要的Makefile文件中export出来的变量以及include的文件提取出来,看看include的文件大致是些什么文件,当看到一些来历不明的变

Uboot 2014.07 makefile分析 - 其他Cortex系列

uboot的官网可以通过谷歌搜索得到,显示结果第一个链接就是. 官网:: http://www.denx.de/wiki/U-Boot ftp下载: ftp://ftp.denx.de/pub/u-boot/ 本文以uboot 2014.07为例,一般第一步总是类似这样: make smdkc100_config 然后执行make 先看Makefile第481 行 %_config:: outputmakefile @$(MKCONFIG) -A $(@:_config=) 当输入make sm

第二章、Tiny4412 U-BOOT移植二 启动分析【转】

本文转载自:http://blog.csdn.net/eshing/article/details/37521481 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.启动过程说明 讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道.CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令.但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(Exynos4412芯片边上有一颗24MHz,一颗27MHz,一颗32.768KHz):CPU的工作模式.

uboot移植——uboot源码目录分析

uboot移植(一)--uboot源码目录分析 本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot 一:uboot的概念及移植的原理. uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图.从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能. 移植原理:uboot中有很多平行代码,各自属于各

uboot移植(二)——uboot mkconfig脚本分析

uboot移植(二)--uboot  mkconfig 脚本分析 一:mkconfig脚本的作用 mkconfig是通过传入的参数来脚本用于某个开发板配置uboot,主要是通过判断其输入的参数来创建符号链接文件,使它们指向该开发板对应的配置文件来进行配置. (1)配置CPU架构相关的文件:在include目录下创建asm文件,指向include/asm-arm (2)配置SOC类型相关的文件:include目录下创建regs.h文件,指向include/s5pc110.h include/asm

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

嵌入式linux开发uboot移植(三)——uboot启动过程源码分析

嵌入式linux开发uboot移植(三)--uboot启动过程源码分析 一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现:BL2阶段主要是对外部设备如网卡.Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现. 1.BL1阶段 uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下: