第十一章 U-boot 顶层 Makefile 详解 (make xxx_defconfig 过程)

2024-04-07 12:52

本文主要是介绍第十一章 U-boot 顶层 Makefile 详解 (make xxx_defconfig 过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

11.2.13 make xxx_defconfig 过程

        在编译 uboot 之前要使用“make xxx_defconfig”命令来配置 uboot,在顶层 Makefile 中有如下代码:

475 # To make sure we do not include .config for any of the *config
476 # targets catch them early, and hand them over to
477 # scripts/kconfig/Makefile It is allowed to specify more targets
478 # when calling make, including mixing *config targets and build
479 # targets.For example 'make oldconfig all'.
480 # Detect when mixed targets is specified, and make a second
481 # invocation of make so .config is not included in this case either(for *config).
482
483 version_h := include/generated/version_autogenerated.h
484 timestamp_h := include/generated/timestamp_autogenerated.h
485 defaultenv_h := include/generated/defaultenv_autogenerated.h
486
487 no-dot-config-targets := clean clobber mrproper distclean \
488 help %docs check% coccicheck \
489 ubootversion backup tests check qcheck
490
491 config-targets := 0
492 mixed-targets := 0
493 dot-config := 1
494
495 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
496    ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
497        dot-config := 0
498    endif
499 endif
500
501 ifeq ($(KBUILD_EXTMOD),)
502    ifneq ($(filter config %config,$(MAKECMDGOALS)),)
503         config-targets := 1
504         ifneq ($(words $(MAKECMDGOALS)),1)
505            mixed-targets := 1
506            endif
507    endif
508 endif
509
510 ifeq ($(mixed-targets),1)
511 # ==============================================================
512 # We're called with mixed targets (*config and build targets).
513 # Handle them one by one.
514
515 PHONY += $(MAKECMDGOALS) __build_one_by_one
516
517 $(filter-out __build_one_by_one, $(MAKECMDGOALS)):
__build_one_by_one
518    @:
519
520 __build_one_by_one:
521 $(Q)set -e; \
522 for i in $(MAKECMDGOALS); do \
523    $(MAKE) -f $(srctree)/Makefile $$i; \
524    done
525
526 else
527 ifeq ($(config-targets),1)
528 # ================================================================
529 # *config targets only - make sure prerequisites are updated, and
530 # descend in scripts/kconfig to make the *config target
531
532 KBUILD_DEFCONFIG := sandbox_defconfig
533 export KBUILD_DEFCONFIG KBUILD_KCONFIG
534
535 config: scripts_basic outputmakefile FORCE
536    $(Q)$(MAKE) $(build)=scripts/kconfig $@
537
538 %config: scripts_basic outputmakefile FORCE
539    $(Q)$(MAKE) $(build)=scripts/kconfig $@
540
541 else
542 # ================================================================
543 # Build targets only - this includes vmlinux, arch specific
544 # targets, clean targets and others. In general all targets except*config targets.
545
546 # Additional helpers built in scripts/
547 # Carefully list dependencies so we do not try to build scripts
548 # twice in parallel
549 PHONY += scripts
550 scripts: scripts_basic include/config/auto.conf
551    $(Q)$(MAKE) $(build)=$(@)
552
553 ifeq ($(dot-config),1)
554 # Read in config
555 -include include/config/auto.conf
......

        第 483 行定义了变量 version_h,这变量保存版本号文件,此文件是自动生成的。文件include/generated/version_autogenerated.h。
        第 484 行定义了变量 timestamp_h,此变量保存时间戳文件,此文件也是自动生成的。文件
include/generated/timestamp_autogenerated.h。
        第 487 行定义了变量 no-dot-config-targets。
        第 491 行定义了变量 config-targets,初始值为 0。
        第 492 行定义了变量 mixed-targets,初始值为 0。
        第 493 行定义了变量 dot-config,初始值为 1。
        第 495 行将 MAKECMDGOALS 中不符合 no-dot-config-targets 的部分过滤掉,剩下的如果
不为空的话条件就成立。 MAKECMDGOALS 是 make 的一个环境变量,这个变量会保存你所指
定的终极目标列表。如执行“make mx6ull_alientek_emmc_defconfig”,那么MAKECMDGOALS就为 mx6ull_alientek_emmc_defconfig。很明显过滤后为空,所以条件不成立,变量 dot-config 依旧为 1。
        第 501 行判断 KBUILD_EXTMOD 是否为空,如果 KBUILD_EXTMOD 为空的话条件成立,经过前面的分析,我们知道 KBUILD_EXTMOD 为空,所以条件成立。
        第 502 行将 MAKECMDGOALS 中不符合“config”和“%config”的部分过滤掉,如果剩下的部分不为空条件就成立,很明显此处条件成立,变量 config-targets=1。
        第 504 行统计 MAKECMDGOALS 中的单词个数,如果不为 1 的话条件成立。此处调用Makefile 中的 words 函数来统计单词个数,words 函数格式如下:

$(words <text>)

        很明显,MAKECMDGOALS 的单词个数是 1 个,所以条件不成立,mixed-targets 继续为0。综上所述,这些变量值如下:

config-targets = 1
mixed-targets = 0
dot-config = 1

        第 510 行如果变量 mixed-targets 为 1 的话条件成立,很明显,条件不成立。
        第 527 行如果变量 config-targets 为 1 的话条件成立,很明显,条件成立,执行这个分支。
        第 535 行,没有目标与之匹配,所以不执行。
        第 538 行,有目标与之匹配,当输入“make xxx_defconfig”的时候就会匹配到%config 目标,目标“%config”依赖于 scripts_basic、outputmakefile 和 FORCE。FORCE 在顶层 Makefile后面有如下定义:

2166 PHONY += FORCE
2167 FORCE:

        可以看出 FORCE 是没有规则和依赖的,所以每次都会重新生成 FORCE。当 FORCE 作为其他目标的依赖时,由于 FORCE 总是被更新过的,因此依赖所在的规则总是会执行的。依赖scripts_basic 和 outputmakefile 在顶层 Makefile 中的内容如下:

455 # Basic helpers built in scripts/
456 PHONY += scripts_basic
457 scripts_basic:
458     $(Q)$(MAKE) $(build)=scripts/basic
459     $(Q)rm -f .tmp_quiet_recordmcount
460
461 # To avoid any implicit rule to kick in, define an empty command.
462 scripts/basic/%: scripts_basic ;
463
464 PHONY += outputmakefile
465 # outputmakefile generates a Makefile in the output directory, if
466 # using a separate output directory. This allows convenient use of
467 # make in the output directory.
468 outputmakefile:
469 ifneq ($(KBUILD_SRC),)
470     $(Q)ln -fsn $(srctree) source
471     $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
472         $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
473 endif

        第 469 行 , 判断 KBUILD_SRC 是 否 为空 , 只有变 量 KBUILD_SRC 不空时,outputmakefile 才有意义,经过我们前面的分析 KBUILD_SRC 为空,所以 outputmakefile 无效。只有 scripts_basic 是有效的。
        第 457~459 行是 scripts_basic 的规则,其对应的命令用到了变量 Q、MAKE 和 build,其中

Q=@或为空
MAKE=make

        变量 build 是在 scripts/Kbuild.include 文件中有定义:

178 ###
179 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
180 # Usage:
181 # $(Q)$(MAKE) $(build)=dir
182 build := -f $(srctree)/scripts/Makefile.build obj

        从示例代码 11.2.13.4 可以看出 build=-f $(srctree)/scripts/Makefile.build obj,经过前面的分析可知,变量 srctree 为”.”,因此:

build=-f ./scripts/Makefile.build obj

        scripts_basic 展开以后如下:

scripts_basic:
@make -f ./scripts/Makefile.build obj=scripts/basic //也可以没有@,视配置而定
@rm -f . tmp_quiet_recordmcount
//也可以没有@

        scripts_basic 会调用文件./scripts/Makefile.build,这个我们后面再分析。接着回到示例代码 中的%config 处,内容如下:

%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@

将命令展开就是:

@make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

        同样也跟文件./scripts/Makefile.build 有关,我们后面再分析此文件。使用如下命令配置 uboot,并观察其配置过程:

make stm32mp15_atk_defconfig V=1

配置过程如图 所示:

 从图 11.2.13.1 可以看出,我们的分析是正确的,接下来就要结合下面两行命令重点分析一下文件 scripts/Makefile.build。
1、scripts_basic 目标对应的命令
                @make -f ./scripts/Makefile.build obj=scripts/basic
2、%config 目标对应的命令
                @make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

这篇关于第十一章 U-boot 顶层 Makefile 详解 (make xxx_defconfig 过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

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

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

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

如何在 Spring Boot 中实现 FreeMarker 模板

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

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

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

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