boot配置和编译过程详解(3)

这一段话是检测编译时主机的架构和操作系统,其中使用了sed工具进行了相应的处理,
sed -e s/i.86/i386/ 意思就是不管是i686\i386还是i586,都用i386替代。
tr '[:upper:]' '[:lower:]'的意思是将操作系统名字中可能存在的大写字母全部转换为小写字母。
笔者用的是i686的Linux操作系统,因此执行的结果是 HOSTARCH=i386, HOSTOS=linux,
最后调用export导出为环境变量供其他地方使用。

静默编译

所谓静默编译就是在编译的时候不打印任何信息(错误和警告信息除外)。

# Allow for silent builds ifeq (,$(findstring s,$(MAKEFLAGS))) XECHO = echo else XECHO = : endif

这段代码的意思是,在执行make时输入的参数中搜索’s’,如果有的话就给XECHO赋值为echo,否则就赋值为空,然后在其他地方用XECHO来打印信息,就实现了是否启用静默编译。
make -s就启用了静默编译。

指定目录编译

u-boot除了支持静默编译外还支持在不同目录进行编译,即将配置过程生成的文件以及编译产生的中间文件全都输出到一个指定的目录,从而避免污染源码目录。
从56-76的注释中可以看出有两种方式指定
1、在命令行通过make O=/tmp/build 指定输出目录为/tmp/build
2、指定BUILD_DIR=/tmp/build环境变量
注意:通过阅读根目录下的README文件,如果要在其他目录进行编译,在配置阶段和编译阶段都要指定输出的目录位置,如下:

1. Add O= to the make command line invocations: make O=/tmp/build distclean make O=/tmp/build NAME_config make O=/tmp/build all 2. Set environment variable BUILD_DIR to point to the desired location: export BUILD_DIR=/tmp/build make distclean make NAME_config make all

Makefile中的78-93行完成工作就是,如果指定了O参数,就判断O后边指定的目录存在不存在,如果不存在就创建,并把指定的路径赋值给BUILD_DIR变量 ——
然后就是给几个下边变量赋值

OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) //输出目录 SRCTREE := $(CURDIR) //源码目录 TOPDIR := $(SRCTREE) //顶层目录(源码根目录) LNDIR := $(OBJTREE) //链接目录 export TOPDIR SRCTREE OBJTREE //导出为环境变量 MKCONFIG := $(SRCTREE)/mkconfig //mkconfig配置脚本的路径 export MKCONFIG //导出为环境变量

然后是编译要用的$(obj) 和$(src)

# $(obj) and (src) are defined in config.mk but here in main Makefile # we also need them before config.mk is included which is the case for # some targets like unconfig, clean, clobber, distclean, etc. ifneq ($(OBJTREE),$(SRCTREE)) obj := $(OBJTREE)/ src := $(SRCTREE)/ else obj := src := endif export obj src

如果编译输出目录和源码目录不是通一个目录,就将源码目录的路径赋值给$(src),将输出的路径赋值给$(obj)。
否则就置空。

确定目标架构和交叉编译工具

从124行开始一直到182行都是在确定要使用的交叉编译工具。
其中在133行的时候导入了一个配置文件

# load ARCH, BOARD, and CPU configuration include $(obj)include/config.mk export ARCH CPU BOARD VENDOR SOC

$(obj)include/config.mk此文件在执行mkconfig脚本的时候生成,里边保存着开发板以及CPU的型号和架构信息

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

然后再将这些信息导出为环境变量。

ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif export CROSS_COMPILE

再然后就是指定交叉编译工具,并将CROSS_COMPILE导出为环境变量了。

此外
在185行导入了U-boot根目录下的config.mk文件

# load other configuration include $(TOPDIR)/config.mk

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0a14559f5f7a7ea10a97317d2dcbf9ed.html