u-boot-2017.09 make配置过程分析

news2025/2/25 18:17:02

概述

本文基于firefly RK3588Q SDK uboot配置过程进行分析,环境如下:

编译环境:Ubuntu 20.04 LTS

编译工具:aarch64-linux-gnu-

代码版本:u-boot v2017.09

配置文件:rk3588_defconfig

Uboot配置单板

本文涉及的配置命令

make rk3588_defconfig

配置单板过程分析

想看具体配置详细日志的加参数

make rk3588_defconfig V=1

配置输出如下:

u-boot$ make rk3588_defconfig V=1
make -f ./scripts/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig rk3588_defconfig
scripts/kconfig/conf  --defconfig=arch/../configs/rk3588_defconfig Kconfig
#
# configuration written to .config
#

配置命令参数说明:

  • rk3588_defconfig 是RK3588单板配置文件
  • V=1 指示编译显示详细的输出,默认V=0,编译经显示必要的简略信息

从输出的log看,make rk3588_defconfig的执行主要分为3个部分,见图上标示:

  • 1.执行make -f ./scripts/Makefile.build obj=scripts/basic,编译生成scripts/basic/fixdep工具
  • 2.执行make -f ./scripts/Makefile.build obj=scripts/kconfig rk3588_defconfig, 编译生成scripts/kconfig/conf 工具
  • 3.执行scripts/kconfig/conf --defconfig=arch/…/confs/rk3588_defconfig kconfig生成最终的.config配置文件

编译时用到的文件正是.config,下面分析下.config文件如何一步一步生成的。
Makefile文件是如何一步一步生成的。

复习Makefile

Makefile规则格式

target : prerequisites
  command
  • target : 通常是需要生成的目标文件名。
    make 所需执行的命令名称。可以包含多个目标,使用空格对多个目标名进行分离。

  • prerequisities : 当前目标 所依赖 的 其他目标或文件。
    可以包含多个依赖, 使用空格对多个依赖进行分离。

  • command : 完成目标所需要执行的命令。
    每一个命令必须以 [ Tab ] 字符开始, [ Tab ] 字符告诉 make 此行是一个命令行。

Makefile的核心是依赖和命令。对于每个目标,首先会检查依赖,如果依赖存在,则执行命令更新目标;如果依赖不存在,则会以依赖为目标,先生成依赖,待依赖生成后,再执行命令生成目标。

顶层Makefile make rk3588_defconfig规则

执行make xxx_defconfig命令时,u-boot根目录下的Makefile中有唯一的规则匹配目标:

478 %config: scripts_basic outputmakefile FORCE
479         $(Q)$(MAKE) $(build)=scripts/kconfig $@

目标:%config
依赖:scripts_basic outputmakefile FORCE

对于目标,rk3588_defconfig,展开则有:

rk3588_defconfig: scripts_basic outputmakefile FORCE
            $(Q)$(MAKE) $(build)=scripts/kconfig rk3588_defconfig

其中$(build)在./scripts/Kbuild.include中定义:

build := -f $(srctree)/scripts/Makefile.build obj

分析依赖

依赖的scripts_basic

396 # Basic helpers built in scripts/
397 PHONY += scripts_basic
398 scripts_basic:
399         $(Q)$(MAKE) $(build)=scripts/basic
400         $(Q)rm -f .tmp_quiet_recordmcoun

scripts_basic没有进一步的依赖

依赖的outputmakefile

405 PHONY += outputmakefile
406 # outputmakefile generates a Makefile in the output directory, if using a
407 # separate output directory. This allows convenient use of make in the
408 # output directory.
409 outputmakefile:
410 ifneq ($(KBUILD_SRC),)
411         $(Q)ln -fsn $(srctree) source
412         $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
413         ¦   $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
414 endif

outputmakefile没有进一步的依赖

依赖的FORCE

1731 PHONY += FORCE
1732 FORCE:
1733 

FORCE被定义为一个空目标。如果一个目标添加FORCE依赖,每次编译都会先去执行FORCE,然后运行命令更新目标,这样就能确保目标每次都会被更新。在这里也就保证目标rk3588_defconfig的命令,总能被执行

$(Q)$(MAKE) $(build)=scripts/kconfig rk3588_defconfig

分析完依赖在分析命令。

分析命令

依赖scripts_basic的命令

目标rk3588_defconfig的三个依赖scripts_basic,outputmakefile和FORCE中,只有scripts_basic需要执行命令,如下:

398 scripts_basic:
399         $(Q)make -f ./scripts/Makefile.build obj=scripts/basic
400         $(Q)rm -f .tmp_quiet_recordmcoun

make命令会转到文件scripts/Makefile.build去执行。最终结果就是编译scripts/basic/fixdep.c生成主机上的可执行文件fixdep。工具fixdep用于更新每一个生成目标的依赖文件*.cmd

rk3588_defconfig的命令

完成对依赖scripts_basic的更新后,接下来就是执行rk3588_defconfig的更新, 展开后的规则如下:

rk3588_defconfig: scripts_basic outputmakefile FORCE
            make -f ./scripts/Makefile.build obj=scripts/basic rk3588_defconfig

也就是说make命令会第二次转到scripts/Makefile.build去执行。

对于这里传入的rk3588_defconfig,匹配的目标是:

%_defconfig: $(obj)/conf
    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

其中%_defconfig是rk3588_defconfig, obj是scripts/basic, 所以展开是

rk3588_defconfig: scripts/basic/conf
    scripts/kconfig/conf  --defconfig=arch/../configs/rk3588_defconfig Kconfig

make rk3588_defconfig配置流程简图


作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持,微信公众号【Linux随笔录】

本文由mdnice多平台发布

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

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

相关文章

【数组、字符串】算法例题

每个题的【方法1】是自己的思路&#xff0c;【其他方法】是力扣上更优的解题思路 目录 一、数组、字符串 1. 合并两个有序数组 ① 2. 移除元素 ① 3. 删除有序数组中的重复项 ① 4. 删除有序数组中的重复项 II ② 5. 多数元素 ① 6. 轮转数组 ② 7. 买卖股票的最佳时机…

瑞_Redis_短信登录

文章目录 项目介绍1 短信登录1.1 项目准备1.1.1 导入SQL1.1.2 导入后端项目1.1.3 导入前端项目 1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2…

2024单商户微信小程序商城源码

2024单商户微信小程序商城源码 1.框架采用全新thinkphp6事件开发设计layuiuniapp进行设计&#xff0c;代码完全重构&#xff0c;支持百万级! 2.前端以layui uniapp模块化开发; 3.数据导出采用phpExce1,使数据更加直观&#xff0c;更方便于管理统计; 4.插件钩子机制&#xff0…

突发!半导体巨头关闭上海公司,重组中国区业务!

据韩媒消息&#xff0c;韩国最大的半导体巨头之一 SK 海力士正在重组中国区业务&#xff0c;计划关闭其在上海的子公司&#xff0c;该子公司成立于 2006 年。 根据发布的 2023 年审计报告&#xff0c;去年四季度以来该公司一直在清算其上海子公司&#xff0c;并计划将业务重心…

基于java的宠物信息交流平台设计(含源文件)

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的“多鱼”旧物交易平台。当前的信息管理存在工作…

【第十二章】改进神经网络学习方式-过拟合与正则化

前言 诺贝尔奖获得者、物理学家恩里科费米曾被问及对一位同事提出的数学模型作为重要未解物理问题的解决方案的看法。该模型与实验结果非常吻合&#xff0c;但费米持怀疑态度。他询问该模型中有多少自由参数可供设置。答案是“四个”。费米回答道:“我记得我的朋友约翰尼冯诺伊…

基于Spring Boot+Vue的智慧图书管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 一、项目简介 如今社会上各行各业&…

力扣---验证二叉搜索树---前根/中根/后根遍历

题目解析参考&#xff1a;验证二叉搜索树_哔哩哔哩_bilibili 一开始做呢&#xff0c;就跟这位老兄一样&#xff1a; 因为没有考虑到5和3的比较 接下来走入整体&#xff1a; 先根遍历解法&#xff1a; 首先 每个点其实都有范围&#xff0c;比如根节点的范围在(-INF,INF)&…

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

线性代数基础概念和在AI中的应用

基本概念 线性代数是数学的一个分支&#xff0c;专注于向量、向量空间&#xff08;也称为线性空间&#xff09;、线性变换和矩阵的研究。这些概念在数据科学、人工智能、工程学和物理学等多个领域都有广泛应用。以下是这些基本概念的详细解释和它们在数据处理和AI中的应用。 …

Java语言: JVM

1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间&#xff08;Metaspace&#xff09; 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…

Qt学习--多态(虚函数)

这次来分享多态的概念&#xff0c;这是比较重要的知识点 面向对象的三大特征&#xff1a;封装、继承、多态 首先&#xff1a;来点官方术语&#xff1a; 多态&#xff0c;通俗来讲就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出…

深度解析 Android 系统属性

目录 Android系统属性 1.属性在哪里&#xff1f; 2.属性长什么样&#xff1f; 3.如何读写属性&#xff1a; 4.属性的作用 属性文件生成过程 如何添加系统属性 1.添加系统属性到 /system/build.prop 2.添加系统属性到 /vendor/build.prop 3.添加系统属性到 /product/b…

【C++】string 类---字符判断与大小写转换(超详细解析!)

目录 一、string 类的介绍 二、字符大小写转换与判断常用函数 &#x1f4a6; 字符大小写判断 ① isalpha() ② isalnum() ③ isdigit() ④ islower() ⑤ isupper() &#x1f4a6; 字符大小写转换 ① tolower() ✨方法一&#xff1a; ✨方法二&#xff1a; ② toupper() ✨方…

为什么说金融/财务人需要学Python??

Python 是财务人和金融人的多功能工具箱&#xff01;它有非常多的细分应用&#xff0c;接下来我将给你详细介绍为什么财务、金融方向需要学 Python 以及有哪些方向的细分应用&#xff01; 一、为什么金融/财务人需要 Python&#xff1f; 想在行业中崭露头角&#xff1f;那你可…

106 基于消息队列来做 mysql 大数据表数据的遍历处理

前言 最近有这样的一个需求, 我们存在一张 很大的 mysql 数据表, 数据量大概是在 六百万左右 然后 需要获取所有的记录, 将数据传输到 es 中 然后 当时 我就写了一个脚本来读取 这张大表, 然后 分页获取数据, 然后 按页进行数据处理 转换到 es 但是存在的问题是, 前面 还…

CTF题型 SSTI(2) Flask-SSTI典型题巩固

CTF题型 SSTI(2) Flask-SSTI典型题巩固 文章目录 CTF题型 SSTI(2) Flask-SSTI典型题巩固前记1.klf__sstiSSTI_Fuzz字典&#xff08;网上收集自己补充&#xff09; 2.klf_2数字问题如何解决了&#xff1f;|count |length都被禁&#xff1f; 3.klf_3 前记 从基础到自己构造paylo…

java String的深入了解

1、String 概述 &#xff08;1&#xff09;String 类在 java.lang 包下&#xff0c;所以使用的时候不需要导包。 &#xff08;2&#xff09;String 类代表字符串&#xff0c;Java程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都被实现为此类的实例。也就是说&a…

【漏洞复现】用友U8Cloud base64 SQL注入漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud 存在SQL注入漏洞&#xff0c;未授权的攻击者可通过此漏洞获取数据库权限&#xff0c;从而盗取用户数据&a…

Leetcode 48. 旋转图像

心路历程&#xff1a; 第一次需要这种类型的题。 一开始从双指针、递归、栈队的角度去思考问题&#xff0c;没有发现明显的特征。 后来想到这个算是二维数组问题&#xff0c;应该也是双指针的一种。 总感觉有什么妙招可以一下子解决&#xff0c;但是没想出来就去找的网上的答案…