显示配置过程执行的命令
1、在执行过程中加入V=1,打开开关就能显示执行 make ***_config过程中执行的命令:
ubuntu > make V=1 stm32mp15_fsmp1a_basic_defconfig
2、通过顶层Makefile文件可以查看到没有%defconfig目标,但是有%config目标
%config: scripts_basic outputmakefile FORCE
(Q)$(MAKE) $(build)=scripts/kconfig $@
替换命令为,也就是在执行配置的时候执行了这三条命令:
make –f uboot-stm32mp-2020.01/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
make –f uboot-stm32mp-2020.01/scripts/Makefile.build obj = scripts/kconfig stm32mp15_fsmp1a_basic_defconfig
3、上述%config目标执行命令的解析:
1)、变量$(Q)是显示或隐藏命令的开关,该变量在当前Makefile中定义。定义如下:
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
ifeq ($(KBUILD_VERBOSE),1)
quiet =
Q =
else
quiet=quiet_
Q = @
Endif
2)、变量$(MAKE)是make系统的内置变量,它的值是make。
3)、变量$(build)的定义可以在uboot-stm32mp-2020.01/scripts/Kbuild.include文件中找到,当前Makefile中引入了Kbuild.include,所以可以使用该文件中定义的变量。引入方式如下:
include scripts/Kbuild.include
build := -f $(srctree)/scripts/Makefile.build obj
4)、scripts_basic目标在顶层Makefile文件下,内容如下:
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
$(Q)rm -f .tmp_quiet_recordmcount
5)、outputmakefile目标定义同样在顶层Makefile文件,内容如下:
outputmakefile:
ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree) source
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
第三条命令详解:
我们发现配置过程中最终的命令还是第三条命令:这条命令的目标依然是stm32mp15_fsmp1a_XXXX_defconfig,使用的文件是./scripts/Makefile.build。该文件引入了另一个文件./scripts/kconfig/Makefile。在这个Makefile中有一个条规则
%_defconfig: $(obj)/conf
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
该规则下的命令被执行。它就是配置过程中执行的最后一条命令:
注:使用文件./scripts/Makefile.build引入文件./scripts/kconfig/Makefile
54 # The filename Kbuild has precedence over Makefile
55 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
56 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile
57 include $(kbuild-file)
### 最终执行的命令为:
scripts/kconfig/conf --defconfig=arch/../configs/stm32mp15_fsmp1a_XXX_defconfig Kconfig
配置结果
根据最终的命令分析,scripts/kconfig/conf是一个可执行程序,它生成.config文件,并输出了以下信息:
configuration written to .config
查看.config文件,makefile根据.config文件中的变量信息,确定哪些文件编译,那些文件不编译(适配和裁剪的过程)
CONFIG_SYS_ARCH=“arm”
20 CONFIG_SYS_CPU=“armv7”
21 CONFIG_SYS_SOC=“stm32mp”
22 CONFIG_SYS_VENDOR=“st”
23 CONFIG_SYS_BOARD=“stm32mp1”
24 CONFIG_SYS_CONFIG_NAME=“stm32mp1”