make XXX_defconfig
我们编译u-boot,一般第一步使用make xxx_config,现在来分析下这个makefile目标的执行
首先在源码目录下Makefile中,找到这个目标
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
这个目标依赖与三个目标,scripts_basic outputmakefile FORCE
- scrpts_basic
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
$(Q)rm -f .tmp_quiet_recordmcount
此目标的命令中,其他的都好理解,但是$(build)=scripts/basic
令人困惑。从语法上来看,build应该是一个makefile变量,搜索源码目录下Makefile,未见到此变量的声明,所以其应该在包含的makefile文件中,make也没有此内置的变量。
在scripts/Kbuild.include中找到此变量,
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(srctree)/scripts/Makefile.build obj
其中srctree一般为.
,所以
build := -f ./scripts/Makefile.build obj
$(Q)$(MAKE) $(build)=scripts/basic
可被替换为
$(Q)$(MAKE) -f ./scripts/Makefile.build obj=scripts/basic
这样,相当于执行make命令,指定makefile文件为./scripts/Makefile.build,传入参数为obj=scripts/basic
scripts/Makefile.build这个文件我们就不展开讲了,这个文件主要是调用目标目录的Makefile
进入到scripts/basic目录下,
fixdep fixdep.c Makefile
只有三个文件,可见此目录下,只是生成fixdep工具,那么这个工具是用来干什么的,我们暂不分析,给出结论
Usage: fixdep <depfile> <target> <cmdline>
编译时,编译器会根据选项-MD自动生成依赖文件*.d,用fixdep更新*.d文件生成新的依赖格式
- outputmakefile
outputmakefile:
空目标,暂不考虑
- FROCE
FORCE:
这是一个空目标,凡是依赖于这个目标的目标,每次都要重新生成
三个依赖目标已经分析完,接下来给分析%config的命令
$(Q)$(MAKE) $(build)=scripts/kconfig $@
等价于
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_config
进入到scripts/kconfig目录下,在其Makefile中,有以下部分
%_defconfig: $(obj)/conf
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
这里的obj,就是scripts/kconfig,
上面等价于
XXX_defconfig: scripts/kconfig/conf
scripts/kconfig/conf --defconfig=arch/../configs/s32v234evb_defconfig Kconfig
conf这个文件,在这里也不细细分析了
Usage: ./conf [-s] [option] <kconfig-file>
[option] is _one_ of the following:
--listnewconfig List new options
--oldaskconfig Start a new configuration using a line-oriented program
--oldconfig Update a configuration using a provided .config as base
--syncconfig Similar to oldconfig but generates configuration in
include/{generated/,config/}
--olddefconfig Same as oldconfig but sets new symbols to their default value
--oldnoconfig An alias of olddefconfig
--defconfig <file> New config with default defined in <file>
--savedefconfig <file> Save the minimal current configuration to <file>
--allnoconfig New config where all options are answered with no
--allyesconfig New config where all options are answered with yes
--allmodconfig New config where all options are answered with mod
--alldefconfig New config with all symbols set to default
--randconfig New config with random answer to all options
这里使用这个文件,是根据XXX_defconfig文件中的内容,生成.config。
这篇文章,只是讲了流程,有些地方没有展开去讲,以后若有机会,会把conf和Makefile.build拿出来分析。
若有错误,敬请指正。