uboot主Makefile分析

version表示主版本号    patchlevel表示补丁版本号    sublevel表示次版本号    extreversion表示附加版本信息

U_BOOT_VERSION=1.3.4表示最终的版本号

$(obj)前面没有定义,并不表示obj为空。在makefile中,=表示整个文件中最后赋值的结果,因此obj具体值还要取决于后面的程序。总之,VERSION_FILE表示一个文件。

uname -m表示获取主机cpu型号,sed -e表示可以在同一行里可以执行多条sed命令,sed s/i.86/i386/ string表示将string中出现的i.86替换成i386。

uname -s表示获取主机操作系统,tr '[:upper:]' '[:lower:]'表示将所有大写字母替换成小写字母。sed -e 's/\(cygwin\).*/cygwin/')表示将cygwin.*都替换成cygwin。

最终,导出环境变量为HOSTARCH=x86_64,HOSTOS=linux。

编译时make -s,-s会作为MAKEFLAGS变量自动传给makefile。如果MAKEFLAGS中包含字母s,则XECHO=echo执行非静默编译;否则,执行静默编译。

如果编译时,命令中加入了O选项,即make O=/tmp,则将BUILD_DIR=/tmp。在实际操作中,可以有两种赋值BUILD_DIR的方式,第一种是export BUILD_DIR=/tmp/build然后make,第二种是make O=/tmp/build all。从代码中,可以明确地知道,O选项的优先级更高。

如果BUILD_DIR被定义,则创建BUILD_DIR文件夹,并获取完整路径。

导出TOPDIR SRCTREE OBJTREE MKCONFIG REMOTE_BUILD obj src等一系列环境变量。

其中,TOPDIR=SRCTREE=src;OBJTREE=obj;如果SRCTREE和OBJTREE不相等,则REMOTE_BUILD=1。

MKCONFIG := $(SRCTREE)/mkconfig。

于是乎,之前遗留下来的问题解决了,VERSION_FILE的表示的文件已经确定下来。

include表示,执行include/config.mk文件。最终导出ARCH CPU BOARD VENDOR SOC这几个环境变量。include/config.mk文件并不是源码自带的,而是配置过程中生成的。

我们在编译uboot之前会先进行配置,比如我手里的开发板是x210,在编译之前会先使用make x210_sd_config进行配置。

前面已经将MKCONFIG作为环境变量导出,MKCONFIG=$(SRCTREE)/mkconfig,即当前目录下的mkconfig。然后将x210_sd_config中的_config替换成空,最终会得到mkconfig x210_sd arm s5pc11x x210 samsung s5pc110。

首先,运行unconfig取消先前配置,因此在每次配置时候不需要特意的进行make unconfig。

其次,运行mkconfig x210_sd arm s5pc11x x210 samsung s5pc110,进行相关配置。

最后,运行echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk,进行重定位地址配置。

下面,我们先来看下主目录下的mkconfig文件

从中可以看出,这段程序什么也没有干。

最终,BOARD_NAME=x210_sd,并打印出Configuring for x210_sd board...

首先将当前目录切换到include中,然后建立软链接asm -> asm-arm。

建立软链接asm-arm/arch->asm-arm/arch-s5pc11x。

建立软链接regs.h->s5pc110.h、asm-arm/arch->asm-arm/arch-s5pc11x

建立软链接asm-arm/proc->asm-arm/proc-armv

将如下信息写入include/config.mk

ARCH=arm    
CPU = s5pc11x    
BOARD = x210    
VENDOR = samsung    
SOC = s5pc110

创建include/config.h,并向其中写入#include <configs/x210_sd.h>

到此,config.mk已经执行完毕

最终导出的环境变量为ARCH=arm、CPU=s5pc11x、BOARD=x210、VENDOR=samsung、SOC=s5pc110

......

定义交叉编译工具链的前缀,并导出交叉编译工具链的前缀。

加载主目录下的config.mk文件,这个文件中包含了很多的配置,包括板子的一些配置和编译器相关配置。这个展开内容非常多,也不是很有必要深入分析,不是太影响uboot的移植。

再往后看,都是在添加目标文件和库文件

一直往后看,开始看到编译流程,我们只要搞清楚配置的过程,编译的流程不是太需要关心

至此,主Makefile和mkconfig脚本已经大致结束了。

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/82840020