配置工程,生成.config配置文件
make xxx_defconfig
会调用顶层的Makefile的 %config 规则。

KBUILD_DEFCONFIG := sandbox_defconfig
export KBUILD_DEFCONFIG KBUILD_KCONFIG

config: scripts_basic outputmakefile FORCE
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

%config: scripts_basic outputmakefile FORCE
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

目标 %config 依赖于 scripts_basic、outputmakefile、FORCE

1、FORCE目标:

PHONY += FORCE
FORCE:

FORCE 是没有规则和依赖的,所以每次都会重新生成 FORCE。当 FORCE 作为其他目标的依赖时,由于 FORCE 总是被更新过的,因此依赖所在的规则总是会执行的。即将FORCE当做依赖时,对应的目标规则总是会被执行。

2、scripts_basic目标:

# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:
    $(Q)$(MAKE) $(build)=scripts/basic
    $(Q)rm -f .tmp_quiet_recordmcount

目标不依赖其它目标,会执行以下规则命令:

$(Q)$(MAKE) $(build)=scripts/basic
其中:

Q是显示方式:静默make -s;详细make V=1;不显示make V=0
MAKE=make
build定义在scripts\kbuild.include
build := -f $(srctree)/scripts/Makefile.build obj
展开后:
build := -f ./scripts/Makefile.build obj
展开后:

@make -f ./scripts/Makefile.build obj=scripts/basic
@rm -f .tmp_quiet_recordmcount

最终会调用文件./scripts/Makefile.build

3、outputmakefile目标:

PHONY += outputmakefile
# outputmakefile generates a Makefile in the output directory, if using a
# separate output directory. This allows convenient use of make in the
# output directory.
outputmakefile:
ifneq ($(KBUILD_SRC),)
    $(Q)ln -fsn $(srctree) source
    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
        $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif

可以通过echo查看KBUILD_SRC为空

mytest:
    @echo KBUILD_SRC = $(KBUILD_SRC)

所以该目标规则没有执行如何命令。

第二步:命令部分
目标 %config 依赖于 scripts_basic、outputmakefile、FORCE ,执行以下命令:

$(Q)$(MAKE) $(build)=scripts/kconfig $@

展开:

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

也跟文件./scripts/Makefile.build 有关

第三步:Makefile.build
上面的分析最后指向以下两条命令:

make -f ./scripts/Makefile.build obj=scripts/basic
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

1、 scripts_basic 目标对应的命令:

make -f ./scripts/Makefile.build obj=scripts/basic
打开文件 scripts/Makefile.build,有如下代码:

# Modified for U-Boot
prefix := tpl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := spl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := .
endif
endif
# 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)

使用@echo打印各个变量值,结果如下:

src= scripts/basic
kbuild-dir = ./scripts/basic
kbuild-file = ./scripts/basic/Makefile
include ./scripts/basic/Makefile

其中src的值即为obj=scripts/basic的值。
make执行时未指定目标,会执行Makefile.build中的默认目标,如下:

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
     $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
     $(subdir-ym) $(always)
    @:

其中KBUILD_BUILTIN = 1、KBUILD_MODULES = 0,展开后即为:

__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:

五个变量中除去
(always)其他都为空,(always) = scripts/basic/fixdep,因此需要先编译 scripts/basic/fixdep.c生成fixdep这个软件,Makefile.build包含了scripts/basic/目录下的Makefile:

include ./scripts/basic/Makefile

2、 %config 目标对应的命令:

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

src的值即为obj=scripts/basic的值,所以Makefile.build中各个变量值如下:

src= scripts/kconfig
kbuild-dir = ./scripts/kconfig
kbuild-file = ./scripts/kconfig/Makefile
include ./scripts/kconfig/Makefile
include包含了./scripts/kconfig目录下的Makefile,执行make时会调用scripts/kconfig/ Makefile中的内容,此文件有如下所示内容:

%_defconfig: $(obj)/conf
    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

# Added for U-Boot (backward compatibility)
%_config: %_defconfig
    @:

目标%defconfig 刚好和我们输入的 xxxdefconfig 匹配,依赖为$(obj)/conf,展开后就是 scripts/kconfig/conf。接下来就是检查并生成依赖scripts/kconfig/conf。

得到 scripts/kconfig/conf 以后就要执行目标%_defconfig 的命令:

 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

将其展开就是:

@ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig

结果是将配置输出到.config 文件中,最终生成 uboot 根目录下的.config 文件。

作者:SteveChen  创建时间:2025-06-22 15:22
最后编辑:SteveChen  更新时间:2025-06-22 15:34
上一篇:
下一篇: