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

相关文章

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs