Uboot Makefile 分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Makefile 目录:

Board-------------------平台依赖,每个板子在board目录下对应一个子目录Cpu----------------------CPU依赖,每个CPU对应一个子目录

Lib-arm----------------- ARM体系结构通用文件

Common---------------通用的多功能函数

Include-----------------与板子相关的头文件和板级配置文件

Lib_generic------------通用库

Net----------------------网络协议

Drivers------------------通用设备驱动

以海思hi3521uboot为例分析

Uboot makefile过程:

1)make clean; make distclean

2)make godeyes_config

3)make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- godarm_config Uboot 编译的三种方式:

1)make O=/temp/build all

2)export BUILD_DIR=/temp/build; make

3)没有定义BUILD_DIR变量,生成的目标文件在源码目录下

一般采用第三种方式。

Make godeyes_config 编译分析

##定义了makefile的几个变量,uboot的版本VERSION=2010,PATCHLEVEL=06,

U_BOOT_VERSION=2010.06

HOSTARCH=i686

HOSTOS=linux

SHELL=/bin/bash

然后导出这些变量作为环境变量,供子shell使用。

Ifeq (,$(findstring s,$(MAKEFLAGS))) 为真,XECHO=echo

## ifdef O 如果定义了O变量,则$(origin O)判断变量O的来源,如果变量O在make命令的参数里定义,则$(origin O)返回值为command line。

如果通过环境变量定义了$(BUILD_DIR),$(BUILD_DIR)不为空,执行“save-output:= $(BUILD_DIR),接着利用shell命令判断$(BUILD_DIR)路径是否存在,不存在则mkdir创建此目录。接着判断$(BUILD_DIR)路径是否成功创建,不成功则标准错误输出“directory “$(saved-output)” does not exist”

## 接着是定义一连串目录变量:OBJTREE,SRCTREE,TOPDIR,LNDIR,赋值后:OBJTREE=$(CURDIR),即makefile所在的当前目录,

SRCTREE=$(CURDIR)

TOPDIR=$(CURDIR)

LNDIR=$(CURDIR)

MKCONFIG=$(CURDIR)/mkconfig

OBJTREE和SRCTREE相等,REMOTE_BUILD为空

## obj和src也为空。“SUBDIRS=tools examples/standalone examples/api”

接着判断include/config.mk这个配置文件是否存在,在make godeyes_config之前是不存在的所以执行ifeq的else部分,找啊找,在下面找到了:

## godeyes_config这个target在else后面的一大堆targets里都不存在,所以这部分还是不执行。执行的是“%:%_config”这个规则。

接着在下面找到:

## target godeyes_config的依赖条件时unconfig,先执行unconfig的规则命令,将include/和board/目录下的一些配置文件全删掉。接着运行MKCONFIG=$(CURDIR)/mkconfig这个脚本

Branch-1 begins:

执行$(CURDIR)/mkconfig godeyes arm godeyes godeyes NULL godeyes:

Mkconfig:

## “APPEND=no”while [$# -gt 0]不执行。“[ “${BOARD_NAME}” ]”${BOARD_NAME}为空,所以整个表达式为假,BOARD_NAME被赋值为godeyes。接着输出”Configuring for godeyes board …”

接下来创建一些软连接:

## $(SRCTREE)和$(OBJTREE)是相等的,都等于$(CURDIR),所以执行if的else部分,先来到./include目录下,然后分别建立asm,asm/arch,asm/proc软连接。

## 接着创建./include/config.mk文件,写入”ARCH=arm”,”CPU=godeyes”,”BOARD=godeyes”,“SOC=godeyes”“BOARDDIR=godeyes”

接下来生成./include/config.h文件:

## APPEND=no,生成一个新的./include/config.h文件。将”* Automatically generated – do not edit”这句话写入config.h。$(TARGETS)为空,不做for循环。

## 最后的cat <>config.h……EOF是直接在config.h里面写入….这几句话:

#define CONFIG_BOARDDIR board/godeyes

#include

#include

#include

Exit 0表示程序执行完毕正常退出。

Branch-1里的主要工作就是生成./include/config.mk和./include/config.h这两个文件,config.mk文件里定义了uboot中与板子、CPU相关的参数,config.h文件里包含了一些后面编译用到的.h头文件。

Branch-1 ends.

Make godeys_config 执行完毕。主要是设置编译环境变量,生成config.mk和config.h两个文件。

第二大步骤make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- godarm_config

和make godeyes_config不同的是:

判断include/config.mk这个配置文件是否存在,在make godeyes_config之后是存在的,所以执行ifeq

##make 命令make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- godarm_config 没有指定targets,所以makefile里的all目标成为默认目标。all:

相关文档
最新文档