嵌入式开发(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)

参考博客《Makefile的两种编译方法——原地编译和单独输出文件夹编译》

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

参考博客《嵌入式开发(S5PV210)——u-boot的顶层config.mk分析》

8、链接脚本分析

参考博客:《嵌入式开发(S5PV210)——u-boot的链接脚本分析》

9、总结:

上面所分析的主要从逻辑层面进行理解,可能你手里uboot的目录结构和我这里的完全不一样,我这里讲的文件的路径和文件名字也和你手里的uboot不一样,但是逻辑上和功能上都是一样的,该有的功能都会有。

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/120693950