嵌入式开发(S5PV210)——u-boot的顶层Makefile分析
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式开发(S5PV210)——u-boot的顶层Makefile分析相关的知识,希望对你有一定的参考价值。
前言
本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Makefile中。我手里的u-boot目录结构可以参考《嵌入式开发(S5PV210)——u-boot的不同来源和目录结构》。
1、uboot的版本
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
解析: U_BOOT_VERSION变量保存的是uboot版本号,这个变量最终会写到version_autogenerated.h文件里保存U_BOOT_VERSION由四个变量构成,可以理解成四级版本号,VERSION是主版本号,PATCHLEVEL(patch level:补丁等级)是次版本号,SUBLEVEL(sub level:次一级的等级)是再次版本号,EXTRAVERSION(extra version:额外的版本号)可以自己定义。VERSION_FILE变量记录的是保存uboot版本号文件的路径,$(obj)和编译方式有关,并且是在后面脚本里给obj赋值的:如果是原地编译则$(obj)为空;如果是单独输出文件夹编译,则$(obj)等于指定的文件夹路径;
2、主机的CPU架构和操作系统
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
解析:HOSTARCH 是主机的架构,HOSTOS是主机的操作系统,再用export导出到其他文件使用。嵌入式设备的开发是在PC机或者服务器上写代码并编译,这里的主机指的就是PC机或者服务器。
(1)HOSTARCH :shell uname -m:执行uname -m得到电脑类型,比如我英特尔的电脑得到就是i686;
sed -e s/i.86/i386/:用i386去替换前面的字符,其中点号是通配符,执行该条命令后i386就会替换掉i686;
余下的语句:都是和前一句一样的字符替换;(2) HOSTOS:
shell uname -s:执行uname -s得到当前机器的操作系统,比如我的就是PC机上安装虚拟机,操作系统是Linux;
tr ‘[:upper:]’ ‘[:lower:]’ | sed -e ‘s/(cygwin).*/cygwin/’:前字符转的大写转换成小写,执行完此语句得到linux;
3、静默编译
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
静默编译就是编译过程中不要输出相关打印的信息到控制台,在编译的时候加上-s开启静默编译(make -s)。
ifeq (,$(findstring s,$(MAKEFLAGS))):查找是否在编译的时候指定s标志,没有找到则XECHO=echo,会输出信息;如果没有找到则XECHO=:,不会输出信息;总体上就是通过条件编译来控制是否输出。
4、原地编译和单独输出文件夹编译(OBJTREE、SRCTREE、TOPDIR、CURDIR)
5、调用顶层mkconfig文件
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
解析:在执行命令(make x210_sd_config)进行配置uboot时,会去调用mkconfig文件,mkconfig脚本会去生成/include/config.mk文件并输入内容。具体细节参考《嵌入式开发(S5PV210)——u-boot的顶层mkconfig文件分析》。
6、ARCH 和 CROSS_COMPILE
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ARCH变量是Soc的结构名称,比如arm代表arm架构;CROSS_COMPILE变量是交叉工具编译链。上面的脚本就是通过架构来选择合适的交叉工具编译链。
7、调用顶层config.mk
8、链接脚本分析
9、总结:
上面所分析的主要从逻辑层面进行理解,可能你手里uboot的目录结构和我这里的完全不一样,我这里讲的文件的路径和文件名字也和你手里的uboot不一样,但是逻辑上和功能上都是一样的,该有的功能都会有。
以上是关于嵌入式开发(S5PV210)——u-boot的顶层Makefile分析的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式开发(S5PV210)——u-boot的顶层config.mk分析
嵌入式开发(S5PV210)——u-boot中如何确定启动方式