注:以下知识来源于《朱老师物联网大讲堂》
1 uboot version确定
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
(1)uboot的版本号分为3个级别:
VERSION:主版本号
PATCHLEVEL:次版本号
SUBLEVEL:子版本号
EXTRAVERSION:另外附加的版本信息(可自定义)
这4个用“ . ”分隔开共同构成了最终的版本号。
(2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号。
(3)uboot目录include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以在源目录中没有,只有编译过后才能找到。它里面的内容是一个宏定义,其右值的内容就是上述介绍的uboot的版本号。如果需要进一步分析,可以自行修改主Makefile中几个version有关的变量,然后重新编译uboot,将其烧录进开发板,看启动时uboot打印出来的版本消息。
2 HOSTARCH和HOSTOS
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/)
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
export HOSTARCH HOSTOS
(1)在shell中执行 uname-m 会得到一个字符串,它其实是当前所使用电脑的CPU的版本号。
(2)在关于这部分的代码中,会看到字符“ | ”,它在shell中被解释为管道,其作用是把管道前面的一个运算式的输出作为后面的一个输入再去做处理,最终的输出才是整个式子的输出。
(3) HOSTARCH这个词,HOST是主机,即当前负责编译的电脑;ARCH是architecture的缩写,表示CPU所采用的体系结构。连在一起,就表示为主机CPU的架构。
(4)HOSTARCH和HOSTOS为uboot的两个环境变量。
3 静默编译
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
(1)平时默认编译时命令行会打印出很多编译信息,有时候如果不想看到这些编译信息,可以设置在后台编译,即静默编译。
(2)使用方法就是 make -s,-s会作为MAKEFLAGS传给Makefile,通过以上代码XECHO变量就会被置为空(默认为echo),于是实现了静默编译。
4 两种编译方法(原地编译与重定向编译)
(1)Makefile提供2种编译方法,默认情况下是当前文件夹中的.c文件夹,编译出来的.o文件会放在同一文件夹下,这种方式就叫原地编译。
(2)原地编译的好处就是处理起来简单。但它存在一些坏处,如:污染源文件目录;一套源代码只能按照一种配置和编译方法进行处理,无法同时维护2个或2个以上的配置编译方式。
(3)为了解决以上问题,uboot支持单独输出文件夹方式的编译(重定向编译),Linux kernel也支持,并且uboot就是从其借鉴而来。基本思路就是在编译时另外指定一个输出目录,将来所有编译生