正文
make xxx_config实质上就是调用了
首先看MKCONFIG:
【注意】SRCTREE=源文件下的目录
之后的语句:
@(MKCONFIG)
(@:_config=) arm arm920t EmbedSky NULL s3c2440就相当于执行
#mkconfig xxx arm arm920t EmbedSky NULL s3c2440
#0
1 23 4
5 $6
于是乎就开始执行mkconfig;
[ "${BOARD_NAME}" ] 就是指明xxxx,上面的实例为100ask24x0
这里就会执行echo “Configuring for 100ask24x0 board...”
(1)建立软链接
之后就会执行:
ln -s asm-arm asm
【注意】
建立一个链接文件,为什么这么做呢?
在源文件中调用:
#include <asm/type.h> //就相当于 include <asm-arm/type.h>
-------------------------------------------------------------------------
继续往下看:
同样生成asm-arm/proc文件。
(2)生成config.mk文件
生成config.mk文件:
echo "ARCH = $2" > config.mk //重定向
echo "CPU = $3" >> config.mk //追加到config.mk
echo "BOARD = $4" >> config.mk
之后由于5等于NULL,
6 = s3c2440,所以:
SOC = s3c24x0会定向到config.mk文件中;
config.mk内容:(在include文件夹中)
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
(3)生成config.h
在uboot中APPEND = no
所以执行else分支的语句;
config.h也是在include文件夹中;
所以在config.h中的语句是:
查看配置命令执行过程具体打印
make mx6qsabresdandroid_config V=1
make -f ./scripts/Makefile.build obj=scripts/basic 1
rm -f .tmp_quiet_recordmcount 2
make -f ./scripts/Makefile.build obj=scripts/kconfig mx6qsabresdandroid_config 3
scripts/kconfig/conf --defconfig=arch/../configs/mx6qsabresdandroid_defconfig Kconfig 4
执行过程分析
uboot顶层makefile
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
scripts_basic:
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/basic 1
$(Q)rm -f .tmp_quiet_recordmcount 2
outputmakefile:
ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree) source
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif
没有指定-O 参数,KBUILD_SRC为空,所以outputmakefile不执行
$(Q)$(MAKE) $(build)=scripts/kconfig $@
展开build得到
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig mx6qsabresdandroid_config 3
解析1命令
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/basic
script/Makefile.build
prefix := tpl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := spl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := .
endif
endif
src =scripts/basic =obj的参数
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)
先查看./scripts/basic/Kbuild是否存在。如果存在。返回./scripts/basic/Kbuild。否则返回./scripts/basic/Makefile
include ./scripts/basic/Makefile
会编译出fixdep
解析3命令
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig mx6qsabresdandroid_config
script/Makefile.build
同理也会展开
include ./scripts/kconfig/Makefile (该文件通过patch包打进uboot源码)
script/kconfig/Makefile
%_config: %_defconfig
@:
%_defconfig: $(obj)/conf
$(Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
展开得到
scripts/kconfig/conf --defconfig=arch/../configs/mx6qsabresdandroid_defconfig Kconfig 4
会先构建出conf
conf通过
conf_parse(Kconfig);来解析可选的配置信息,保存到一个链表中。
随后通过
conf_read(rpi_defconfig)读取默认的设置文件,并且生成新的配置文件
调用
conf_set_all_new_symbols更新关系链表
最后调用
conf_write写入到.config中