(二)openwrt make kernel_menuconfig流程分析
在上一篇文章“(一)openwrt make menuconfig流程分析”中,我们分析了make menuconfig的流程,在配置菜单中,我们并没有看到kernel相关的配置,这是因为在openwrt中,我们想要配置内核的话,需要使用make kernel_menuconfig命令。我们将通过分析这个命令执行的流程,看看它具体做了哪些工作。下面是我总结的分析过程,希望与大家分享,共同学习,共同成长,其中可能会有一些理解不正确的地方,还望各位不吝指教,谢谢,^_^。
当我们在顶层目录输入make kernel_menuconfig时,由于指定的目标为kernel_menuconfig,所以make会去寻找文件中kernel_menuconfig所在的地方,然后去执行其相应规则。同menuconfig目标一样,我们可以看到,kernel_menuconfig目标也在$(TOPDIR)/include/toplevel.mk中,下面是它的依赖和规则。其中$(TOPDIR)就是顶层目录,定义在主Makefile中TOPDIR:=${CURDIR}。
kernel_menuconfig: prepare_kernel_conf
$(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig
1 kernel_menuconfig的依赖目标prepare_kernel_conf
第1行,依赖目标prepare_kernel_conf的定义在$(TOPDIR)/include/toplevel.mk中:
prepare_kernel_conf: .config FORCE
ifeq ($(wildcard staging_dir/host/bin/quilt),)
prepare_kernel_conf:
@+$(SUBMAKE) -r tools/quilt/install
else
prepare_kernel_conf: ;
endif
下面对各依赖目标和规则进行分析。
1.1 prepare_kernel_conf的依赖目标.config
.config定义在$(TOPDIR)/include/toplevel.mk中:
ifeq ($(FORCE),)
.config scripts/config/conf scripts/config/mconf: tmp/.prereq-build
endif
.config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo)
@+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
[ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
$(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \
fi
1)第1~3行,默认FORCE是等于空的,所以这里的if条件成立,即.config依赖于tmp/.prereq-build,我们看一下
tmp/.prereq-build的定义:
tmp/.prereq-build: include/prereq-build.mk
mkdir -p tmp
rm -f tmp/.host.mk
@$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \
echo "Prerequisite check failed. Use FORCE=1 to override."; \
false; \
}
touch $@
下面分析tmp/.prereq-build的依赖目标和规则。
1.1)第1~3行,tmp/.prereq-build依赖include/prereq-build.mk文件,创建tmp目录,删除tmp/.host.mk。
1.2)第4~7行,执行prereq-build.mk文件,用于检查一些必备条件是否准备好,例如下面列出的检查项,如果检查失败,则打印后面“Prerequisite check ...”信息。
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
...
1.3)第8行,检查完后,创建tmp/.prereq-build文件。
2)第5~9行,继续来看简化一下如下:
.config: ./scripts/config/conf prepare-tmpinfo
@+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
[ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
make menuconfig; \
fi
第5行,./scripts/config/conf依赖目标的分析可参考“(一)openwrt make menuconfig流程分析”文章中scripts/config/mconf。CONFIG_HAVE_DOT_CONFIG变量的值为空,所以if条件不成立,得到prepare-tmpinfo依赖条件,该依赖条件的分析也在“(一)openwrt make menuconfig流程分析”文章中有讲到。
第6~9行,这里的规则只有一个if条件语句,其表示如果顶层目录下不存在.config文件,或存在.config,但是该文件中没找到CONFIG_HAVE_DOT_CONFIG,则if条件成立,那将会执行make menuconfig命令;否则该规则什么也不做。