Makefile学习笔记18|u-boot顶层Makefile04

Makefile学习笔记18|u-boot顶层Makefile04

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

  这里是目录

C语言标准

# With the move to GCC 6, we have implicitly upgraded our language
# standard to GNU11 (see https://gcc.gnu.org/gcc-5/porting_to.html).
# Some Linux distributions (including RHEL7, SLES13, Debian 8) still
# have older compilers as their default, so we make it explicit for
# these that our host tools are GNU11 (i.e. C11 w/ GNU extensions).
CSTD_FLAG := -std=gnu11
KBUILD_HOSTCFLAGS += $(CSTD_FLAG)ifeq ($(HOSTOS),cygwin)
KBUILD_HOSTCFLAGS	+= -ansi
endif

  CSTD_FLAG 变量被显式设置为 -std=gnu11,指定编译宿主机工具时使用 GNU11 标准。这通常是为了确保代码使用最新的语言特性。KBUILD_HOSTCFLAGS 是一个在构建过程中传递给宿主机编译器的标志集合。会加入前面定义好的 CSTD_FLAG,确保所有宿主机编译的 C 代码都采用 GNU11 标准。如果宿主操作系统是 Cygwin,本段代码通过添加 -ansi 标志来调整 KBUILD_HOSTCFLAGS。-ansi 标志告诉 GCC 使用 ANSI C 标准,也就是 C89 标准。这可能因为这些特定版本的 Cygwin 上的 GCC 默认不支持 GNU11 或者是为了解决特定兼容性问题。

适配MAC OS

# Mac OS X / Darwin's C preprocessor is Apple specific.  It
# generates numerous errors and warnings.  We want to bypass it
# and use GNU C's cpp.	To do this we pass the -traditional-cpp
# option to the compiler.  Note that the -traditional-cpp flag
# DOES NOT have the same semantics as GNU C's flag, all it does
# is invoke the GNU preprocessor in stock ANSI/ISO C fashion.
#
# Apple's linker is similar, thanks to the new 2 stage linking
# multiple symbol definitions are treated as errors, hence the
# -multiply_defined suppress option to turn off this error.
#
ifeq ($(HOSTOS),darwin)
# get major and minor product version (e.g. '10' and '6' for Snow Leopard)
DARWIN_MAJOR_VERSION	:= $(shell sw_vers -productVersion | cut -f 1 -d '.')
DARWIN_MINOR_VERSION	:= $(shell sw_vers -productVersion | cut -f 2 -d '.')os_x_before	= $(shell if [ $(DARWIN_MAJOR_VERSION) -le $(1) -a \$(DARWIN_MINOR_VERSION) -le $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)os_x_after = $(shell if [ $(DARWIN_MAJOR_VERSION) -ge $(1) -a \$(DARWIN_MINOR_VERSION) -ge $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)# Snow Leopards build environment has no longer restrictions as described above
HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
KBUILD_HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
KBUILD_HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")# macOS Mojave (10.14.X)
# Undefined symbols for architecture x86_64: "_PyArg_ParseTuple"
KBUILD_HOSTLDFLAGS += $(call os_x_after, 10, 14, "-lpython -dynamclib", "")
endif

  这些设置帮助构建系统适配在 macOS 各个版本上的差异,确保构建过程能够在各种 macOS 环境中顺利执行。尤其在系统的默认编译器和链接器在行为上存在变化的情况下(比如,Apple 从使用 GCC 切换至 clang)。我不使用 MAC OS,这里就只是粗略地看一下。

size_check函数

# Check ths size of a binary:
# Args:
#   $1: File to check
#   #2: Size limit in bytes (decimal or 0xhex)
define size_checkactual=$$( wc -c $1 | awk '{print $$1}'); \limit=$$( printf "%d" $2 ); \if test $$actual -gt $$limit; then \echo "$1 exceeds file size limit:" >&2; \echo "  limit:  $$(printf %#x $$limit) bytes" >&2; \echo "  actual: $$(printf %#x $$actual) bytes" >&2; \echo "  excess: $$(printf %#x $$((actual - limit))) bytes" >&2;\exit 1; \fi
endef
export size_check

  这段代码定义了一个 Makefile 函数 size_check,用于检查一个给定文件的大小是否超过了指定的大小限制。如果文件大小超出限制,它将打印错误信息并退出构建过程。函数通过传递参数被调用,其中 $1 是要检查的文件的路径,$2 是大小上限(以字节为单位,可以是十进制或十六进制形式)。让我们详细解析这个函数的工作流程:

  1. actual=$( wc -c $1 | awk '{print $1}');

这个命令使用 wc(word count)工具计算文件 $1 的字节大小,然后通过 awk 提取字节计数。

  1. limit=$( printf "%d" $2 );

使用 printf 将大小限制 $2 转换成十进制形式。这样做允许函数接受诸如 “0x10000”(十六进制)这样的输入参数。

  1. if test $actual -gt $limit; then

这里用 if 测试实际文件大小( a c t u a l )是否大于限制( actual)是否大于限制( actual)是否大于限制(limit)。如果超出限制,则执行 then 分支。

  1. echo "$1 exceeds file size limit:" >&2; ...

如果文件超出了大小限制,在标准错误输出中打印出有关信息。>&2 重定向输出到标准错误,这是一种常见的做法,旨在确保错误信息被正确地捕获和显示。

  1. exit 1;

因为超出了大小限制,故退出构建过程并返回状态码 1 来表示错误。

包含通用定义

# We need some generic definitions (do not try to remake the file).
scripts/Kbuild.include: ;
include scripts/Kbuild.include

  定义 scripts/Kbuild.include 为一个空规则。在这种情况下,随后紧跟分号的目标意味着 Make 不应该尝试去构建这个文件——即使它不存在或者需要更新。这通常被用来防止含有 Makefile 规则的文件在每次 make 命令运行时被重新创建或下载。

scripts/Kbuild.include

# Kconfig helper macros# Convenient variables
comma       := ,
quote       := "
squote      := '
empty       :=
space       := $(empty) $(empty)
dollar      := $
right_paren := )
left_paren  := (# $(if-success,<command>,<then>,<else>)
# Return <then> if <command> exits with 0, <else> otherwise.
if-success = $(shell,{ $(1); } >/dev/null 2>&1 && echo "$(2)" || echo "$(3)")# $(success,<command>)
# Return y if <command> exits with 0, n otherwise
success = $(if-success,$(1),y,n)# $(cc-option,<flag>)
# Return y if the compiler supports <flag>, n otherwise
cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)# $(cc-define,<macro>)
# Return y if the compiler defines <macro>, n otherwise
cc-define = $(success,$(CC) -dM -E -x c /dev/null | grep -q '^#define \<$(1)\>')# $(ld-option,<flag>)
# Return y if the linker supports <flag>, n otherwise
ld-option = $(success,$(LD) -v $(1))# gcc version including patch level
gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh -p $(CC) | sed 's/^0*//')

  scripts/Kbuild.include 中用宏定义了一些符号,还定义了几个Makefile宏。

  1. $(if-success,<command>,<then>,<else>):

这个宏执行一个 shell 命令 ,并根据命令执行的退出状态来返回 或 。如果 成功执行(退出状态为 0),则返回 ,否则返回 。

  1. $(success,<command>):

这个宏使用 $(if-success,…) 来检测 是否成功执行,返回 ‘y’ 或 ‘n’。

  1. $(cc-option,<flag>):

检测编译器(通常是 GCC)是否支持某个标志 。如果编译器支持,则返回 ‘y’,不支持则返回 ‘n’。

  1. $(cc-define,<macro>):

检测编译器是否预定义了一个宏 ,如果是则返回 ‘y’,否则返回 ‘n’。

  1. $(ld-option,<flag>):

检测链接器(LD)是否支持某个命令行标志 ,如果支持,则返回 ‘y’,不支持则返回 ‘n’。

  1. gcc-version:

使用 scripts/gcc-version.sh 脚本来获得 GCC 编译器的版本信息,包括次要修订号。使用 sed 来移除版本号前的任何零。

scripts/gcc-version.sh

if [ "$1" = "-p" ] ; thenwith_patchlevel=1;shift;
ficompiler="$*"if [ ${#compiler} -eq 0 ]; thenecho "Error: No compiler specified."printf "Usage:\n\t$0 <gcc-command>\n"exit 1
fiMAJOR=$(echo __GNUC__ | $compiler -E -x c - | tail -n 1)
MINOR=$(echo __GNUC_MINOR__ | $compiler -E -x c - | tail -n 1)
if [ "x$with_patchlevel" != "x" ] ; thenPATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -x c - | tail -n 1)printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
elseprintf "%02d%02d\\n" $MAJOR $MINOR
fi

  这个脚本用于确定 GCC 编译器的版本号。它接收一个或多个参数,第一个参数可以是 -p 选项,用于决定是否输出 patchlevel(修订版号);剩余的参数应该是编译器的命令,如 gcc 或 arm-none-eabi-gcc。

  1. 处理 -p 选项:

脚本首先检查第一个参数是否为 -p,如果是,设置 with_patchlevel 变量的值为 1(这表示用户要求输出 patchlevel),然后通过 shift 命令移除这个参数。

  1. 验证编译器参数:

脚本接着检查是否提供了编译器命令,如果没有提供,打印错误信息并退出。

  1. 获取版本号:

使用 $compiler(编译器命令)执行预处理操作 -E,处理伪代码中的宏定义 GNUCGNUC_MINOR,以便提取 GCC 的主要和次要版本号。
如果用户使用了 -p 参数,则同样提取 GNUC_PATCHLEVEL 宏定义以获取 patchlevel。

  1. 格式化输出:

使用 printf 格式化输出版本号。它保证主要和次要版本号都是两位数字。如果用户请求 patchlevel,则以同样的方式保证它也是两位数字。
格式化的结果是一个六位数,例如 “049801” 表示 GCC 4.9.1 或四位数 “0409” 表示 GCC 4.9。
5. 输出版本号:

格式化后的版本号被打印到标准输出。

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

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

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

相关文章

WordPress--解决迁移后页面404(打不开)的问题

原文网址&#xff1a;WordPress--解决迁移后页面404的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍WordPress迁移后部分页面404(打不开)的解决方案。 方案&#xff1a;修改固定链接 简介 要在刚建好网站&#xff0c;还没导入数据之前修改固定链接&#xff0c;否则可能导…

【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)

背景需求&#xff1a; 【教学类-58-04】黑白三角拼图04&#xff08;2-10宫格&#xff0c;每个宫格随机1张-6张&#xff0c;带空格纸&#xff0c;1页6张黑白&#xff0c;1张6张白卡&#xff09;-CSDN博客文章浏览阅读582次&#xff0c;点赞16次&#xff0c;收藏3次。【教学类-58…

Mac安装pytorch

先下载 Anaconda | The Operating System for AI 网速慢&#xff0c;用中国大陆镜像&#xff1a;NJU Mirror 之前装python3时用的是pip3&#xff0c;这里说一下这pip与conda的区别 Conda和pip都是Python包管理工具&#xff0c;用于安装和管理Python包 包管理范围&#xff1a…

汽车数据应用构想(一)

自从电动汽车GB/T32960标准颁布&#xff0c;要求所有电动汽车必须上传数据开始&#xff0c;各车厂就开始花费大量的人力物力&#xff0c;用于数据的上传与存储。同时随着智能化、网联化的趋势&#xff0c;不断丰富上传数据的内容与数量。数据已成为车厂的重要资产&#xff0c;但…

Day16

Day16 一、迭代器 深入迭代器-foreach的底层 for (String element : list) {System.out.println(element);}底层&#xff1a; //使用foreach循环遍历集合的底层实现&#xff1a;String element;for(Iterator it list.iterator();it.hasNext();System.out.println(element))e…

微服务:eureka的搭建,以及服务注册、服务发现、负载均衡

eureka 搭建 新建一个Module,maven项目&#xff0c;导入依赖。 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><…

月入10万+管道收益,揭秘旅游卡运营的5个阶段!

网上的项目确实繁多&#xff0c;只要深入研究&#xff0c;总能找到适合自己的赚钱方式。在互联网上运营&#xff0c;关键在于理解其底层逻辑。旅游卡项目&#xff0c;就是一个能实现月入10万的实例。接下来&#xff0c;我将为你揭密旅游卡运营的5个阶段&#xff1a; 1、先赚成…

24年湖南教资认定即将开始,别被照片卡审!

24年湖南教资认定即将开始&#xff0c;别被照片卡审&#xff01;

Jenkins 流水线(Pipeline)详解

大家好&#xff0c;Jenkins 流水线&#xff08;Pipeline&#xff09;是一种可编排的持续集成和交付&#xff08;CI/CD&#xff09;方法&#xff0c;它以代码的方式定义整个软件开发过程中的构建、测试和部署流程。接下来就跟大家分享一下Jenkins 流水线&#xff08;Pipeline&am…

2024年5月26日 (周日) 叶子游戏新闻

资深开发者&#xff1a;3A游戏当前处于一种尴尬的中间地带游戏行业整体&#xff0c;尤其是3A游戏正处于艰难时期。尽管2023年3A游戏佳作频出&#xff0c;广受好评&#xff0c;但居高不下的游戏开发成本&#xff08;传闻《漫威蜘蛛侠2》的制作成本高达3亿美元&#xff09;正严重…

【机器学习结合AI绘画工具】——开启艺术创作的新纪元

目录 一、AI绘画工具的发展历程 二、AI绘画工具的技术原理 实例说明 三、AI绘画工具在艺术创作中的应用 实例网站 四、AI绘画工具的影响与未来展望 结论 机器学习和人工智能&#xff08;AI&#xff09;在过去的十年里取得了显著的进展。特别是在艺术创作领域&#xff0c…

【笔记】太久没有写selenium了

以前qyqt和selenium用来开发一个自动化测试工具&#xff0c;现在回忆一下已经过了将近6年。 DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() 例如&#xff1a;find_element_by_xpath改为web.find_element(By.XPATH from seleniu…

excel表格写存神器--xlwt

原文链接&#xff1a;http://www.juzicode.com/python-tutorial-xlwt-excel 在 Python进阶教程m2d–xlrd读excel 中我们介绍了Excel表格的读取模块xlrd&#xff0c;今天这篇文章带大家了解Excel表格写存模块xlwt。他俩名字相近都以Excel的简写xl开头&#xff0c;rd是read的简写…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

金融序列的布朗运动

https://zhuanlan.zhihu.com/p/659164160 python金融衍生品定价系列之一 —— 布朗运动与伊藤公式 导语:网络上和书本上关于期权定价相关的内容已经较为丰富,但将理论和python代码结合起来讲的却很少,这也是python金融衍生品定价系列的写作初衷,在用python实现相关模型的同…

Rating 计算公式

Rating ⁡ \operatorname{Rating} Rating 计算公式一般有多种&#xff0c;具体公式取决于使用情境和数据结构。 常用的环形排序算法的Rating计算公式是&#xff1a; Rating ⁡ R K ( P − E ) \operatorname{Rating} R K\times(P -E) RatingRK(P−E)其中&#xff0c; R …

春秋云境CVE-2018-20604

简介 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发&#xff0c;适合各类视频、影视网站的影视内容管理程序&#xff0c;该CMS存在缺陷&#xff0c;可以通过 admin.php?s/Template/edit/path/*web*..*..*..*..*1.txt 的方式读取任意文件。 正文 1.进入靶场 2./admin…

AI学习指南数学工具篇-凸优化在支持向量机(SVM)中的应用

AI学习指南数学工具篇-凸优化在支持向量机&#xff08;SVM&#xff09;中的应用 在机器学习领域中&#xff0c;支持向量机&#xff08;SVM&#xff09;是一种经典的监督学习算法。SVM通过寻找最佳的超平面来进行分类&#xff0c;其优化核心是基于凸优化理论。本文将详细介绍凸…

【数据结构】二叉树-堆(上)

个人主页~ 二叉树-堆 一、树的概念及结构1、概念2、相关概念3、树的表示4、树的实际应用 二、二叉树的概念和结构1、概念2、特殊二叉树3、二叉树的性质4、二叉树的存储结构&#xff08;1&#xff09;顺序存储&#xff08;2&#xff09;链式存储 三、二叉树的顺序结构以及实现1、…

【C++】——入门基础知识超详解

目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式&#xff1a; 注意事项 3. C输入&输出 示例 1&#xff1a;基本输入输出 示例 2&#xff1a;读取多个值 示例 3&#xff1a;处理字符串输入 示例 4&#xff1a;读…