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 + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

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

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

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1