makefile_分析_%config

%config 分析

本章节带你分析 %config 目标

什么是 %config

定义在顶层 makefile 的目标
用于生成 .config 文件
会匹配所有 config 结尾的 make 目标参数

# 案例
make mx6ull_14x14_evk_defconfig
# mx6ull_14x14_evk_defconfig 结尾 config
# 匹配并执行 %config 目标

为什么要分析 %config

.config 文件是 kconfig 系统的产物
uboot 使用 kconfig 系统控制代码编译
实现模块化编译
因此
了解 .config 文件生成非常重要

分析 %config

  • 简单分析
    简单阅读下 %config 规则
%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@
# %config 匹配 config 结尾的 make 参数
# scripts_basic outputmakefile FORCE 依赖
# 构建 %config 前会按照从左到右的顺序构建依赖
# $@ 自动替换为规则目标

简单了解即可
因为递归调用的原因
阅读 makefile 并不能知道执行顺序
现在使用 --trace 参数构建配合 grpe 筛选
快速了解 gnu_make 调用了哪些目标

## 命令  
- 设置环境变量  
export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  

- 生成配置  
make distclean  
clear  
make --trace -j12 mx6ull_14x14_evk_defconfig | grep "更新" > log.txt  
> make distclean 清空缓存  
> clear 清空终端  
> --trace 输出`调用目标 && 构建命令`  
> -j12 十二线程编译  
> mx6ull_14x14_evk_defconfig 匹配 %config 目标  
> | shell管道,左侧命令的标准输出,作为右侧命令的标准输入  
> grep "更新" 使用 grep 命令筛选出带有更新关键词的输出
> > log.txt 输出重定向到 log.txt 文件
输出目标

Makefile:618:更新“scripts_basic”,因为:目标为 .PHONY
scripts/Makefile.host:98:更新“scripts/basic/fixdep”,因为:目标不存在
scripts/Makefile.build:483:更新“__build”,因为:目标为 .PHONY
Makefile:700:更新“mx6ull_14x14_evk_defconfig”,因为:目标不存在
scripts/Makefile.host:115:更新“scripts/kconfig/conf.o”,因为:目标不存在
scripts/Makefile.host:17:更新“scripts/kconfig/zconf.tab.c”,因为:目标不存在
scripts/Makefile.host:9:更新“scripts/kconfig/zconf.lex.c”,因为:目标不存在
scripts/Makefile.host:115:更新“scripts/kconfig/zconf.tab.o”,因为:目标不存在
scripts/Makefile.host:107:更新“scripts/kconfig/conf”,因为:目标不存在
scripts/kconfig/Makefile:96:更新“mx6ull_14x14_evk_defconfig”,因为:目标不存在

带有 "目标为 .PHONY" 的目标是伪目标(执行操作,不生成文件)
带有 "目标不存在" 的目标是文件目标(生成文件)

文件目标的更新是生成文件
伪目标的更新是执行操作

log.txt 列出了所有调用目标
并且列出了目标对应的makefile_文件,规则行号,目标名称
有了这些信息我们就能开始分析了

  • target: scripts_basic
# 输出: Makefile:618:更新“scripts_basic”,因为:目标为 .PHONY
# 文件: Makefile
# 目标: scripts_basic
scripts_basic:
	$(Q)$(MAKE) $(build)=scripts/basic
# 第一个调用是 scripts_basic 并不意外
# %config 的第一个依赖就是 scripts_basic
# 分析 scripts_basic 干了什么
# 就必须知道 $(var)(变量引用) 对应的值
# 想要知道变量值可以找定义
# 但是 uboot makefile 很庞大
# 顶层 makefile 接近 3000
# 子级 makefile 接近 2000
# 以行为单位找是不可能的
# 必须使用聪明的办法

菜单

posted @ 2026-09-28 16:46  宋嘉琪  阅读(1)  评论(0)    收藏  举报