https://blog.csdn.net/weixin_33736649/article/details/90132745

一、找conf目标

假如用户选择的配置文件为rockchip_rk3588

在buildroot的Makefile里找到通配伪目标$(BUILD_DIR)/buildroot-config/conf

$(@D):$(BUILD_DIR)/buildroot-config,即/buildroot/output/rockchip_rk3588/build目录。
$(@F):conf
$(CONFIG):support/kconfig

命令1:mkdir -p $(@D)/lxdialog

创建lxdialog目录

命令2:

PKG_CONFIG_PATH="$(HOST_PKG_CONFIG_PATH)" $(MAKE) CC="$(HOSTCC_NOCCACHE)" HOSTCC="$(HOSTCC_NOCCACHE)" obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F)

命令的意思即为:

-C $(CONFIG) ,进入/buildroot/support/kconfig

-f Makefile.br,执行的Makefile文件为/buildroot/support/kconfig下的Makefile.br文件

obj=$(@D),将/buildroot/output/rockchip_rk3588/build目录作为变量obj传入
conf,make的目标为conf。

另外还传入了2个变量CC与HOSTCC,都是/usr/bin/gcc

但是发现在Makefile.br里找不到conf目标,但是Makefile.br文件又include了Makefile文件

结果发现Makefile文件里也没有conf这个目标。
通过最上面的gcc编译日志,发现Makefile.br有个地方很像gcc编译,于是加日志发现果然走了这里:

hostprogs-y变量的值:执行conf依赖时就是conf

再看一下下面这行代码的含义:

host-cmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))

遍历__hostprogs列表,拿着遍历的值m执行$(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m)))指令

最终发现在Makefile文件里,conf-cxxobjs变量不存在,conf-objs变量存在,所以最终host-cmulti变量的值就是conf

二、conf编译

/usr/bin/gcc -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -I/home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config -DCONFIG_=\"\"   /home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config/conf.o /home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config/zconf.tab.o  -o /home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config/conf

使用conf.o以及zconf.tab.o最终生成conf可执行文件

conf.o又是如何生成的

把conf及conf.o删除,执行./envsetup.sh,可以看到日志。

/usr/bin/gcc -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -I/home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config -DCONFIG_=\"\"   -c conf.c -o /home/xinyi/android/code/Task1-debian/rk3588_source/buildroot/output/rockchip_rk3588/build/buildroot-config/conf.o

发现conf.c源码的路径为/buildroot/support/kconfig

二、conf运行

根据http://xinyiworld.top/wordpress_it/?p=6942 我们知道conf运行指令为:
conf --defconfig=/buildroot/output/rockchip_rk3588/.rockchipconfig Config.in

看conf.c的源码,定义到defconfig读取的方法为conf_read,定义在lkc.h -> lkc_proto.h中,实现于confdata.c文件中。

TODO: lkc_proto.h与confdata.c文件是如何关联起来的?

提示:conf.o与zconf.tab.o是关联的,删除zconf.tab.o查看日志。

TODO: 能否对conf的执行单独进行debug调试

conf的执行依赖于完整的make过程,会依赖于make过程定义的很多变量,基本上无法实现conf的单独调试。

其实conf就是开源的KConfig配置和解析工具:kconfig-frontends,http://xinyiworld.top/wordpress_it/?p=7783

conf --defconfig=/buildroot/output/rockchip_rk3588/.rockchipconfig Config.in
就是根据.rockchipconfig文件,结合Config.in模板,在执行conf的目录也就是buildroot下生成一个新的.config文件。

分类: rk3588_bmc

0 条评论

发表回复

您的电子邮箱地址不会被公开。