Makefile学习笔记19|u-boot顶层Makefile05

Makefile学习笔记19|u-boot顶层Makefile05

  希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。

  这里是目录

定义常见构建工具变量

# Make variables (CC, etc...)AS		= $(CROSS_COMPILE)as
# Always use GNU ld
ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
LD		= $(CROSS_COMPILE)ld.bfd
else
LD		= $(CROSS_COMPILE)ld
endif
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
LDR		= $(CROSS_COMPILE)ldr
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
LEX		= flex
YACC		= bison
AWK		= awk
PERL		= perl
PYTHON		?= python
PYTHON2		= python2
PYTHON3		?= python3

  这段代码很平凡,就是定义常见构建工具变量。首先尝试使用 GNU 的 ld.bfd,如果找不到,回落到标准的 ld。BFD (Binary File Descriptor) 是 ld 的一个后端,通常提供更多的功能和选项。

工具和编译器/链接器标志

# The devicetree compiler and pylibfdt are automatically built unless DTC is
# provided. If DTC is provided, it is assumed the pylibfdt is available too.
DTC_INTREE	:= $(objtree)/scripts/dtc/dtc
DTC		?= $(DTC_INTREE)
DTC_MIN_VERSION	:= 010406CHECK		= sparseCHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \-Wbitwise -Wno-return-void -Wno-unknown-attribute \-D__CHECK_ENDIAN__ $(CF)KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \-Wno-format-security \-fno-builtin -ffreestanding $(CSTD_FLAG)
KBUILD_CFLAGS	+= -fshort-wchar -fno-strict-aliasing
KBUILD_AFLAGS   := -D__ASSEMBLY__
KBUILD_LDFLAGS  :=
  1. DTC (Device Tree Compiler):

DTC_INTREE 变量指向内部构建树中 Device Tree Compiler 的路径。U-Boot 使用 DTC 来编译设备树源文件(.dts)为设备树二进制文件(.dtb)。
DTC 变量如果未赋值,则默认使用内部构建树中的 DTC。可以通过设定环境变量 DTC 来覆盖此设置,使用外部预先安装的 DTC。
DTC_MIN_VERSION 定义了 U-Boot 构建过程需要的最低 DTC 版本。

  1. CHECK (Sparse):

CHECK 变量指向 sparse,这是一个用于进行源代码静态分析检查的工具。它可以检查内核代码,找出潜在的问题。

  1. CHECKFLAGS:

CHECKFLAGS 定义了传递给 sparse 的标志。这包括定义某些预处理器宏以及启用特定的警告。

  1. KBUILD_CPPFLAGS:

KBUILD_CPPFLAGS 定义了传递给预处理器的公共标志。这包括 KERNEL 宏,它用于区分内核代码和用户空间代码,以及 U-Boot 特有的 UBOOT 宏。

  1. KBUILD_CFLAGS:

KBUILD_CFLAGS 定义了 C 编译器的公共标志。这包括启用所有警告标志 (-Wall),要求严格函数原型 (-Wstrict-prototypes),以及安全性相关的标志。
也包括 -fno-builtin(不把任何函数当做内建函数优化处理)和 -ffreestanding(指示编译器不假定程序的执行环境遵循标准库规范)。
增加了 -fshort-wchar(使得 wchar_t 数据类型为 16 位宽度)和 -fno-strict-aliasing(禁用严格的别名规则,允许某些优化)。

  1. KBUILD_AFLAGS:

KBUILD_AFLAGS 为汇编器定义了特定的标志,包括 ASSEMBLY 宏定义。

  整体而言,这些变量为 U-Boot 的构建环境提供了必要的配置信息,确保了编译过程的正确性和优化。它们被精心挑选和设定,以满足针对嵌入式环境的编译要求,例如对二进制大小和性能的考虑。在构建 U-Boot 时,这些变量将被 Makefile 使用,以确保生成的二进制能在目标硬件平台上正确运行。

定义变量

# Don't generate position independent code
KBUILD_CFLAGS	+= $(call cc-option,-fno-PIE)
KBUILD_AFLAGS	+= $(call cc-option,-fno-PIE)# Read UBOOTRELEASE from include/config/uboot.release (if it exists)
UBOOTRELEASE = $(shell cat include/config/uboot.release 2> /dev/null)
UBOOTVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
export CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM LDR STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
export MAKE LEX YACC AWK PERL PYTHON PYTHON2 PYTHON3
export HOSTCXX KBUILD_HOSTCXXFLAGS CHECK CHECKFLAGS DTC DTC_FLAGSexport KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
export KBUILD_CFLAGS KBUILD_AFLAGSexport CC_VERSION_TEXT := $(shell $(CC) --version | head -n 1)
  1. KBUILD_CFLAGS 和 KBUILD_AFLAGS:

这些变量定义了编译器和汇编器的标志,用于 C 和汇编语言文件。这里特别禁用了生成位置无关代码(PIE,Position Independent Executable),增加 $(call cc-option,-fno-PIE) 旨在添加 -fno-PIE 选项,但仅当编译器支持这个选项时才会添加。

  1. UBOOTRELEASE 和 UBOOTVERSION:

UBOOTRELEASE 从 include/config/uboot.release 文件中读取 U-Boot 的发布版本号,如果该文件不存在则为空。
UBOOTVERSION 构建了一个版本字符串,它基于几个变量来确定 U-Boot 的完整版本。

  1. ARCH, CPU, BOARD 等变量:

这些变量定义了用于构建过程的多个系统和板级特定的信息。例如,ARCH 指定处理器架构,BOARD 指定了特定的开发板。

  1. CONFIG_SHELL, HOSTCC 等工具变量:

这些变量指向构建过程中使用的工具。CONFIG_SHELL 指定 shell,HOSTCC 指定宿主机上的 C 编译器,CROSS_COMPILE 指定交叉编译前缀,AS、LD 等变量指向汇编和链接工具。

  1. LEX, YACC, AWK 等解析工具:

用于在构建过程中处理文本文件和代码生成的工具和脚本语言的路径。

  1. CC_VERSION_TEXT:

此变量获取并存储正在使用的 C 编译器的版本字符串,它通过调用编译器的 --version 选项,并取结果的第一行实现。

  在 U-Boot 的构建系统中,这样的配置是用来确保构建可以在不同的环境和配置下正确执行。特别是当涉及到交叉编译或特定的硬件平台时,正确配置这些变量就显得格外重要。通过将它们导出为环境变量,U-Boot 的构建系统能够在整个项目目录范围内使用这些配置,保持构建的一致性并简化了子 Makefile 的编写。

定义find和tar的行为

# Files to ignore in find ... statements
export 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
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \--exclude CVS --exclude .pc --exclude .hg --exclude .gitexport PYTHON_ENABLE
  1. RCS_FIND_IGNORE:

这个变量被设置为 find 命令中用于排除特定目录的参数。此处的目的是为了忽略一些版本控制系统(VCS)的目录,例如 SCCS, BitKeeper, .svn (Subversion), CVS, .pc, .hg (Mercurial), .git (Git)。

在 find 命令中,这些参数会让 find 忽略匹配的目录,并且不在它们之下搜索文件。这个 -prune 选项告知 find 忽略当前匹配的目录,-o 表示 “OR”,即如果目录被忽略,那么执行 -prune 的动作,否则继续其他操作。

  1. RCS_TAR_IGNORE:

类似于 RCS_FIND_IGNORE,这个变量包含 tar 命令的参数,用于在创建 tarball(如 .tar.gz 或 .tar.bz2 文件)时排除相同的版本控制目录。
这些 --exclude 选项告诉 tar 忽略具有这些名字的目录,避免将其打包进 tarball。

  1. PYTHON_ENABLE:

这个环境变量似乎没有在这段代码中被赋值,不过它的存在暗示着在其他地方可能会对其赋值。
一般来说,这样的变量可能用于在构建过程中激活或禁用与 Python 相关的一些功能。例如,它可能会用来决定是否包含 Python 脚本,或者是否需要特定版本的 Python 环境。

  这段代码定义了一组环境变量,这些变量用来忽略在 find 命令和打包(tar)步骤中不需要处理的目录。在 U-Boot 或其他需要过滤掉版本控制目录的项目中,这些设置非常有用。它们确保了在源代码树内搜索文件或打包时不会包括不必要的版本控制元数据,这是在发布源代码或构建二进制发布时通常想要避免的。根据需要设置 PYTHON_ENABLE 变量,则可能是因为构建系统有一部分是用 Python 编写的,或者构建步骤需要调用 Python 脚本,因此需要根据实际环境来启用或禁用相关功能。

  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

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

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

相关文章

Vue从入门到实战Day12~14 - Vue3大事件管理系统

一、用到的知识 Vue3 compositionAPIPinia / Pinia持久化处理Element Plus(表单校验,表格处理,组件封装)pnpm 包管理升级Eslint prettier 更规范的配置husky(Git hooks工具):代码提交之前,进行校验请求模…

OrangePi Kunpeng Pro ——信创再接力

文章目录 OrangePi Kunpeng Pro ——信创再接力1. 绪论1.1 开箱 2. 硬件介绍2.1 硬件配置2.2 硬件清单 3. 网络测试3.1 有线连接3.2 WIFI连接 4.查看系统配置5. 安装常用软件5.1 安装python5.1.1 更换pip源为国内清华源 5.2 安装docker5.3 安装opencv5.4 安装dlib 6.CPU多进程能…

LeetCode //C - 143. Reorder List

143. Reorder List You are given the head of a singly linked-list. The list can be represented as: L0 → L1 → … → Ln - 1 → Ln Reorder the list to be on the following form: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … You may not modify the values i…

MVCC机制

个人理解篇,不一定对,应付面试的时候看的 MVCC(Multi-Version Concurrency Control)全称多版本并发控制,主要用在隔离模式下的提交读、可重复读模式下,依赖于readview和undolog链 一、readview 1、结构 字段 备注 m_ids 活跃…

如何优化大文件读取时的性能

1、分块读取 1、不要一次性将整个文件加载到内存中,而是将其分割成多个较小的块(例如,每块1MB或更大),然后逐块读取和处理。 2、使用FileInputStream和BufferedInputStream来分块读取文件。 2、使用缓冲区 1、使用…

代码随想录——合并二叉树(Leetcode617)

题目链接 层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

多线程知识04

新建 T1、T2、T3 三个线程,如何保证它们按顺序执行 在Java中,可以使用线程的join()方法来保证线程的顺序执行。join()方法会将线程暂停,直到调用该方法的线程结束执行为止。 以下是创建T1、T2、T3三个线程,并按顺序执行的示例代码…

python项目的数据库迁移工具,类似于Flyway的数据库迁移工具有那些?

Python项目中常用的数据库迁移工具主要有以下几种: Alembic: 这是一个轻量级的数据库迁移工具,主要用于SQLAlchemy项目。它通过版本控制来跟踪和管理数据库模式的变更。 Django Migrations: Django框架自带的迁移工具,用于创建和应用数据库模式变更。 Flask-Migrate: 基于Ale…

《探索 IT 行业的无限可能》

你眼中的IT行业现状与未来趋势 随着技术的不断进步,IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链,这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

工业制造企业为什么要进行数字化转型

人人都在谈数字化转型,政府谈数字化策略方针,企业谈数字化转型方案,员工谈数字化提效工具。互联网企业在谈,工业企业也在谈。 在这种大趋势下,作为一个从事TOB行业十年的老兵,今天就来给大家讲讲&#xff…

【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录 通讯录管理系统一、系统需求以及成品演示二、代码实现三、完整代码 通讯录管理系统 一、系统需求以及成品演示 1.1 系统需求 通讯录是一个可以记录亲人、好友信息的工具。这里利用C来实现一个通讯录管理系统 系统中需要实现的功能如下: 添加联系人&am…

spring boot 之 接口参数校验

引入pom依赖 <!--参数校验--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>统一返回结果封装 import lombok.Data;import java.io.Serializa…

申请的商标名称相同或近似,如何解决!

最近遇到一些首次申请注册商标的主体&#xff0c;基本想的名称都是两个字或或者两个字加通用词&#xff0c;还有用的行业描述词或缺乏显著特征词&#xff0c;这样去申请注册商标&#xff0c;普推知产老杨分析这样去直接申请注册大概率驳回。 两个字基本上注册的差不多了&#…

Ubuntu 20.04中用scrapy爬取博客园新闻首页的简单示例

一、梳理scrapy项目目录创建&#xff1a; 1、命令行终端定位到pycharm主目录&#xff1a;cd PycharmProjects 2、建立项目名称&#xff1a;scrapy startproject searchArticle 3、定位到项目目录下&#xff1a;cd searchArticle 4、设置爬虫名称与欲爬取的域名地址&#xf…

可变参数函数

可变参数函数指的是函数的参数个数可变&#xff0c;参数类型不定的函数。 C提供了两种主要的方法&#xff1a; &#xff08;1&#xff09;如果所有的实参类型相同&#xff0c;可以传递一个名为initializer_list的标准库类型。 &#xff08;2&#xff09;如果所有的实参类型不完…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;这个答案很简单:c语言不区分…

上海亚商投顾:沪指冲高回落 电力、电网产业链持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指均跌超1%。电力、电网股再度爆发&#xff0c;众智科技、郴电国…

展望跨境智慧银行在全球化金融服务中的发展趋势和机遇

一、引言 随着全球经济的不断融合和金融科技的迅猛发展,跨境智慧银行作为连接不同国家和地区金融市场的桥梁,正逐渐展现出其独特的魅力和潜力。跨境支付与结算作为跨境智慧银行的核心业务之一,随着全球化的深入发展和国际贸易的日益频繁,其业务场景也愈发丰富和复杂。本文…

武大深度学习期末复习-常见神经网络概念

深度学习经典神经网络概念、优缺点及应用场景 文章目录 一、多层感知机&#xff08;MLP&#xff09;1.1 结构和原理1.2 优缺点1.3 应用场景 二、卷积神经网络&#xff08;CNN&#xff09;2.1 结构和原理2.2 优缺点2.3 应用场景 三、循环神经网络&#xff08;RNN&#xff09;3.1…

15.微信小程序之async-validator 基本使用

async-validator是一个基于 JavaScript 的表单验证库&#xff0c;支持异步验证规则和自定义验证规则 主流的 UI 组件库 Ant-design 和 Element中的表单验证都是基于 async-validator 使用 async-validator 可以方便地构建表单验证逻辑&#xff0c;使得错误提示信息更加友好和…