uboot顶层Makefile分析-make的过程分析一

一.  uboot的 make过程

本文来了解一下,uboot的 make 过程。继uboot配置命令执行之后,最终生成 uboot.bin 裸机程序的过程。

之前有了解 uboot的配置过程,即执行 "make xxx_deconfig"命令,主要生成 .config配置文件的过程。不同类型的开发板(即EMMC / Nand-Flash)所用的配置文件不同。

二.  顶层 Makefile -make过程

1. 依赖关系

配置好 uboot 以后就可以直接 make 编译了,因为没有指明目标,所以会使用默认目标。

顶层 Makefile 中的默认目标如下:

128 # That's our default target when none is given on the command line
129 PHONY := _all
130 _all:

(1)  目标_all 依赖规则

目标_all 又依赖于 all,如下所示:

196 PHONY += all
197 ifeq ($(KBUILD_EXTMOD),)
198 _all: all
199 else
200 _all: modules
201 endif

可以看出,这 里 不 编 译 模 块 , 所 以 KBUILD_EXTMOD 为空,_all 的依赖就是 all

(2)  all 依赖规则

在主 Makefile all依赖于 ALL_y 规则如下:
802 all: $(ALL-y)

(3)  ALL_y 依赖规则

而在顶层 Makefile 中, ALL-y 依赖规则 如下:
731 ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map u-boot.cfg 
binary_size_check
732
733 ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
734 ifeq ($(CONFIG_SPL_FSL_PBL),y)
735 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
736 else
737 ifneq ($(CONFIG_SECURE_BOOT), y)
738 # For Secure Boot The Image needs to be signed and Header must also
739 # be included. So The image has to be built explicitly
740 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
741 endif

可以看出,ALL-y 包含 u-boot.srecu-boot.binu-boot.symSystem.mapu-boot.cfg binary_size_check 这几个文件。根据 uboot 的配置情况也可能包含其他的文件,例如,

ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
CONFIG_ONENAND_U_BOOT 就是 uboot 中跟 ONENAND 配置有关的。如果我们使能了
ONENAND ,那么在 .config 配置文件 中就会有如下
 “CONFIG_ONENAND_U_BOOT=y”
当于 CONFIG_ONENAND_U_BOOT 是个变量,这个变量的值为“ y ”,所以,展开后如下:
ALL-y += u-boot-onenand.bin
这个就是 .config 里面的配置参数的含义,这些参数其实都是变量,后面跟着变量值,会在
顶层 Makefile 或者其他 Makefile 中调用这些变量。

(4) uboot.bin 依赖关系

u-boot.bin,最终是我们需要的 uboot 二进制可执行文件, 所作的所 有工作就是为了它。在顶层 Makefile 中找到 u-boot.bin 目标对应的规则,如下所示:
825 ifeq ($(CONFIG_OF_SEPARATE),y)
826 u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
827 $(call if_changed,cat)
828
829 u-boot.bin: u-boot-dtb.bin FORCE
830 $(call if_changed,copy)
831 else
832 u-boot.bin: u-boot-nodtb.bin FORCE
833 $(call if_changed,copy)
834 endif

825 行判断 CONFIG_OF_SEPARATE 是否等于 y ,如果相等,那条件就成立,在 .config
中搜索“ CONFIG_OF_SEPARAT ”,没有找到,说明条件不成立。
832 行就是目标 u-boot.bin 的规则,目标 u-boot.bin 依赖于 u-boot-nodtb.bin。

(5) u-boot-nodtb.bin 依赖关系

目标 u-boot-nodtb.bin 又依赖于 u-boot ,顶层 Makefile u-boot 相关规则如下:
1170 u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE
1171 $(call if_changed,u-boot__)
1172 ifeq ($(CONFIG_KALLSYMS),y)
1173 $(call cmd,smap)
1174 $(call cmd,u-boot__) common/system_map.o
1175 endif

(6)  u-boot 依赖规则

目标 u-boot 依赖于 u-boot_init u-boot-main u-boot.lds u-boot_init u-boot-main 是两个
变量,在顶层 Makefile 中有定义,规则如下:
678 u-boot-init := $(head-y)
679 u-boot-main := $(libs-y)

(7)  $(head-y) 依赖关系与 $(libs-y) 的依赖关系

$(head-y) CPU 架构有关,我们使用的是 ARM 芯片,所以 head-y arch/arm/Makefile
被指定为:
head-y := arch/arm/cpu/$(CPU)/start.o
我们知道 CPU=armv7 ,因此, head-y 展开以后就是:
head-y := arch/arm/cpu/armv7/start.o

$(libs-y) 在顶层 Makefile 中被定义为 uboot 所有子目录下 build-in.o 的集合,(这里只显示了涉及 $(libs-y) 一部分代码), 代码如下:
620 libs-y += lib/
621 libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
622 libs-$(CONFIG_OF_EMBED) += dts/
623 libs-y += fs/
624 libs-y += net/
625 libs-y += disk/
626 libs-y += drivers/
627 libs-y += drivers/dma/
628 libs-y += drivers/gpio/
629 libs-y += drivers/i2c/
......
660 libs-y += cmd/
661 libs-y += common/
可以看出, libs-y 都是 uboot 各子目录的集合,最后:
libs-y := $(patsubst %/, %/built-in.o, $(libs-y))
这里调用了函数 patsubst ,将 libs-y 中的“ / ”替换为 ”/built-in.o”
例如, drivers/dma/ 就变 为了 drivers/dma/built-in.o ,相当于将 libs-y 为所有子目录中 built-in.o 文件的集合。
这个规则就相当于将以 u-boot.lds 为链接脚本,将 arch/arm/cpu/armv7/start.o 和各个子目录
下的 built-in.o 链接在一起生成 u-boot
下一篇文章继续了解 uboot的 make过程。

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

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

相关文章

leetcode 第454题.四数相加II

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 454. 四数相加 II - 力扣&#xff08;LeetCode&#xf…

大型语言模型,第 1 部分:BERT

一、介绍 2017是机器学习中具有历史意义的一年&#xff0c;当变形金刚模型首次出现在现场时。它在许多基准测试上都表现出色&#xff0c;并且适用于数据科学中的许多问题。由于其高效的架构&#xff0c;后来开发了许多其他基于变压器的模型&#xff0c;这些模型更专注于特定任务…

rust编译出错:error: failed to run custom build command for `ring v0.16.20`

安装 Visual Studio&#xff0c;确保选择 —.NET 桌面开发、使用 C 的桌面开发和通用 Windows 平台开发。显示已安装的工具链rustup show。然后通过运行更改和设置工具链rustup default stable-x86_64-pc-windows-msvc。 另外是想用clion进行调试rust 需要你按下面配置即可解…

Mental Poker- Part 2

在part-1中&#xff0c;我们梳理了去中心纸牌游戏所面临的挑战&#xff0c;也介绍了一种改进的Barnett-Smart协议&#xff0c;part-2将深入了解该协议背后涉及的算法。 Discrete-log VTMF VTMFs包含4部分&#xff1a;key generation, mask, remask and unmask&#xff0c;这些…

NFTScan 正式上线 TON NFTScan 浏览器!

2023 年 9 月 12 号&#xff0c;NFTScan 团队正式对外发布了 TON NFTScan 基础设施&#xff0c;将为 TON 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;TON 是继 Bitcoin、Ethereum、BNBChain、Pol…

interview3-微服务与MQ

一、SpringCloud篇 &#xff08;1&#xff09;服务注册 常见的注册中心&#xff1a;eureka、nacos、zookeeper eureka做服务注册中心&#xff1a; 服务注册&#xff1a;服务提供者需要把自己的信息注册到eureka&#xff0c;由eureka来保存这些信息&#xff0c;比如服务名称、…

Unity Animation、Animator 的使用(超详细)

文章目录 1. 添加动画2. Animation2.1 制作界面2.2 制作好的 Animation 动画2.3 添加和使用事件 3. Animator3.1 制作界面3.2 一些参数解释3.3 动画参数 4. Animator中相关类、属性、API4.1 类4.2 属性4.3 API4.4 几个关键方法 5. 动画播放和暂停控制 1. 添加动画 选中待提添加…

Sudowrite:基于人工智能的AI写作文章生成工具

【 产品介绍】 名称 Sudowrite 成立/上线时间 2023年 具体描述 Sudowrite是一个基于GPT-3的人工智能写作工具&#xff0c;可以帮助你快速生成高质量的文本内容&#xff0c; 无论是小说、博客、营销文案还是学术论文。 Sudowrite可以根据你的输入和指…

八、MySql表的复合查询

文章目录 一、基本查询回顾二、多表查询&#xff08;一&#xff09;笛卡尔积的初步过滤&#xff08;二&#xff09;例子1.显示部门号为10的部门名&#xff0c;员工名和工资2.显示各个员工的姓名&#xff0c;工资&#xff0c;及工资级别 三、自连接&#xff08;一&#xff09;定…

pkg 打包 nodejs

一、先全局安装pkg npm i -g pkg 二、下载打包所需的 node-v16.16.0-linux-x64 和 node-v16.16.0-win-x64 下载地址&#xff0c;里面选择你需要的版本 三、放到pkg的缓存目录 windows&#xff1a;C:\Users\whh\.pkg-cache\v3.4&#xff0c;&#xff08;把whh替换为你的电脑…

【计算机网络】传输层协议——TCP(上)

文章目录 TCPTCP协议段格式报头和有效载荷如何分离&#xff1f;4位首部长度 TCP可靠性确认应答机制的提出序号和确认序号为什么序号和确认序号在不同的字段&#xff1f; 16位窗口大小 6个标志位标志位本质具体标志位PSHRSTURG 超时重传机制 文章目录 TCPTCP协议段格式报头和有效…

Linux高性能服务器——定时器

定时器 定时是指在一段时间之后触发某段代码的机制&#xff0c;我们可以在这段代码中依次处理所有到期的定时器。换言之&#xff0c;定时机制是定时器得以被处理的原动力。Linux 提供了三种定时方法&#xff1a; socket 选项 SO_RCVTIMEO 和 SO_SNDTIMEO&#xff1b;SIGALRM …

领域驱动设计:领域模型与代码模型的一致性

文章目录 领域对象的整理从领域模型到微服务的设计领域层的领域对象应用层的领域对象 领域对象与微服务代码对象的映射典型的领域模型非典型领域模型 DDD 强调先构建领域模型然后设计微服务&#xff0c;以保证领域模型和微服务的一体性&#xff0c;因此我们不能脱离领域模型来谈…

树控件、下拉框、文本框常用测试用例

01 控件的测试外观操作 1&#xff09;项目中的所有树是否风格一致 2&#xff09;树结构的默认状态是怎样的。比如默认树是否是展开&#xff0c;是展开几级&#xff1f; 是否有默认的焦点&#xff1f;默认值是什么&#xff1f;展开的节点图标和颜色&#xff1f; 3&#xff09…

Matlab之创建空数组的多种方法汇总

一、matlab空数组是什么&#xff1f; 在MATLAB中&#xff0c;空数组是指没有元素的数组对象。它可以用于占位或者作为容器&#xff0c;等待后续添加元素。 二、创建空数组的多种方法 1、使用空方括号 [] 创建空矩阵 A []; % 创建一个空双精度矩阵 B logical([]); % 创建一…

TypeScript类型系统层级

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 1. 顶层类型&#xff08;Top Type&#xff09; 1.1 any 类型 1.2 unknown 类型 2. 底层类型&#xff08;Bottom …

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析 1 linux原始设备驱动信息1.1 设备树节点信息1.2 linux设备驱动1.3 makefile1.4 Kconfig1.5 对应的defconfig文件 2 修改之后的linux设备驱动2.1 修改之后的设备树节点信息2.2 原始test_fw.c出现的问题以及原因分析…

达观RPA实战-编码与解码

一、应用背景 项目中我们经常需要获取某个服务的JSON数据。如果响应返回的是JSON格式的数据,客户端通过JSON工具可正常解析。但如果碰到值里面有中文的,特别是返回的格式是类似“{"name": "\u5927\u7231\u4e2d\u56fd"}”处理起来会比较麻烦。本文将从编…

【PyCharm Community Edition】:分析map文件统计RAM及ROM的使用

遍历文件 前序文件遍历WalkFiles.py统计方法AnalyzerMap.py主函数main.py延伸阅读前序 当我们的编译器不方便统计代码的RAM及ROM的使用总数量时,我们就需要分析.map文件,手动统计其具体使用量。 文件遍历 当我们需要选择不同文件做相同的逻辑处理时,我们就会用到一种遍历…

【Git】Git 快照 Snapshot

Git 快照 Snapshot 在对 Git 基础的学习过程中&#xff0c;我们了解了 Git 仓库的基本结构&#xff1a; 工作目录暂存区版本库&#xff0c;即 .git 仓库 下面我们就通过一次修改、暂存以及提交的工作流程&#xff0c;来理解快照&#xff08;Snapshot&#xff09;的概念。 现…