Uboot Makefile 分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 <
#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: