Linux内核Makefile中menuconfig等配置目标的运行机制解析
Linux内核配置类make目标的执行逻辑
- 你在顶层
./Makefile里找不到menuconfig、oldconfig这类目标定义,全局grep硬编码的menuconfig:目标也搜不到,核心原因是这类目标根本不是静态硬编码写死在Makefile里的,是通过GNU Make的模式规则+Kbuild动态引入的规则文件实现的。 - 具体执行流程:
- 顶层Makefile启动后会先识别传入的目标类型,只要目标名以
config结尾(所有配置类目标都遵循这个命名规则),就会跳过常规内核编译的逻辑分支,通过include指令动态加载scripts/kconfig/Makefile中的Kconfig专属构建规则——这也是你在顶层Makefile里找不到相关定义的直接原因,配置相关的规则本来就不在根目录Makefile中。 scripts/kconfig/Makefile里没有为每个配置目标单独写规则,而是定义了一个通用模式规则:
这里的%config: scripts_basic FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@%是GNU Make的通配符,可匹配任意长度字符串,所以不管你执行make menuconfig、make oldconfig、make defconfig还是其他任意xxxconfig目标,都会匹配到这个通用规则,这就是你搜固定目标字符串找不到结果的核心原因。- 规则里的
$(build)=scripts/kconfig是Kbuild封装的通用构建宏,作用是进入scripts/kconfig目录执行构建,$@是Make内置自动变量,会自动替换成你传入的实际目标名(比如menuconfig)。后续脚本会根据目标名拉起对应的配置前端:menuconfig会编译启动基于ncurses的文本交互程序mconf,oldconfig会启动命令行配置更新工具conf,xconfig会编译启动Qt编写的图形配置程序qconf,最终完成内核配置的生成、更新流程。
- 顶层Makefile启动后会先识别传入的目标类型,只要目标名以
- 要验证这个逻辑很简单,执行
make -p | grep -B2 -A5 '%config'即可,这个命令会打印make加载完所有包含文件、展开所有规则和变量后的完整内部数据库,能直接看到所有config类目标对应的实际执行规则。 - 所有这类配置目标都被声明为
.PHONY伪目标,就算源码目录下碰巧存在同名文件,make也会正常执行配置逻辑,不会把目标误判为需要编译的本地文件。
内容的提问来源于stack exchange,提问作者dustin2022
相关产品推荐
相关产品推荐

