内核版本
linux 2.6.32.2
配置内核的过程
配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程
执行该目标
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
复制代码
依赖目标
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
复制代码
$(build) 的作用
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
# 原文件中的注释已经说得很清楚了,这是一个执行特定 Makefile 的缩写
# 因此 $(Q)$(MAKE) $(build)=scripts/basic 可以转换为
# $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
# 即 make 执行 Makefile.build 这个文件
复制代码
Makefile.build 关键语句
这几句的目的是把 obj 记录的目录下的 Makefile include 进来,从而编译一些主机上运行的程序
# src := $(obj)
# The filename Kbuild has precedence over Makefile
# kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
# kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
# include $(kbuild-file)
复制代码
make menuconfig
现在回到原始目标上,make menuconfig 执行的指令如下
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
# 即主要是执行
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig
复制代码
同样的,它还会再次进入到 Makfile.build 文件中,并把 scripts/kconfig 目录下的 Makefile 包含进来,同时执行的目标变成了 menuconfig
scripts/kconfig/Makefile
对应的目标如下
ifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
# 实际是这个值,比如 arch/arm/Kconfig
Kconfig := arch/$(SRCARCH)/Kconfig
endif
menuconfig: $(obj)/mconf
$< $(Kconfig)
复制代码