uboot 顶层 Makefile,就是 uboot源码工程的根目录下的 Makefile文件。
本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习,如下:
uboot顶层Makefile前期所做工作说明三_凌肖战的博客-CSDN博客
本文主要 了解 uboot顶层 Makefile前期所做的部分工作, 包括如下内容:
Makefile文件中导出变量,具体涉及uboot 的顶层 Makefile中 几个变量的文件调动关系。
接下来,在 顶层 Makefile中导出很多变量, 顶层 Makefile 内容如下:
371 export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
372 export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
373 export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC
374 export CPP AR NM LDR STRIP OBJCOPY OBJDUMP
375 export MAKE AWK PERL PYTHON
376 export HOSTCXX HOSTCXXFLAGS DTC CHECK CHECKFLAGS
377
378 export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS
379 export KBUILD_CFLAGS KBUILD_AFLAGS
(1) 打印变量值
这些变量中大部分都已经在前面定义了,我们重点来看一下下面这几个变量,下面这几个变量在 顶层 Makefile 中是找不到的,变量如下:
ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
这 7 个变量在顶层 Makefile 是找不到的,说明这 7 个变量是在其他文件里面定义的,先来
看一下这 7 个变量都是什么内容。,即打印出这些变量的值。在顶层 Makefile 中输入如下内容:
进入 uboot 源码根目录下,打开Linux 终端,输入如下命令打印这些变量:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/alientek_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek$ make mytest
ARCH= arm
CPU= armv7
BOARD= mx6ull_alientek_nand
VENDOR= freescale
SOC= mx6
CPUDIR= arch/arm/cpu/armv7
BOARDDIR= freescale/mx6ull_alientek_nand
(2) 几个个变量的来源
在 uboot 根目录下,有个文件 config.mk,这 7 个变量就是在 config.mk 里面定义的,打开 config.mk 文件的部分内容如下(这里只列出了涉及变量的部分代码):
25 ARCH := $(CONFIG_SYS_ARCH:"%"=%)
26 CPU := $(CONFIG_SYS_CPU:"%"=%)
27 ifdef CONFIG_SPL_BUILD
28 ifdef CONFIG_TEGRA
29 CPU := arm720t
30 endif
31 endif
32 BOARD := $(CONFIG_SYS_BOARD:"%"=%)
33 ifneq ($(CONFIG_SYS_VENDOR),)
34 VENDOR := $(CONFIG_SYS_VENDOR:"%"=%)
35 endif
36 ifneq ($(CONFIG_SYS_SOC),)
37 SOC := $(CONFIG_SYS_SOC:"%"=%)
38 endif
39
40 # Some architecture config.mk files need to know what CPUDIR is set
to,
41 # so calculate CPUDIR before including ARCH/SOC/CPU config.mk files.
42 # Check if arch/$ARCH/cpu/$CPU exists, otherwise assume
arch/$ARCH/cpu contains
43 # CPU-specific code.
44 CPUDIR=arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)
45
46 sinclude $(srctree)/arch/$(ARCH)/config.mk
47 sinclude $(srctree)/$(CPUDIR)/config.mk
48
49 ifdef SOC
50 sinclude $(srctree)/$(CPUDIR)/$(SOC)/config.mk
51 endif
52 ifneq ($(BOARD),)
53 ifdef VENDOR
54 BOARDDIR = $(VENDOR)/$(BOARD)
55 else
56 BOARDDIR = $(BOARD)
57 endif
58 endif
59 ifdef BOARD
60 sinclude $(srctree)/board/$(BOARDDIR)/config.mk # include board
specific rules
61 endif
第 25 行 定 义 变 量 ARCH ,值为 $(CONFIG_SYS_ARCH:"%"=%) , 也 就 是 提 取
CONFIG_SYS_ARCH 里面双引号“”之间的内容。比如 CONFIG_SYS_ARCH=“arm”的话,
ARCH=arm。
下面的几行的功能类似。
接下来需要找到 CONFIG_SYS_ARCH、CONFIG_SYS_CPU、CONFIG_SYS_BOARD、
CONFIG_SYS_VENDOR 和 CONFIG_SYS_SOC 这 5 个变量的值。
这 5 个变量在 uboot 根目录下的 .config 文件中有定义,定义如下:
23 CONFIG_SYS_ARCH="arm"
24 CONFIG_SYS_CPU="armv7"
25 CONFIG_SYS_SOC="mx6"
26 CONFIG_SYS_VENDOR="freescale"
27 CONFIG_SYS_BOARD="mx6ullevk "
28 CONFIG_SYS_CONFIG_NAME="mx6ullevk"
从 上面的 .config 文件 可以看出,这些变量的值正好符合 顶层 Makefile中打印的几个变量值。
那么, 在 config.mk文件中读取的文件有:
arch/arm/config.mk
arch/arm/cpu/armv7/config.mk
arch/arm/cpu/armv7/mx6/config.mk (此文件不存在)
board/ freescale/mx6ullevk/config.mk (此文件不存在)
顶层 Makefile 中涉及一些变量如 ARCH、CPU、 BOARD、 VENDOR 、SOC等等。这些变量涉及文件调用关系:
Makefile 来源于 config.mk 文件, config.mk 文件中涉及变量又来源于 .config 文件。
而 .config 文件是执行了 "make xxx_deconfig" 命令,即配置 uboot 源码以后生成的。
.config 文件来源
默认情况下,.config 和 xxx_defconfig 内容是一样的,因为.config 就是从 xxx_defconfig 复制过来的。如果后续自行调整 了 uboot 的一些配置参数,那么这些新的配置参数就添加到了.config 中,而不是 xxx_defconfig。 相当于 xxx_defconfig 只是一些初始配置,而 .config 的内容才是实时有效的配置。
uboot 顶层 Makefile前期所做的内容大体包括如下:
版本号,MAKEFLAGS 变量 、命令输出/静默输出、设置编译结果输出目录、
代码检查 、模块编译、获取主机架构和系统、(设置目标架构、交叉编译器和配置文件)、
交叉编译工具变量设置、调用 scripts/Kbuild.include、导出其他变量等。