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) ,进入 -f Makefile.br,执行的Makefile文件为 obj=$(@D),将 另外还传入了2个变量CC与HOSTCC,都是 |
但是发现在Makefile.br里找不到conf目标,但是Makefile.br文件又include了Makefile文件
结果发现Makefile文件里也没有conf这个目标。
通过最上面的gcc编译日志,发现Makefile.br有个地方很像gcc编译,于是加日志发现果然走了这里:
hostprogs-y变量的值:执行conf依赖时就是conf
再看一下下面这行代码的含义:
遍历__hostprogs列表,拿着遍历的值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文件。
0 条评论