uboot 顶层 Makefile 逐行分析

文章目录

  • 0001-0008
  • 0009-0018
  • 0019-0051
  • 0052-0092
  • 0093-0107
  • 0108-0123
  • 0124-0177
  • 0178-2135
    • 0178-0181
    • 0182-0186
    • 0187-0202
    • 0203-0245
    • 0246-0262
    • 0263-0272
    • 0273-0337
    • 0338-0383
    • 0384-0387
    • 0388-0425
    • 0426-0449
    • 0450-0474
    • 0475-0486
    • 0487-0498
    • 0499-0534
    • 0535-0550
    • 0551-0565
    • 0566-2218
    • 2219
    • 2220-2332
    • 2233-2351
    • 2252-2380
  • 2136-2323

uboot顶层Makefile分析1.png
提取码: w56a
uboot顶层Makefile分析2.png
提取码: ge29

0001-0008

版本号信息
在这里插入图片描述

0009-0018

MAKEFLAGS 变量
在这里插入图片描述
make 是支持递归调用的,也就是在 Makefile 中使用“make”命令来执行其他的 Makefile 文件,一般都是子目录中的 Makefile 文件。假如在当前目录下存在一个“subdir”子目录,这个子目录中又有其对应的 Makefile 文件,那么这个工程在编译的时候其主目录中的 Makefile 就可以调用子目录中的 Makefile,以此来完成所有子目录的编译。主目录的 Makefile 可以使用如下代码来编译这个子目录: $(MAKE) -C subdir

$(MAKE)就是调用“make”命令,-C 指定子目录。有时候我们需要向子 make 传递变量,这个时候使用“export”来导出要传递给子 make 的变量即可,如果不希望哪个变量传递给子 make 的话就使用“unexport”来声明不导出。

0019-0051

1. 引用 include/host_arch.h
1. 查询平台
2. 导出变量
在这里插入图片描述

0052-0092

说明注释
在这里插入图片描述

0093-0107

命令输出(make V=number)
在这里插入图片描述
uboot 默认编译是不会在终端中显示完整的命令,都是短命令,在终端中输出短命令虽然看起来很清爽,但是不利于分析 uboot 的编译过程。可以通过设置变量“V=1“来实现完整的命令输出,这个在调试 uboot 的时候很有用。
$(origin <variable>)
作用:它不操作变量的值,用于告诉你变量是哪来的。
参数:variable 是变量名。
返回值:变量来源。如果变量 V 是在命令行定义的那么它的来源就是"command line"。

0108-0123

静默输出(make -s)
在这里插入图片描述
设置 V=0 或者在命令行中不定义 V 的话,编译 uboot 的时候终端中显示的短命令,但是还是会有命令输出,有时候我们在编译 uboot 的时候不需要输出命令,这个时候就可以使用 uboot 的静默输出功能。编译的时候使用“make -s”即可实现静默输出。
$(filter <pattern…>,<text>)
作用:过滤函数,以 pattern 模式过滤 text 字符串中的单词,仅保留符合模式 pattern 的单词,可以有多个模式。
返回值:符合 pattern 的字符串。

$(firstword <text>)
作用:用于取出 text 字符串中的第一个单词。
返回值:获取到的单词。

0124-0177

设置编译结果输出目录(make O=out)
在这里插入图片描述
uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“O”来指定输出目录,比如“make O=out”就是设置目标文件输出到 out 目录中。这么做是为了将源文件和编译产生的文件分开,当然也可以不指定 O 参数,不指定的话源文件和编译产生的文件都在同一个目录内,一般我们不指定 O 参数。

0178-2135

0178-0181

判断是否跳过 makefile 去输出目录中执行子 makefile

在这里插入图片描述

0182-0186

追加 MAKEFLAGS 变量
在这里插入图片描述

0187-0202

代码检查(make C=number)
在这里插入图片描述

0203-0245

模块编译(make M=dir)在这里插入图片描述
在 Linux 系统中,CD 命令常常被用来切换当前工作目录。然而,当你需要频繁地切换到某个目录时,则需要输入完整路径,这显然不是很方便。为了简化这个过程,Linux 提供了一个叫做 CDPATH 的环境变量,可以让你通过指定一组路径,使 CD 命令可以查找其中的目录并跳转过去。
在这里插入图片描述

0246-0262

获取电脑主机架构和系统
在这里插入图片描述

0263-0272

设置目标架构、交叉编译器和配置文件
在这里插入图片描述
编 译 uboot 的 时 候 需 要 设 置 目 标 板 架 构 和 交 叉 编 译 器 ,“ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”就是用于设置 ARCH 和 CROSS_COMPILE,每次编译 uboot 的时候都要在 make 命令后面设置 ARCH 和 CROSS_COMPILE,使用起来很麻烦,可以直接修改顶层 Makefile,在里面加入 ARCH 和 CROSS_COMPILE 的定义,这样就不用每次编译的时候都要在 make 命令后面定义 ARCH 和 CROSS_COMPILE。
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-

0273-0337

给变量赋值
在这里插入图片描述
在这里插入图片描述

0338-0383

1. 选择内置编译
2. 编写 sieze_check 函数,并导出
3. 导出相应变量
在这里插入图片描述

0384-0387

调用 scripts/Kbuild.include
在这里插入图片描述

0388-0425

交叉编译工具变量设置
在这里插入图片描述

0426-0449

设置一些变量
在这里插入图片描述
$(call 参数1, 参数2, …)
作用:用于调用一个用户定义的函数,它的第一个参数是函数名,剩下的参数会作为参数传递给函数。

0450-0474

导出其他变量
在这里插入图片描述

VERSION: 顶层 Makefile 文件,第3行定义:VERSION = 2021
PATCHLEVEL:顶层 Makefile 文件,第4行定义:PATCHLEVEL = 07
SUBLEVEL:顶层 Makefile 文件,第5行定义:SUBLEVEL =
UBOOTRELEASE:顶层 Makefile 文件,由于 include/config/uboot.release 文件是编译后生成的,所以:UBOOTRELEASE=
UBOOTVERSION:顶层 Makefile 文件,第449行定义:UBOOTVERSION = 2021.07
ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR: 这 7 个变量就是在 config.mk 里面定义的,由于没有引用 config.mk 文件,ARCH 在输入的时候定义为 arm,所以除了 ARCH 其他变量都为空
CONFIG_SHELL: 顶层 Makefile 文件,第274行定义:CONFIG_SHELL = /bin/bash
HOSTCC:顶层 Makefile 文件,第282行定义:HOSTCC = cc
KBUILD_HOSTCFLAGS:顶层 Makefile 文件,第284行定义:KBUILD_HOSTCFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer 和 第 297行定义:KBUILD_HOSTCFLAGS += -std=gnu11,所以:KBUILD_HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
CROSS_COMPILE:在输入命令行职工定义为:/home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-
AS:顶层 Makefile 文件,第390行定义:AS = /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-as
LD:顶层 Makefile 文件,第393行定义:LD = /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-ld.bfd
CC:顶层 Makefile 文件,第397行定义:CC = /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-gcc
CPP:顶层 Makefile 文件,第398行定义:CPP =/home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-gcc -E
AR:顶层 Makefile 文件,第399行定义:AR=/home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-ar
NM:顶层 Makefile 文件,第400行定义:NM= /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-nm
LDR:顶层 Makefile 文件,第401行定义:LDR = /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-ldr
STRIP:顶层 Makefile 文件,第402行定义:STRIP = /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-strip
OBJCOPY:顶层 Makefile 文件,第403行定义:OBJCOPY= /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-objcopy
OBJDUMP:顶层 Makefile 文件,第404行定义:OBJDUMP= /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/arm-linux-gnueabihf-objdump
KBUILD_HOSTLDFLAGS:顶层 Makefile 文件,第287行定义:KBUILD_HOSTLDFLAGS=
KBUILD_HOSTLDLIBS:顶层 Makefile 文件,第288行定义:KBUILD_HOSTLDLIBS=
MAKE:内置变量,指向当前使用的 make 工具
LEX:顶层 Makefile 文件,第405行定义:LEX = flex
YACC:顶层 Makefile 文件,第406行定义:YACC = bison
AWK:顶层 Makefile 文件,第407行定义:AWK= awk
PERL:顶层 Makefile 文件,第408行定义:PERL= perl
PYTHON:顶层 Makefile 文件,第409行定义:PYTHON= python
PYTHON2:顶层 Makefile 文件,第410行定义:PYTHON2= python2
PYTHON3:顶层 Makefile 文件,第411行定义:PYTHON3 =python3
HOSTCXX:顶层 Makefile 文件,第283行定义:HOSTCXX =
KBUILD_HOSTCXXFLAGS:顶层 Makefile 文件,第286行定义:KBUILD_HOSTCXXFLAGS=-O2
CHECK:顶层 Makefile 文件,第413行定义:CHECK= sparse
CHECKFLAGS:顶层 Makefile 文件,第415行定义:CHECKFLAGS = -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise -Wno-return-void -D__CHECK_ENDIAN__
DTC:顶层 Makefile 文件,第412行定义:DTC= ./scripts/dtc/dtc
DTC_FLAGS:未定义,DTC_FLAGS =
KBUILD_CPPFLAGS:顶层 Makefile 文件,第418行定义:KBUILD_CPPFLAGS= -D__KERNEL__ -D__UBOOT__
NOSTDINC_FLAGS:顶层 Makefile 文件,第782行定义:NOSTDINC_FLAGS= -nostdinc -isystem /home/xd/rpi3b/toolchain/toolchain-rpi32b/bin/…/lib/gcc/arm-linux-gnueabihf/7.5.0/include
UBOOTINCLUDE:顶层 Makefile 文件,第771行定义:UBOOTINCLUDE= -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h
OBJCOPYFLAGS:未定义:OBJCOPYFLAGS=
KBUILD_LDFLAGS:顶层 Makefile 文件,第425行定义:KBUILD_LDFLAGS=
KBUILD_CFLAGS:顶层 Makefile 文件,第420行定义:KBUILD_CFLAGS:= -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -std=gnu11 ,第423行定义:KBUILD_CFLAGS+= -fshort-wchar -fno-strict-aliasing,第444行定义:KBUILD_CFLAGS+= -fno-PIE,所以:KBUILD_CFLAGS = -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -std=gnu11 -fshort-wchar -fno-strict-aliasing -fno-PIE
KBUILD_AFLAGS:顶层 Makefile 文件,第424行定义:KBUILD_AFLAGS:= -D__ASSEMBLY__ ,第445行定义:KBUILD_AFLAGS+= -fno-PIE,所以:KBUILD_AFLAGS = -D__ASSEMBLY__ -fno-PIE
CC_VERSION_TEXT:顶层 Makefile 文件,第461行定义:CC_VERSION_TEXT = arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
MODVERDIR:顶层 Makefile 文件,第466行定义:MODVERDIR = .tmp_versions
RCS_FIND_IGNORE:顶层 Makefile 文件,第470行定义:RCS_FIND_IGNORE= ( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git ) -prune -o
RCS_TAR_IGNORE:顶层 Makefile 文件,第473行定义:RCS_TAR_IGNORE= --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git

0475-0486

目标 scripts_basic 的依赖和实现
在这里插入图片描述
第486行:scripts/basic/下的所有文件都依赖 scripts_basic 工具,执行命令为空
在这里插入图片描述

0487-0498

目标 outputmakefile 的依赖和实现
在这里插入图片描述

0499-0534

1. 头文件变量赋值
2. 配置方式选择
在这里插入图片描述
version_h:这变量保存版本号文件,此文件是自动生成的。
timestamp_h:保存时间戳文件,此文件也是自动生成的。

0535-0550

混合方式 mixed-targets
在这里插入图片描述
根据第526-533行分析可知,当输入“make 1_config 2_config”时,有1个以上的%config的配置时,mixed-targets 才会为 1。分别执行“make 1_config” 和“make 2_config”,执行2次。

0551-0565

config 方式
在这里插入图片描述

0566-2218

2219

这是第 535 行:ifeq ($(mixed-targets),1) 的结尾 end

2220-2332

1.追加目标
2.目标的依赖与实现
在这里插入图片描述

2233-2351

定义变量 build-dir 和 target-dir在这里插入图片描述

2252-2380

目标的依赖与实现
在这里插入图片描述

2136-2323

目标文件
在这里插入图片描述

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

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

相关文章

想半天憋不出几个字?试试AI扩写

大家在写文章时是否也经常这样&#xff1f;想了半天&#xff0c;结果只能写出几个字&#xff0c;但是要求往往又是几百多个字&#xff0c;那么有没有啥工具可以帮我们在原文的基础上扩写一下文章字数&#xff0c;让我们达到字数要求呢&#xff1f; 下面给大家介绍一下如何扩写文…

Django开发实战之定制管理后台界面及知识梳理(下)

接上一篇&#xff1a;Django开发实战之定制管理后台界面及知识梳理&#xff08;中&#xff09; 1、前台设置 1、隐藏路由 当你输入一个错误地址时&#xff0c;可以看到这样的报错&#xff1a; 从这样的报错中&#xff0c;我们可以看到&#xff0c;这个报错页面暴漏了路由&a…

FullCalendar日历组件集成实战(1)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

python数据可视化:从n个点中挑选m组3个点绘制m个三角形matplotlib.pyplot.triplot()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化&#xff1a; 从n个点中挑选m组3个点 绘制m个三角形 matplotlib.pyplot.triplot() [太阳]选择题 以下关于matplotlib.pyplot.triplot()函数说法正确的是&#xff1f; impor…

Linux---windows 机器和远端的 Linux 机器如何通过 XShell 传输文件

一、关于rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 Xshell 传输文件. 二、下载rzsz软件 用root输入命令&#xff1a; sudo yum install -y lrzsz下载完成&#xff1a; 三、如何传输 有图形化界面 1、从Windows机器传输给远端Linux机器 ① 直接拖拽 直接将…

微软如何打造数字零售力航母系列科普10 - 什么是Azure Databricks?

什么是Azure Databricks&#xff1f; 目录 一、数据智能平台是如何工作的&#xff1f; 二、Azure Databricks的用途是什么&#xff1f; 三、与开源的托管集成 四、工具和程序访问 五、Azure Databricks如何与Azure协同工作&#xff1f; 六、Azure Databricks的常见用例是…

JavaSE——集合框架一(2/7)-Collection集合的遍历方式-迭代器、增强for循环、Lambda、案例

目录 Collection的遍历方式 迭代器 增强for循环&#xff08;foreach&#xff09; Lambda表达式遍历集合 案例 需求与分析 代码部分 运行结果 Collection的遍历方式 迭代器 选代器是用来遍历集合的专用方式&#xff08;数组没有选代器&#xff09;&#xff0c;在Java中…

【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】 深入理解Spring Boot拦截器&#xff1a;自定义设计与实现全攻略 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 SpringBoot统⼀功能处理一…

第十五节:贪心算法(下)

一 、 贪心算法的解题套路实战一&#xff08;最多的会议宣讲场次&#xff09; 1.1 描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程&#xff0c;要求会议室进行的宣讲的场次最多。…

HTML静态网页成品作业(HTML+CSS)——动漫哆啦A梦网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

Mongo关联查询两张表中分别满足某些条件的记录

如果是在mysql里面&#xff0c;这个查起来就很方便&#xff0c;但是&#xff0c;在mongo里面的话&#xff0c;查询起来就没这么方便了。 如果使用付费版的Studio 3T工具的话&#xff0c;也可以像使用mysql一样查询mongo数据&#xff0c;但是免费版不支持sql的用法&#xff0c;只…

Python---Pandas万字总结(1)

Pandas基础-1 Pandas 是 一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础&#xff08;实现数据存储和运算&#xff09;&#xff0c;提供了专门用于数据分析的类型、方法和函数&#xff0c;对数据分析和数据挖掘提供了很好的支持&#xff1b;同时 pandas 还可以跟数…

kubeadm 在vubuntu22.04.4 server 上安装kubernetes 1.28.9

一、基础安装&#xff08;所有节点执行&#xff09;---------------------------------------- 时间同步 关闭防火墙 sudo ufw disable sudo ufw status关闭交换内存 临时关闭 sudo swapoff -a free -m永久关闭 sudo vim /etc/fstab 注释掉交换内存 转发 IPv4 并让 iptab…

云贝教育 |【好课上新】ITSS服务工程师与服务经理认证培训

课程前言 ITSS是中国电子技术标准化研究院推出的&#xff0c;包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级要求。 IT 服务工程师”结合 IT服务从业人员能力规范和要求&#xff0c;从服务技术、服务技巧和服务…

【Linux】调试器-gdb使用

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 背景(A) 看大小(B) 查看ELF格式的文件 2.使用(A) 进入gdb(B) quit/q&#xff…

【码农日常】将mp4转换为逐帧图片

项目场景&#xff1a; 拍摄了一段视频记录设备工作的状态和测量仪器的实时数据。由于测量仪器岁数比较大&#xff0c;不够智能&#xff0c;遂打算将视频转换为逐帧图片进行分析。 网上没找到现成工具&#xff0c;借鉴网上大神的操作方式打算用python写一个工具。 问题描述 用…

一、VIsual Studio下的Qt环境配置(Visual Studio 2022 + Qt 5.12.10)

一、下载编译器Visual Studio2022和Qt 5.12.10 Visual Studio 2022 社区版就够学习使用了 Qt5.12.10 安装教程网上搜&#xff0c;一大堆 也很简单&#xff0c;配置直接选默认&#xff0c;路径留意一下即可 二、配置环境 Ⅰ&#xff0c;配置Qt环境变量 系统变量下的Path&a…

【DevOps】深入解析 Docker日志分析和服务故障排除技巧

在今天的云计算和微服务架构中&#xff0c;Docker凭借其轻量级和高效的容器化技术&#xff0c;已成为软件部署不可或缺的一部分。然而&#xff0c;随着应用复杂性的增加&#xff0c;有效的日志管理和故障排除能力成为了开发者和运维人员必须掌握的核心技能。本文将带你深入探索…

AI办公自动化-用kimi自动清理删除重复文件

在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 1、打开文件夹D:\downloads&#xff1b; 2、哈希值比较比较里面所有的文件&#xff0c;如果文件相同&#xff0c;那么移动多余…

群晖NAS本地搭建Bitwarden密码管理服务并实现远程同步密码托管

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…