Makefile学习笔记20|u-boot顶层Makefile06

2024-05-29 11:04

本文主要是介绍Makefile学习笔记20|u-boot顶层Makefile06,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Makefile学习笔记20|u-boot顶层Makefile06

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

  这里是目录

配置规则

  如无必要,勿增实体。下面的分析都将基于 PYTHON_ENABLE=n 进行!!!

# This is y if U-Boot should not build any Python tools or libraries. Typically
# you would need to set this if those tools/libraries (typically binman and
# pylibfdt) cannot be built by your environment and are provided separately.
ifeq ($(NO_PYTHON),)
PYTHON_ENABLE=y
endif# ===========================================================================
# Rules shared between *config targets and build targets# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:$(Q)$(MAKE) $(build)=scripts/basic$(Q)rm -f .tmp_quiet_recordmcount# To avoid any implicit rule to kick in, define an empty command.
scripts/basic/%: scripts_basic ;PHONY += outputmakefile
# outputmakefile generates a Makefile in the output directory, if using a
# separate output directory. This allows convenient use of make in the
# output directory.
outputmakefile:
ifneq ($(KBUILD_SRC),)$(Q)ln -fsn $(srctree) source$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree)
endif
  1. scripts_basic:

这是一个 Makefile 规则,用于构建 scripts/basic 目录下的辅助工具。 ( Q ) 可能是一个隐藏命令输出的变量, (Q) 可能是一个隐藏命令输出的变量, (Q)可能是一个隐藏命令输出的变量,(MAKE) 是 make 的递归调用,$(build) 传递给这个递归 make 的参数。
该规则还包含一个删除文件 .tmp_quiet_recordmcount 的命令,该文件可能是之前构建步骤中生成的。

  1. To avoid any implicit rule...:

这条注释下面的规则定义了一个空命令,用来预防任何隐式规则生效。通常当定义了模式规则而且不想要任何默认的规则生效时会这么做。

  1. outputmakefile:

这个规则负责生成一个 Makefile 到输出目录,在使用单独的输出目录时,这样做可以方便在输出目录使用 make 命令。
如果设置了 KBUILD_SRC,表示我们在不同于源目录的地方进行构建,它会创建一个到源码树的软链接 source,然后调用 scripts/mkmakefile 脚本生成 Makefile。

  这些规则和变量定义是构建系统的一部分,确保 Makefile 能够适应不同的构建环境和工具链配置,同时保持构建过程的灵活性和可维护性。

多目标处理

# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
# mixing *config targets and build targets.
# For example 'make oldconfig all'.
# Detect when mixed targets is specified, and make a second invocation
# of make so .config is not included in this case either (for *config).version_h := include/generated/version_autogenerated.h
timestamp_h := include/generated/timestamp_autogenerated.h
defaultenv_h := include/generated/defaultenv_autogenerated.h
dt_h := include/generated/dt.h
env_h := include/generated/environment.hno-dot-config-targets := clean clobber mrproper distclean \help %docs check% coccicheck \ubootversion backup tests check pcheck qcheck tcheck \pylint pylint_err _pip pip pip_test pip_releaseconfig-targets := 0
mixed-targets  := 0
dot-config     := 1ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)dot-config := 0endif
endififeq ($(KBUILD_EXTMOD),)ifneq ($(filter config %config,$(MAKECMDGOALS)),)config-targets := 1ifneq ($(words $(MAKECMDGOALS)),1)mixed-targets := 1endifendif
endif

  定义一些文件变量:version_h 和其他变量被设置成生成文件的路径,这些文件在构建过程中会由相应的脚本创建。我们输入的命令是 make TQM823L_defconfig,那么 config-targets = 1,mixed-targets = 0,dot-config = 1。

*config 处理

  这些规则专门用于处理如 menuconfig, defconfig 和其他类似的配置界面,这些界面提供了一个用户友好的接口来修改内核的 .config 文件。

# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config targetKBUILD_DEFCONFIG := sandbox_defconfig
export KBUILD_DEFCONFIG KBUILD_KCONFIGconfig: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@%config: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@
  1. KBUILD_DEFCONFIG:

KBUILD_DEFCONFIG 变量设置了默认的配置文件名称。如果没有通过命令行给出特定的配置(例如,make x86_defconfig),则会使用此默认配置。
在这里,它默认设置为 sandbox_defconfig。我们这里应该是 TQM823L_defconfig。

  1. config 目标:

config 目标用于运行单一的 config 配置目标,它有三个先决条件:scripts_basic, outputmakefile, 和 FORCE。
scripts_basic 是一个 PHONY 规则,它确保在 scripts/basic 目录下的脚本被构建。
outputmakefile 生成输出(构建)目录中的 Makefile,这允许在输出目录中直接使用 make 命令。
FORCE 是一个总是会执行的 phony 目标,确保这个规则总是运行。

  1. %config 目标:

这是一个模式规则,%config 匹配所有以 config 结尾的目标(比如 menuconfig, oldconfig, 等)。
像 config 一样,它依赖于 scripts_basic, outputmakefile, 和 FORCE 目标。

  1. (𝑄) (MAKE) (𝑏𝑢𝑖𝑙𝑑)=𝑠𝑐𝑟𝑖𝑝𝑡𝑠/𝑘𝑐𝑜𝑛𝑓𝑖𝑔 $@

这行是用于执行实际的配置规则。 ( Q ) 是用于控制 m a k e 输出的变量, (Q) 是用于控制 make 输出的变量, (Q)是用于控制make输出的变量,(MAKE) 代表 make 工具的调用。
$(build)=scripts/kconfig 是一种传递给 make 的参数,指示 make 运行 scripts/kconfig 目录下的 Makefile 。
$@ 是 Makefile 的自动变量,代表当前目标的名称。

结尾

  没想到Makefile接下来一个 ifeq ($(config-targets),1) 就就到结尾了。。。

PHONY += FORCE
FORCE:# Declare the contents of the PHONY variable as phony.  We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)
  1. PHONY += FORCE

这行代码将 FORCE 目标添加到 .PHONY 特殊变量 PHONY 中。.PHONY 列表包含了不代表文件的目标;无论文件是否存在,这些目标总是会被执行。这个做法用于确保对应的规则不受文件存在与否的影响。

  1. FORCE:

这里定义了一个标签为 FORCE 的规则。由于它没有命令序列,这个规则是空的。在 Makefile 中,空规则用于作为依赖,以确保直接或间接依赖于该规则的目标每次都会被执行,即使它们没有文件修改也是如此。

  1. .PHONY: $(PHONY)

.PHONY 是一个特殊的内置目标,用于告诉 Make 哪些目标是“phony”(伪目标),即不与文件相关联的目标。
本行将 PHONY 变量中定义的所有目标声明为 phony 目标。该变量被视为 Makefile 的一个集中方式来声明这些 phony 目标,以确保不论是否存在与目标同名的文件,目标都会被执行。
这最常用于 all, clean, distclean 等,以及在我们的例子中的 FORCE。

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

这篇关于Makefile学习笔记20|u-boot顶层Makefile06的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013485

相关文章

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.