uboot 顶层 Makefile 逐行分析

news2024/11/22 16:08:09

文章目录

  • 0001-0008
  • 0009-0018
  • 0019-0051
  • 0052-0092
  • 0093-0107
  • 0108-0123
  • 0124-0177
  • 0178-2315
    • 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-2280
    • 2281-2314
    • 2315
  • 2316-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-2315

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 工具,执行命令为空
在这里插入图片描述
展开后 make -f ./scripts/Makefile.buid obj=scripts/basic 中 ./scripts/Makefile.buid 的分析

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 方式
在这里插入图片描述
展开后 make -f ./scripts/Makefile.buid obj=scripts/kconfig rpi_3_32b_defconfig 中 ./scripts/Makefile.buid 的分析

0566-2218

2219

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

2220-2332

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

2233-2351

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

2252-2280

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

2281-2314

1. 变量赋值
2. 目标的依赖与实现
3. 查询所有 *.cmd 文件并展开
在这里插入图片描述> $(wildcard <pattern>)

作用:是Makefile中的一个内建函数,用于获取符合特定模式的文件名列表。
例如:例如,$(wildcard *.c)会获取当前目录下所有以.c为扩展名的文件列表

$(foreach VAR,LIST,TEXT)

作用:类似于Linux shell中的for语句,是一个循环函数。
函数的工作过程:执行时把"LIST"中使用空格分隔的字符串依次取出赋值给变量"VAR",然后执行"TEXT"表达式。重复直到"LIST"的最后一个字符串。"TEXT"中的变量或函数引用在执行时才被展开,因此,如果在"TEXT"中存在对"VAR"的引用,那么"VAR"的值在每一次展开时将会是不同的值。如果存在变量或函数的引用,首先需要展开变量"VAR"和"LIST"的引用。函数参数"VAR"是一个局部的临时变量,它只在"foreach"函数的上下文有效,它的定义不影响其他部分定义的同名"VAR"变量的值。
$(sort list)

作用:是Makefile的一个内建函数,它用于将列表中的词进行排序,并删除重复的词。
参数:list是你想要排序的单词列表
$(dir <names…>)

作用:从文件名序列中取出目录部分。目录部分是指最后一个反斜杠(/)之前的部分。如果没有反斜杠,那么返回./。
返回值:返回文件名序列的目录部分
$(notdir <names…>)

作用:从文件名序列中取出非目录部分。非目录部分是指最后一个反斜杠(/)之后的部分。
返回值:返回文件名序列的非目录部分

2315

第180行 ifeq ($(skip-makefile),) 的结尾 endif
在这里插入图片描述

2316-2323

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

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

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

相关文章

vue3延迟加载(异步组件​)defineAsyncComponent

最简单用法 Index.vue: <script setup> import { onMounted, defineAsyncComponent } from vue import ./index.cssconst Child defineAsyncComponent(() > import(./Child.vue))onMounted(() > {}) </script><template><div class"m-home-w…

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

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

等保2.0的全面解读与实施策略

《网络安全等级保护基本要求》&#xff08;等保2.0&#xff09;是中华人民共和国国家安全部于2019年6月发布的网络安全等级保护标准。该标准规定了我国关键信息基础设施的网络安全等级保护要求和评估标准&#xff0c;对于保障我国网络安全具有重要的意义。下面是对等保2.0的全面…

功能安全如何在公司顺利开展?-亚远景科技

亚远景功能安全主题线上会议报名开启&#xff01; 随着汽车技术的不断发展&#xff0c;汽车系统的复杂性和交互性大幅增加&#xff0c;功能安全成为确保驾驶员、乘客及行人安全的关键。 本场功能安全线上会议&#xff0c;亚远景为汽车行业的相关人员准备了以下内容&#xff1a…

保姆级AI绘画入门教程,从此找图不求人、风格还统一(入门篇)

安装流程 安装包使用的是b站大佬“秋葉aaaki”制作的整合程序。他还会讲授一些lora训练的方法&#xff08;对于大多数人来说可能一生都用不上的功能&#xff0c;跟着月仔学学基础操作就成了&#xff0c;哈哈。&#xff09; 首先要下载安装包&#xff0c;最新的安装包大小已经…

vant showNotify样式修改

main.ts直接引入根css会影响已经修改好的其他vant样式,直接添加一个新的my-vant.scss文件引入 //vant showNotify样式修改 .van-popup.van-popup--top.van-notify {width: 343px !important;height: 40px !important;border-radius: 12px !important;margin: 0 auto !importan…

黑马点评项目总结及个人优化

怎么根据前端代码实现自己的后端业务,实现不同接口 查阅文档:如果有完善的接口文档,可以直接查阅文档来了解后端所有接口的业务逻辑和功能。 阅读后端代码:通过阅读后端代码,特别是控制器(Controller)层和服务(Service)层的代码,可以了解后端所有接口的具体实现逻辑。…

FPGA verilog LVDS通信协议笔记

一幅图胜过千言万语 直接开始挫代码&#xff0c;先写top.v。 module top();reg clk; // 生成时钟的寄存器 reg rst; // 生成复位信号的寄存器initial clk 1; // 初始值取1 always #1 clk ~clk; //1ns取反一次initial begin // 复位信号&#xff0c;先0&#xff0c;过段时间赋…

飞书深诺沈菁:智能化是企业增长的助推器

刚刚结束的ChinaJoy&#xff0c;既是游戏行业的盛会&#xff0c;也是出海企业的盛会。活动期间&#xff0c;飞书深诺旗下专注于游戏出海的平台Meetgames举办「进无止境」Meetgames升级发布会&#xff0c;推出全新升级的Meetgames平台&#xff0c;并与合作伙伴和嘉宾共同探讨成长…

HBuilder简单实现打包

这里使用HBuilder的原生云打包来进行打包APP&#xff0c; 首先需要登录HBuilder开发者中心 确认无误后&#xff0c;回到HBuilder,点击发行&#xff0c; 填写好对应信息后即可进行下一步操作&#xff0c;其他选择默认就可以了&#xff0c; 选择无视风险&#xff0c;继续打包 到…

GO—web程序中的请求缓存设置

背景 假设用户数据存在数据库&#xff0c;现在需要一个函数&#xff0c;通过用户名称返回用户信息。 期望&#xff1a;在一次web请求中&#xff0c;不过调用多少次这个函数&#xff0c;只请求一次数据库。 基本信息 type User struct {Name stringAge int }func GetALLUser…

K8s源码分析(一)-K8s调度框架及调度器初始化介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 文章目录 调度框架介绍K8s scheduler 介绍K8s scheduler的初始化Cobra介绍K8s scheduler中初始化的源代码解析 调度框架介绍 这是官方对于v1.27调度框架的介绍文档&#xff1a;https://v1-27.docs.kubernetes.io/docs/…

开源模型应用落地-CodeQwen模型小试-集成langchain(四)

一、前言 通过学习代码专家模型&#xff0c;开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率&#xff0c;还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务&#xff0c;从而推动软件…

kubernetes1.27.3版本单主机部署详细教程

本次kubernetes单主机部署是基于AnolisOS-7.9操作系统进行部署的&#xff0c;当然也适用于Centos7的操作系统&#xff0c;根据个人情况&#xff0c;选择适合自己的版本! 本次部署的kubernetes版本是1.27.3版本&#xff0c;系统架构是etcd&#xff0c;API Server&#xff0c;Con…

【Jenkins】Pipeline流水线语法解析全集 -- 声明式流水线

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

嵌入式学习<2>:EXTI、ADC、NVIC和AFIO

嵌入式学习_part2 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程_EXTI EXTI、ADC、NVIC和AFIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;EXTI STM32F10xxx参考手册&#xff08;中文&#xff09;-> 中断与事件 ->…

死锁调试技巧:工作线程和用户界面线程

有人碰到了一个死锁问题&#xff0c;找到我们想请我们看看&#xff0c;这个是关于应用程序用户界面相关的死锁问题。 我也不清楚他为什么会找上我们&#xff0c;可能是因为我们经常会和窗口管理器打交道吧。 下面&#xff0c;我们来看看死锁的两个线程。 >> 请移步至 …

【SpringSecurity源码】过滤器链加载流程

theme: smartblue highlight: a11y-dark 一、前言及准备 1.1 SpringSecurity过滤器链简单介绍 在Spring Security中&#xff0c;过滤器链&#xff08;Filter Chain&#xff09;是由多个过滤器&#xff08;Filter&#xff09;组成的&#xff0c;这些过滤器按照一定的顺序对进…

LeetCode算法题:49. 字母异位词分组(Java)

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …

试试这四个AI论文工具和降重技术,低成本高回报

在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们精确提炼中心思想&#xff0c;显著提升论文写作…