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 源码根目录下,打开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、导出其他变量等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127908.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署

DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署 DAMO-YOLO 是阿里达摩院智能计算实验室开发的一种兼顾速度与精度的目标检测算法,在高精度的同时,保持了很高的推理速度。 DAMO-YOLO 是在 YOLO 框架基础上引入了一系列新技术&#xff0…

Java的环境配置

目录 window系统安装java下载JDK配置环境变量JAVA_HOME 设置PATH设置CLASSPATH 设置测试JDK是否安装成功 Linux,UNIX,Solaris,FreeBSD环境变量设置流行JAVA开发工具使用 Eclipse 运行第一个 Java 程序 window系统安装java 下载JDK 首先我们…

爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)

目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具:Chrome浏览器chromedriverselenium win用户:chromedriver.exe放在python.exe旁边 MacO…

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...尝试在Unity中汉化一个插件 效果: 思路: 如何在Unity中把一个自己喜欢的插件…

新装Ubuntu系统的一些配置

背景: 最近办公要在Ubuntu系统上进行,于是自己安装了一个Ubuntu22.04系统,记录下新系统做的一些基本配置。 环境 : 系统:Ubuntu-22.04内核:6.2.0-26-generic架构:x86_64 一、 配置root密码 新…

Centos7 完全断网离线环境下安装MySQL 8.0.33 图文教程

Centos7 完全断网离线环境安装MySQL 8.0.33 图文教程 1.1前言1.2 下载离线安装包1.3 将下载好的离线安装包上传到Centos 7 服务器1.3.1 方式一:联网环境下可利用rz命令进行文件上传1.3.2 方式二:断网环境下使用 XFtp 等软件工具进行上传1.4 解压安装包1.5 执行安装脚本1.6 重…

Linux TCP和UDP协议

目录 TCP协议TCP协议的面向连接1.三次握手2.四次挥手 TCP协议的可靠性1.TCP状态转移——TIME_WAIT 状态TIME_WAIT 状态存在的意义:(1)可靠的终止TCP连接。(2)让迟来的TCP报文有足够的时间被识别并被丢弃。 2.应答确认、…

信息安全技术概论-李剑-持续更新

图片和细节来源于 用户 xiejava1018 一.概述 随着计算机网络技术的发展,与时代的变化,计算机病毒也经历了从早期的破坏为主到勒索钱财敲诈经济为主,破坏方式也多种多样,由早期的破坏网络到破坏硬件设备等等 ,这也…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器…

Python之线程Thread(一)

一、什么是线程 线程(Thread)特点: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;…

elasticsearch的索引库操作

索引库就类似数据库表,mapping映射就类似表的结构。我们要向es中存储数据,必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型,常见的…

【C++漂流记】一文搞懂类与对象中的对象特征

在C中,类与对象是面向对象编程的基本概念。类是一种抽象的数据类型,用于描述对象的属性和行为。而对象则是类的实例,具体化了类的属性和行为。本文将介绍C中类与对象的对象特征,并重点讨论了对象的引用。 文章目录 一、构造函数和…

Python入门教程35:使用email模块发送HTML和图片邮件

smtplib模块实现邮件的发送功能,模拟一个stmp客户端,通过与smtp服务器交互来实现邮件发送的功能,可以理解成Foxmail的发邮件功能,在使用之前我们需要准备smtp服务器主机地址、邮箱账号以及密码信息。 #我的Python教程 #官方微信公…

什么是 DNS 隧道以及如何检测和防止攻击

什么是 DNS 隧道? DNS 隧道是一种DNS 攻击技术,涉及在 DNS 查询和响应中对其他协议或程序的信息进行编码。DNS 隧道通常具有可以锁定目标 DNS 服务器的数据有效负载,允许攻击者管理应用程序和远程服务器。 DNS 隧道往往依赖于受感染系统的…

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集:{iris}) print(f查看数据集的特征:{iris.feature_names}) print(f查看数据集的标签:{iris.target_names}) print(f查看数据集的描述…

linux 安装Docker

# 1、yum 包更新到最新 yum update # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo h…

Lua01——概述

Lua是啥? 官网 https://www.lua.org Lua这个名字在葡萄牙语中的意思是“美丽的月亮”,诞生于巴西的大学实验室。 这是一个小巧、高效且能够很好的和C语言一起工作的编程语言。 在脚本语言领域中,Lua因为有资格作为游戏开发的备选方案&…

51单片机项目(10)——基于51单片机的电压计

本次设计的电压计,使用ADC0832芯片,测到电压后,将电压信息发送到串口进行显示。仿真功能正常,能够运行。(工程文件和代码放在最后) 电路图如下: 运行过程如下: ADC0832介绍&#xff…

「网页开发|前端开发|Vue」07 前后端分离:如何在Vue中请求外部数据

本文主要介绍两种在Vue中访问外部API获取数据的方式,通过让Vue通过项目外部的接口来获取数据,而不是直接由项目本身进行数据库交互,可以实现前端代码和后端代码的分离,让两个部分的代码编写更独立高效。 文章目录 本系列前文传送…

Flink CDC 菜鸟教程 -环境篇

本教程将介绍如何使用 Flink CDC 来实现这个需求, 在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 系统的整体架构如下图所示: 环境篇 1、 准备一台Linux 2、准备教程所需要的组件 下载 flink-1.13.2 并将其解压至目录 flink-1.13.2 …