2.4、uboot配置和编译过程详解
2.4.1、uboot主Makefile分析1
2.4.1.1、uboot version分析
- (1)uboot版本号分为3个级别:
VERSION:主版本号
PATCHLEVEL:次版本号
SUBLEVEL:再次版本号
EXTRAVERSION:另外附加的版本信息
这四个用.隔开共同构成了最终的版本号。
- (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号
- (3)include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了。它里面的内容是一个宏定义,宏定义的值内容就是我们在Makefile中配置的uboot的版本号。
- (4)验证方法:自己修改主Makefile中几个Version有关的变量,然后重新编译uboot,然后烧录到SD卡中,从SD卡启动,然后去看启动时uboot打印出来的版本信息,看看变化是不是和自己的分析一致。
2.4.1.2、HOSTARCH和HOSTOS
- (1)直接在shell中执行uname -m得到i686,得到的值其实你当前执行这个命令的电脑的CPU的版本号。
- (2)shell中的竖9线叫做管道,管道的作用就是把管道前面的运算时的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出
- (3)HOSTARCH这个名字:HOST是主机,就是当前在做开发用的这台电脑就叫做主机;ARCH是architecture(架构)的缩写,表示CPU的架构。所以HOSTARCH就表示主机的CPU架构。
- (4)这两个环境变量是主句的操作系统和主机的CPU架构,的出货保存备用,侯曼自然会用到。
2.4.2、uboot主Makefile分析2
2.4.2.1、静默编译(50~54行)
- (1)平时默认编译是命令行会打印出来很多编译信息。但是有时候我们不希望看到这些编译信息,就后台编译即可。这就叫做静默编译。
- (2)使用方法就是编译时make -s, -s会作为MAKEFLASS传给Makefile,在50~54行这段代码作用下XECHO变量就会变成空(默认等于echo),于是就实现了静默编译
2.4.2.2、2种编译方法(原地编译和单独输出文件夹编译)
- (1)编译复杂项目,Makefile提供两种编译方法。默认情况下时当前文件夹中的.c文件,编译出来的.o文件会放在同一个文件夹下,这种方式叫做原地编译。原地编译的好处是处理起来简单
- (2)原地编译有一些坏处:第一:污染了源文件目录。第二的缺陷就是一套源代码只能按照一种配置和编译方法进行处理,无法同时维护2个或者2个以上的配置编译方式。
- (3)为了解决以上两种缺陷,uboot支持单独输出文件夹方式的编译(linux kernel也支持,而且uboot的这种技术就是从linux kernel学习来的)。基本思路就是在编译时另外指定一个输出目录,将来所有的编译生成的.o文件和生成的其他文件全部丢到输出目录下面。源代码目录不做任何污染。这样输出目录就承载了本次配置编译所有的结果。
- (4)具体的用法:默认的就是原地编译,如果需要指定具体的输出目录编译则有两种方式来指定输出目录。
第一种:make O=输出目录
第二种:export BUILD_DIR=输出目录,然后在make
如果两个都指定了(既有BUILD_DIR环境变量,又有O=xx,则O=xx有更高的优先级)
- (5)两种编译的实现代码在Makefile的78行~123行