U-Boot-2016.09 make 配置过程分析

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码) 本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。 阅读详情

U-Boot-2016.09 make 配置过程分析

本文转载自: u-boot-2016.09 make配置过程分析

概述

本文基于 U-Boot 树莓派 3 代配置过程进行分析,环境如下:
编译环境:Ubuntu 14.04 LTS
编译工具:arm-linux-gnueabi-gcc
代码版本:U-Boot v2016.09
配置文件:rpi_3_32b_defconfig

U-Boot 自 v2014.10 版本开始引入 KBuild 系统,Makefile 的管理和组织跟以前版本的代码有了很大的不同,其 Makefile 更加复杂。整个 Makefile 中,嵌套了很多其它不同用途的 Makefile,各种目标和依赖也很多,make分析很容易陷进去,让人摸不着头脑。

本文涉及的配置命令: make rpi_3_32b_defconfig

实例执行配置命令

U-Boot 的编译跟 kernel 编译一样,分两步执行:

  • 第一步:配置,执行 make xxx_defconfig 进行各项配置,生成 .config 文件
  • 第二步:编译,执行 make 进行编译,生成可执行的二进制文件 u-boot.bin或 u-boot.elf

先从简单的 make defconfig 配置过程着手吧。
命令行输入: make rpi_3_32b_defconfig V=1

编译输出如下:

配置命令参数说明:

  • rpi_3_32b_defconfig 是树莓派 3 代 32 位编译的配置文件
  • V=1 指示编译显示详细的输出。默认 V=0,编译仅显示必要的简略信息

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

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

跟原始的代码相比,执行 make rpi_3_32b_defconfig 后文件夹内容的变化如下:

被后续编译用到的文件是.config。

详细配置流程分析

言归正传,整个配置流程的目的就是为了生成 .config 文件,下面详细分析 .config 文件是如何一步一步生成的。

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

顶层make defconfig规则

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

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

对于目标 rpi_3_32b_defconfig,展开则有:

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

其中$(build)在kbuild.include中定义:

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

i. 依赖scripts_basic

依赖scripts_basic:

# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:
    $(Q)$(MAKE) $(build)=scripts/basic
    $(Q)rm -f .tmp_quiet_recordmcount

可见scripts_basic没有进一步的依赖,展开后规则如下:

scripts_basic:
    $(Q) make -f ./scripts/Makefile.build obj=scripts/basic
    $(Q) rm -f .tmp_quiet_recordmcount

ii. 依赖outputmakefile

依赖outputmakefile:

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

outputmakefile也没有进一步的依赖。
如果执行如下命令:

make rpi_3_32b_defconfig O=out

那么所有生成的目标都将放到out目录,此时会通过outputmakefile导出一个makefile到out目录进行编译。

由于在当前目录下编译,$(KBUILD_SRC)为空,不需要导出makefile文件,outputmakefile为空目标。

iii. 依赖FORCE

依赖FORCE:

PHONY += FORCE
FORCE:

FORCE被定义为一个空目标。
如果一个目标添加FORCE依赖,每次编译都会去先去执行 FORCE(实际上什么都不做),然后运行命令更新目标,这样就能确保目标每次都会被更新。在这里也就保证目标 rpi_3_32b_defconfig 的命令:

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

总是能够被执行。

以上是 rpi_3_32b_defconfig 的所有依赖,分析完依赖后再分析命令。

顶层make defconfig的命令

i. 依赖scripts_basic的命令

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

scripts_basic:
    $(Q) make -f ./scripts/Makefile.build obj=scripts/basic
    $(Q) rm -f .tmp_quiet_recordmcount

然后 Make 命令会转到文件 scripts/Makefile.build 去执行。

第一次调用 scripts/Makefile.build 进行编译

文件 script/Makefile.build 的开头会根据传入的 obj=scripts/basic 参数设置 src=scripts/basic:

prefix := tpl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := spl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := .
endif
endif

然后搜寻 $(srctree)/$(src) 子目录下的 Makefile,并包含进来:

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)

这里展开替换后相当于:

include ./scripts/basic/Makefile

文件 scripts/basic/Makefile 中定义了编译在主机上执行的工具 fixdep:

hostprogs-y := fixdep
always      := $(hostprogs-y)

# fixdep is needed to compile other host programs
$(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep

工具 fixdep 用于更新每一个生成目标的依赖文件 *.cmd

上面定义的这个 $(always) 在 scripts/Makefile.build 里会被添加到 targets 中:

targets += $(extra-y) $(MAKECMDGOALS) $(always)

关于如何编译主机上可执行的程序,会在另外的文章中分析。

简而言之,scripts_basic 规则

scripts_basic:
    $(Q) make -f ./scripts/Makefile.build obj=scripts/basic

的最终结果就是编译 scripts/basic/fixdep.c 生成主机上的可执行文件 fixdep。至于为什么要编译 fixdep 和如何使用 fixdep,会在另外的文章中分析。
ii. 顶层 rpi_3_32b_defconfig 的命令

完成对依赖 scripts_basic 的更新后,接下来就是执行顶层目标的命令完成对 rpi_3_32b_defconfig 的更新,展开后的规则如下:

rpi_3_32b_defconfig: scripts_basic outputmakefile FORCE
    make -f ./scripts/Makefile.build obj= scripts/kconfig rpi_3_32b_defconfig

其中 $(build) 在 kbuild.include 中定义:

###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(srctree)/scripts/Makefile.build obj

这个 make 命令会第二次转到 scripts/Makefile.build 去执行。

第二次调用 scripts/Makefile.build 进行编译

文件 script/Makefile.build 的开头会根据传入的 obj=scripts/kconfig 参数设置 src=scripts/kconfig。然后搜寻 $(srctree)/$(src) 子目录下的 Makefile,由于 src=scripts/kconfig 参数不同于第一次调用的参数(src=scripts/basic),此处包含的 Makefile 也不同于第一次的 Makefile 了:

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)

这里替换展开后相当于:

include ./scripts/kconfig/Makefile

文件 scripts/kconfig/Makefile 中定义了所有匹配 %config 的目标:

PHONY += xconfig gconfig menuconfig config silentoldconfig update-po-config \
    localmodconfig localyesconfig

PHONY += oldnoconfig savedefconfig defconfig

PHONY += kvmconfig

PHONY += tinyconfig

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

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

展开为:

rpi_3_32b_defconfig: scripts/kconfig/conf
    $(Q)scripts/kconfig/conf  --defconfig=arch/../configs/rpi_3_32b_defconfig Kconfig

此处目标 rpi_3_32b_defconfig 依赖于 scripts/kconfig/conf,接下来检查并生成依赖。

hostprogs-y := conf nconf mconf kxgettext qconf gconf

hostprogs-y 指出 conf 被定义为主机上执行的程序,其依赖于另外两个文件:

conf-objs   := conf.o  zconf.tab.o

通过编译 conf.c 和 zconf.tab.c 生成 conf-objs,并链接为 scripts/kconfig/conf

生成依赖后就是执行目标的命令了:

$(Q)scripts/kconfig/conf  --defconfig=arch/../configs/rpi_3_32b_defconfig Kconfig

工具 scripts/kconfig/conf 的操作会在单独的文章中分析,此处只做简要的说明:

conf 工具从根目录下开始树状读取默认的 Kconfig 文件,分析其配置并保存在内存中。分析完默认的 Kconfig 后再读取指定文件(即 arch/../configs/rpi_3_32b_defconfig)更新得到最终的符号表,并输出到 .config 文件中。

至此完成了 make rpi_3_32b_defconfig 执行配置涉及的所有依赖和命令的分析。

make defconfig 配置流程简图

整个配置流程阐述得比较啰嗦,可以用一个简单的依赖图表示,如下:

(可以将图片拖到浏览器的其他窗口看大图)

【Unity3D开发小游戏】《打地鼠游戏》Unity开发教程 文章目录一、前言二、源码三、正文版本1、相机设置2、洞口设置3、洞口脚本4、鼹鼠5、鼹鼠动画6、鼹鼠碰撞器7、鼹鼠脚本8、击中鼹鼠的效果9、实现击中效果10、增加更多的洞口 一、前言 让我们使用Unity3D开发一个打地鼠游戏吧。 打地鼠游戏是一个非常有趣的街机游戏,是在1976年左右发明的。 游戏的主要玩法就是打击从洞里出来的鼹鼠,玩家击中鼹鼠的速度越快,得分就越高 我们将讲解制作游戏的所需的每... 阅读详情

相关推荐

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 455

(Makefile学习笔记):函数的使用 [转]

参考原文:《跟我一起写 Makefile 》 作者:陈皓 目录 函数的使用 函数的调用语法 字符串处理函数 文件名操作函数 foreach 函数 if 函数 call 函数 origin 函数 shell 函数 控制 make 的函数 函数的使用 在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make 所支持的函数也不算很多,不过已经足够我们的操作了。 函数调用后,函数的返回值可以当做变量来使用。 函数的调用语法 .

baidu_41388533的博客 252

智能车图像处理去畸变+逆透视教程

图像处理,去畸变与逆透视整合

wu58430的博客 1万+

make xxx_defconfig

配置介绍 1.1 常用命令     当前 uboot 的配置已经完全变成Linux 内核的配置形式了,完全可以按照Linux 内核的分析方是区分析 uboot。   uboot 和Linux的代码配置项由 Kconfig 来完成的,关于 Kconfig 语法,可参见:linux/Documentation/kbuild/kconfig-language.txt   在编译时,先进行配置,...

boyemachao的专栏 1万+

保姆级教程:用CST 2023一步步复现一个1-8GHz Vivaldi天线(含参数优化与结果分析)

本文提供了一份详细的CST 2023教程,指导读者如何从零开始设计并优化1-8GHz Vivaldi天线。内容涵盖工程设置、参数化建模、仿真加速技巧以及性能优化策略,特别适合需要实现宽带天线设计的工程师和研究人员。通过实战案例,帮助用户掌握Vivaldi天线的核心设计要点和CST高级功能应用。

weixin_30800987的博客 618

PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标

前言 原理简介 输入参数准备 1 objectPoints特征点世界坐标 2 imagePoints特征点在摄像头下的像素点坐标 3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下的坐标 2求相机在世界坐标中的坐标 3效果求解相机在世界坐标系下的坐标点 4求解代码1.前言  很多时候,当我们利用单目相机获取图像时,往往只能获取图像中

cocoaqin的博客 5万+

Uboot的Make xxx_defconfig大致过程与作用

(注:初次学习uboot,本文只是根据网上资料及自己的实践大致梳理了make xxx_defconfig的过程,没有逐句解析make xxx_defconfig的过程) 首先,先上结论:

ycq4853的博客 2920

实测有效!易灵思FPGA工程如何正确配置Efinity+Modelsim仿真环境

本文详细介绍了易灵思FPGA工程中如何高效配置Efinity与Modelsim联合仿真环境,包括软件版本匹配、系统环境变量设置、工程文件结构优化及仿真脚本深度优化等实战经验。通过实测数据验证,该方案可显著提升仿真效率,适用于不同规模的设计验证,帮助工程师快速搭建稳定高效的联仿环境。

m2n3b4v5c6的博客 405

第十一章 U-boot 顶层 Makefile 详解 (make xxx_defconfig 过程)

第 502 行将 MAKECMDGOALS 中不符合“config”和“%config”的部分过滤掉,如果剩下的部分不为空条件就成立,很明显此处条件成立,变量 config-targets=1。第 501 行判断 KBUILD_EXTMOD 是否为空,如果 KBUILD_EXTMOD 为空的话条件成立,经过前面的分析,我们知道 KBUILD_EXTMOD 为空,所以条件成立。第 527 行如果变量 config-targets 为 1 的话条件成立,很明显,条件成立,执行这个分支。不为空的话条件就成立。

m0_70850054的博客 1229

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 699

详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2)

DaVinci Configurator导入ARXML配置。

不脱发的程序猿 3331

Linux | uboot的make xxx_defconfig与 make menuconfig

在uboot里,编译文件时,先要配置.config文件,然后Makefile在编译时通过读取.config文件的配置来选择要编译的文件。.config文件的生成可通过make menuconfig 或make xxx_defconfig 方式生成,这两种方式看上去虽然不同,但是两者的原理是一样的,都是通过Kconfig文件的配置来的。 一般来说,开发板厂商会提供对应开发板的xxx_defconfig文件,编译时我们需要做的是: 1.make xxx_defconfig 当你使用某一款开发板时,可以直接

一只大鱼_的博客 2272

大模型实战—通义千问大模型微调

这个参数仅针对 llama 类型的模型结构,默认勾选的是 q_proj 和 v_proj,具体的名词不容易理解,我就不多说了,可以简单的认为是对模型的理解能力进行优化,一般这两个就够了。当这个值较高时,适应新任务的能力会增强,但是对基础模型的影响会比较大,有过拟合的风险,尤其是在数据量有限的情况下。为了方便测试,我在云环境也创建了一个镜像,相关的环境都配置好了,可以直接使用几个国内开源的大语言模型,比如清华智谱的ChatGLM3-6B、零一万物的Yi-34B,还有最近阿里云开源的Qwen1.5-32B。

7万+

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

本文基于u-boot v2016.09版本代码对树莓派3代配置命令 make rpi_3_32b_defconfig 的执行过程进行分析。

洛奇看世界 7411

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【u-boot】u-boot-2016.09 make配置过程分析

1  概述 本文基于u-boot树莓派3代配置过程进行分析,环境如下:  编译环境:Ubuntu 14.04 LTS  编译工具:arm-Linux-gnueabi-gcc  代码版本:u-boot v2016.09  配置文件:rpi_3_32b_defconfig u-boot的编译跟kernel编译一样,分两步执行:  - 第一步:配置,执行make xxx_def

coco_me的博客 1406

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

u-boot-2016.09 make编译过程分析(二)

u-boot-2016.09 make编译过程分析(二) 综述 u-boot自v2014.10版本开始引入KBuild系统,同更改前的编译系统相比,由于Kbuild系统的原因,其Makefile变得更加复杂。 u-boot的编译跟kernel编译一样,分两步执行: 第一步:配置,执行make xxx_defconfig进行各项配置,生成.config文件第二部:编译,执行make进行编

每天进步一点点,月薪三千不是梦 1295

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

u-boot-2016.09 make编译过程分析(一)

上一篇文章《》详尽分析了u-boot执行配置命令make xxx_defconfig的整个流程,本文着眼于编译流程,即配置完成后执行make命令生成二进制文件的过程。由于涉及的依赖和命令很多,也将make编译过程分析分为两部分,一、目标依赖和 二、命令执行。

洛奇看世界 8308

U-boot编译make配置过程

u-boot从v2014.10版本后引入kBuild系统,使得其Makefile变的更加复杂;整个Makefile中,嵌套其他不同用途的Makefile,本文将进行简单的分析.

yiyu20180729的博客 410

【u-boot-2018.05】make配置过程分析

https://blog.csdn.net/q_z_r_s/article/details/80718518 从u-boot-2014.10版本引入Kbuild系统之后,Makefile的管理和组织跟以前版本的代码有了很大的不同,这使Makefile变得更加复杂。整个Makefile中,include很多其它不同用途的Makefile,各种目标和依赖也很多,因此要想搞清楚make...

weixin_30755709的博客 227

u-boot-2016.09 make工具之conf

u-boot 中采用KBuild进行编译,其中会使用到scripts/kconfig/conf工具,本文详细分析u-boot对conf的调用,本详细分析conf源码,探讨kconfig的配置过程。

洛奇看世界 3773

【u-boot】u-boot-2016.09 make编译过程分析(二)

综述 u-boot自v2014.10版本开始引入KBuild系统,同更改前的编译系统相比,由于Kbuild系统的原因,其Makefile变得更加复杂。 u-boot的编译跟kernel编译一样,分两步执行: 第一步:配置,执行make xxx_defconfig进行各项配置,生成.config文件第二步:编译,执行make进行编译,生成可执行的二进制文件u-boot.bin或u-

coco_me的博客 2682

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

概述 本文基于u-boot树莓派3代配置过程进行分析,环境如下: 编译环境:Ubuntu 14.04 LTS 编译工具:arm-Linux-gnueabi-gcc 代码版本:u-boot v2016.09 配置文件:rpi_3_32b_defconfig u-boot自v2014.10版本开始引入KBuild系统,Makefile的管理和组织跟以前版本的代码有了很大的不同,其Makefi...

u011605951的博客 1022

底软驱动 | U-boot编译与配置过程

u-boot从v2014.10版本后引入kBuild系统,使得其Makefile变的更加复杂;整个Makefile中,嵌套其他不同用途的Makefile,本文将进行简单的分析.

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1006

【u-boot】u-boot-2016.09 make编译过程分析(一)

综述 u-boot自v2014.10版本开始引入KBuild系统,Makefile的管理和组织跟以前版本的代码有了很大的不同,其Makefile更加复杂。整个Makefile中,嵌套了很多其它不同用途的Makefile,各种目标和依赖也很多,make分析很容易陷进去,让人摸不着头脑。 u-boot的编译跟kernel编译一样,分两步执行:  - 第一步:配置,执行make xxx_d

coco_me的博客 2729
上一篇: iptables详解(1): iptables概念
下一篇: Ubuntu 简单配置
wax5798
博客等级 码龄9年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值