uboot顶层Makefile前期所做工作说明三
一. uboot顶层 Makefile文件
uboot顶层 Makefile,就是 uboot源码工程的根目录下的 Makefile文件。
本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习,如下:
uboot顶层Makefile前期所做工作说明二_凌肖战的博客-CSDN博客
本文主要 了解 uboot顶层 Makefile前期所做的部分工作, 包括如下内容:
设置目标架构、交叉编译器和配置文件,调用 scripts/Kbuild.include,交叉编译工具变量设置。
二. Makefile 前期所做的内容
8. 设置目标架构、交叉编译器和配置文件
编 译 uboot 的 时 候 需 要 设 置 目 标 板 架 构 和 交 叉 编 译 器 ,“ make ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf- ” 就是用于设置 ARCH 和 CROSS_COMPILE 。
顶层 Makefile 中代码如下:
244 # set default to nothing for native builds
245 ifeq ($(HOSTARCH),$(ARCH))
246 CROSS_COMPILE ?=
247 endif
248
249 KCONFIG_CONFIG ?= .config
250 export KCONFIG_CONFIG
第 245 行判断 HOSTARCH 和 ARCH 这两个变量是否相等,主机架构 ( 变量 HOSTARCH) 是
x86_64 ,而我们编译的是 ARM 版本 uboot ,两个不相等。
第 249 行定义变量 KCONFIG_CONFIG , uboot 是可以配置 的,这里设置配置文件为 .config 。
注意:.config 默认是没有的,需要使用命令“make xxx_defconfig” 对 uboot 进行配置,配
置完成以后就会在 uboot 根目录下生成.config。
默认情况下,.config 和 xxx_defconfig 内容是一样的,因为.config 就是从 xxx_defconfig 复制过来的。如果后续自行调整 了 uboot 的一些配置参数,那么这些新的配置参数就添加到了.config 中,而不是 xxx_defconfig。 相当于 xxx_defconfig 只是一些初始配置,而 .config 的内容才是实时有效的配置。
可以看出,每次编译 uboot 的时候都要在 make 命令后面设置ARCH 和 CROSS_COMPILE,使用起来很麻烦,可以直接修改顶层 Makefile,所以,可以在这里加入配置目标架构 ARCH 和 交叉编译器CROSS_COMPILE的值。
上面 代码加入ARCH与CROSS_COMPILE的配置后,如下所示:
245 ifeq ($(HOSTARCH),$(ARCH))
246 CROSS_COMPILE ?=
247 endif249 ARCH = arm
250 CROSS_COMPILE = arm-linux-gnueabihf-252 KCONFIG_CONFIG ?= .config
253 export KCONFIG_CONFIG
9. 调用 scripts/Kbuild.include
主 Makefile 会调用文件 scripts/Kbuild.include 这个文件,顶层 Makefile 中代码如下:
330 # We need some generic definitions (do not try to remake the file).
331 scripts/Kbuild.include: ;
332 include scripts/Kbuild.include
上面的 Makefile 中使用“ include ”包含了文件 scripts/Kbuild.include,而 Kbuild.include 文件里面定义了很多变量。
在 uboot 的编译过程中会用到 scripts/Kbuild.include 中的这些变量,后面用到的时候再分析。
10. 交叉编译工具变量设置
上面我们只是设置了 CROSS_COMPILE 的名字,但是交叉编译器其他的工具还没有设置,
顶层 Makefile 中相关代码如下:
336 AS = $(CROSS_COMPILE)as
337 # Always use GNU ld
338 ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
339 LD = $(CROSS_COMPILE)ld.bfd
340 else
341 LD = $(CROSS_COMPILE)ld
342 endif
343 CC = $(CROSS_COMPILE)gcc
344 CPP = $(CC) -E
345 AR = $(CROSS_COMPILE)ar
346 NM = $(CROSS_COMPILE)nm
347 LDR = $(CROSS_COMPILE)ldr
348 STRIP = $(CROSS_COMPILE)strip
349 OBJCOPY = $(CROSS_COMPILE)objcopy
350 OBJDUMP = $(CROSS_COMPILE)objdump
之前设置了交叉编译器的名字前缀,基于前缀设置后,这里设置了交叉编译工具。
下一篇继续了解 uboot 顶层 Makefile 的前期准备内容。