08_Uboot顶层Makefile分析_make过程

这篇具有很好参考价值的文章主要介绍了08_Uboot顶层Makefile分析_make过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

make 过程


make 过程

配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下:

08_Uboot顶层Makefile分析_make过程

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

08_Uboot顶层Makefile分析_make过程

08_Uboot顶层Makefile分析_make过程

如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_all 的依赖就是all。在主 Makefileall目标规则如下:

08_Uboot顶层Makefile分析_make过程

802行可以看出,all目标依赖$(ALL-y),而在顶层Makefile中,ALL-y如下:

08_Uboot顶层Makefile分析_make过程

08_Uboot顶层Makefile分析_make过程

 从示例代码代码可以看出,ALL-y 包含 u-boot.srecu-boot.binu-boot.sym、System.map、u-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 中调用这些变量。

ALL-y 里面有个u-boot.bin,这个就是我们最终需要的uboot二进制可执行文件,所作的所有工作就是为了它。在顶层Makefile中找到u-boot.bin目标对应的规则,如下所示:

08_Uboot顶层Makefile分析_make过程

825行判断CONFIG_OF_SEPARATE是否等于y如果相等,那条件就成立,在.config中搜索“CONFIG_OF_SEPARAT”,没有找到,说明条件不成立。

832行就是目标u-boot.bin的规则,目标u-boot.bin依赖于u-boot-nodtb.bin,命令为$(call if_changed,copy) ,这里调用了 if_changed ,if_changed是一个函数, 这个函数在scripts/Kbuild.include中有定义,而顶层Makefile中会包含scripts/Kbuild.include 文件,这个前面已经说过了。if_changed 在 Kbuild.include 中的定义如下: 

08_Uboot顶层Makefile分析_make过程

08_Uboot顶层Makefile分析_make过程

 第227行为if_changed的描述,根据描述,在一些先决条件比目标新的时候,或者命令行 有改变的时候,if_changed就会执行一些命令。

257行就是函数if_changed,if_changed函数引用的变量比较多,也比较绕,我们只需要知道它可以从u-boot-nodtb.bin生成u-boot.bin就行了。

既然u-boot.bin依赖于u-boot-nodtb.bin,那么肯定要先生成u-boot-nodtb.bin文件,顶层Makefile中相关代码如下:

08_Uboot顶层Makefile分析_make过程

 目标u-boot-nodtb.bin又依赖于u-boot,顶层Makefileu-boot相关规则如下:

08_Uboot顶层Makefile分析_make过程

 目标u-boot依赖于u-boot_initu-boot-mainu-boot.ldsu-boot_initu-boot-main是两个变量,在顶层Makefile中有定义,值如下:

08_Uboot顶层Makefile分析_make过程

$(head-y)CPU架构有关,我们使用的是ARM芯片,所以head-yarch/arm/Makefile中被指定为:

head-y := arch/arm/cpu/$(CPU)/start.o

根据分析,我们知道CPU=armv7,因此head-y展开以后就是:

 head-y := arch/arm/cpu/armv7/start.o

因此: 

u-boot-init= arch/arm/cpu/armv7/start.o 

$(libs-y)在顶层Makefile中被定义为uboot所有子目录下build-in.o的集合,代码如下:

08_Uboot顶层Makefile分析_make过程

08_Uboot顶层Makefile分析_make过程

从上面的代码可以看出,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-main就等于所有子目录中built-in.o的集合。

这个规则就相当于将以u-boot.lds为链接脚本,将arch/arm/cpu/armv7/start.o和各个子目录

下的built-in.o链接在一起生成u-boot

u-boot.lds的规则如下:

08_Uboot顶层Makefile分析_make过程

接下来的重点就是各子目录下的built-in.o是怎么生成的,以 drivers/gpio/built-in.o为例,在drivers/gpio/目录下会有个名为.built-in.o.cmd 的文件,此文件内容如下:

08_Uboot顶层Makefile分析_make过程

 从命令“cmd_drivers/gpio/built-in.o”可以看出,drivers/gpio/built-in.o这个文件是使用ld命令由文件 drivers/gpio/mxc_gpio.o生成而来的,mxc_gpio.omxc_gpio.c编译生成的.o文件,这个是NXPI.MX系列的GPIO驱动文件。这里用到了ld的“-r”参数,参数含义如下:

-r –relocateable: 产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld’的输入,这经常被叫做“部分链接”,当我们需要将几个小的.o文件链接成为一个.o文件的时候,需要使用此选项。最终将各个子目录中的built-in.o文件链接在一起就形成了u-boot,使用如下命令编译uboot就可以看到链接的过程:

08_Uboot顶层Makefile分析_make过程

 编译的时候会有如图所示内容输出:

08_Uboot顶层Makefile分析_make过程

 将其整理一下,内容如下:

08_Uboot顶层Makefile分析_make过程

08_Uboot顶层Makefile分析_make过程

可以看出最终是用arm-linux-gnueabihf-ld.bfd命令将arch/arm/cpu/armv7/start.o和其他众多的 built_in.o链接在一起,形成 u-boot

目标all除了u-boot.bin以外还有其他的依赖,比如 u-boot.srec u-boot.sym System.mapu-boot.cfgbinary_size_check等等,这些依赖的生成方法和u-boot.bin很类似,大家自行查看 一下顶层 Makefile

 

总结一下“make”命令的流程,如图所示:

08_Uboot顶层Makefile分析_make过程

 

就是“make”命令的执行流程,关于uboot的顶层Makefile就分析到这里,重点是“make xxx_defconfig”和“make”这两个命令的执行流程:

make xxx_defconfig:用于配置uboot,这个命令最主要的目的就是生成.config 文件。

make:用于编译uboot,这个命令的主要工作就是生成二进制的u-boot.bin文件和其他的一 些与 uboot有关的文件,比如u-boot.imx等等。 文章来源地址https://www.toymoban.com/news/detail-433901.html

到了这里,关于08_Uboot顶层Makefile分析_make过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】vim(附配置sudo)、yum、gcc、g++、gdb、make/Makefile工具汇总

    (一)历史沉淀 我们在安装一个软件之前,需要先下载对应的软件包,但是这个软件包并不存在于我们本地的计算机磁盘,而是存在于远端服务器上;那么计算机如何知道该软件存在于具体的哪一台服务器上呢? 对于电脑来说,我们一般通过搜索对应软件的官网来得到相应

    2024年02月13日
    浏览(38)
  • [QT]+[Cmake]+[openCV]配置环境报错:mingw32-make: *** [Makefile:165: all] Error 2等问题的解决办法

    当前作者各软件的版本:QT5.14.2 + CMAKE 3.29.0 +openCV 4.5.4 Qt配置OpenCV教程,亲测已试过(详细版)_qt opencv-CSDN博客 配置的时候主要参考了以上文章 出现的第一个问题是在cmake configure的时候卡在 FFMPEG: Downloading ffmpeg_version.cmake from https://raw.githubusercontent.com/opencv/opencv_3rdparty/7dd0d4

    2024年04月26日
    浏览(33)
  • Linux--make & makefile

    make 工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能, 而是用类似于批处理的方式—— 通过调用 makefile 文件中用户指定的命令来进行编译和链接的 。 makefile 命令中就包含了调用 gcc(也可以是别的编译器)去编译某个源文件的命令。 makefile 在一些简

    2024年02月12日
    浏览(28)
  • make/makefile的使用

    make是一个命令,是一个解释makefile中指令的命令工具,makefile是一个文件,当前目录下的文件,两者搭配使用,完成项目自动化构建 make/makefile是Linux项目自动化构建工具,将多个源文件放在makefile中,通过make命令,通过makefile文件中的依赖关系,使得文件实现自动化编译,极

    2024年02月16日
    浏览(31)
  • make和makefile

    make是一条指令 makefile是一个文件 make和makefile一般都是两两配合使用,熟练掌握这俩的使用方法会对我们以后完成大型工程的能力打下基础 我们知道,使用gcc/g++运行程序时需要输入许多 指令,而make/makefile可以很好的帮助我们节省掉这些繁杂的编写过程,接下来我先告诉大家

    2024年04月25日
    浏览(26)
  • opencv安装make时报错: 没有指明目标并且找不到makefile make: *** 没有指明目标并且找不到 makefile。 停止。

    在利用安装包进行opencv安装时,当按照指令安装好依赖,进行下载opencv文件夹下,建立build文件夹并进入其文件夹后,利用CMAKE进行编译,但是编译成功之后,我们进行 sudo make 的时候会出现如下错误: 此时,首先解释一下原因是因为cmake之后在build文件夹中没有makefile文件,所

    2024年02月11日
    浏览(30)
  • make/makefile/cmake/nmake

    最近,有没有被make、cmake、makefile... ... 这些东西绕晕了,看看下面的文章,也许就可以理解清楚了。 它是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是 编译器 ,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。 我们的程序 只有一个 源文

    2024年02月13日
    浏览(25)
  • Linux工具make与makefile

    自动化构建工具 make / Makefile 是一个备受关注的话题。在现代软件开发中,构建和部署过程越来越复杂,需要更加高效和自动化的工具来帮助开发人员管理项目。 Make / Makefile 就是这样一种工具,它可以通过定义规则和依赖关系来自动化地构建项目。本文将介绍 make / Makefile 的

    2023年04月19日
    浏览(26)
  • 【Linux】Make和Makefile快速入门

    作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 目标:熟练掌握Make和Makefile的使用 毒鸡汤:人生就像一条河,左岸是无法忘却的回忆,右岸是值得把握的青春,中岸是正在燃烧的面孔。 望小伙伴们点赞👍收藏✨加

    2024年02月04日
    浏览(29)
  • Linux: make/Makefile 相关的知识

      会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复

    2024年01月24日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包