uboot顶层Makefile前期所做工作说明四

 一.  uboot顶层 Makefile文件

uboot 顶层 Makefile,就是 uboot源码工程的根目录下的  Makefile文件。

本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习,如下:

uboot顶层Makefile前期所做工作说明三_凌肖战的博客-CSDN博客
 

本文主要 了解 uboot顶层 Makefile前期所做的部分工作, 包括如下内容:

Makefile文件中导出变量,具体涉及uboot 的顶层 Makefile中 几个变量的文件调动关系。

二.  Makefile 前期所做的内容

 11.  导出其他变量

接下来,在 顶层 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顶层Makefile前期所做工作说明四_第1张图片

进入 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。

下面的几行的功能类似。

46 sinclude include 的功能类似,在 Makefile 中都是读取指定文件内容,这里读取
文件 $(srctree)/arch/$(ARCH)/config.mk 的内容。 sinclude 读取的文件如果不存在的话不会报错。

接下来需要找到 CONFIG_SYS_ARCH、CONFIG_SYS_CPU、CONFIG_SYS_BOARD、

CONFIG_SYS_VENDORCONFIG_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 (此文件不存在)

三. 总结

1.   顶层 Makefile涉及几个变量的文件调用关系

顶层 Makefile 中涉及一些变量如 ARCH、CPU、 BOARD、 VENDOR 、SOC等等。这些变量涉及文件调用关系:

Makefile 来源于 config.mk 文件, config.mk 文件中涉及变量又来源于 .config 文件。

.config 文件是执行了 "make xxx_deconfig" 命令,即配置 uboot 源码以后生成的。

.config 文件来源

默认情况下,.configxxx_defconfig 内容是一样的,因为.config 就是从 xxx_defconfig 复制过来的。如果后续自行调整 了 uboot 的一些配置参数,那么这些新的配置参数就添加到了.config 中,而不是 xxx_defconfig。 相当于 xxx_defconfig 只是一些初始配置,而 .config 的内容才是实时有效的配置。
 

2.   Makefile前期所做的工作

 

uboot 顶层 Makefile前期所做的内容大体包括如下:

版本号,MAKEFLAGS 变量 、命令输出/静默输出、设置编译结果输出目录、

代码检查 、模块编译、获取主机架构和系统、(设置目标架构、交叉编译器和配置文件)、

交叉编译工具变量设置、调用 scripts/Kbuild.include、导出其他变量等。

你可能感兴趣的:(嵌入式C开发,linux)