在我们开发好软件之后,发布固件,ROM 包时,需要自动化编译。 这个时候要解决一个问题,就是编译过程中交互输入完成配置项选择。
我们先看一下传统的编译方式,如图
都是先拷贝一个 .config*** 配置文件覆盖当前的 .config 文件,接着make menuconfig < … ,重定向输入一个文件,
来代替手动选择流程, 最后make clean && make。
流程比较简单,但是如果碰到不支持图形界面的服务器,那么执行make menuconfig 会失败,从而导致构建失败。
我们这里可以对mboot 的编译流程稍作分析:
1. makefile 分析
vendor\mstar\mboot\MBoot\sboot\scripts\kconfig\Makefile
help:
@echo ' config - Update current config utilising a line-oriented program'
@echo ' menuconfig - Update current config utilising a menu based program'
@echo ' xconfig - Update current config utilising a QT based front-end'
@echo ' gconfig - Update current config utilising a GTK based front-end'
@echo ' oldconfig - Update current config utilising a provided .config as base'
@echo ' randconfig - New config with random answer to all options'
@echo ' defconfig - New config with default answer to all options'
@echo ' allmodconfig - New config selecting modules when possible'
@echo ' allyesconfig - New config where all options are accepted with yes'
@echo ' allnoconfig - New config where all options are answered with no'
其中xconfig,gconfig,menuconfig 分别使用的是qconf,gconf,mconf工具,如下:
而其它的config,oldconfig,randconfig,defconfig,allmodconfig,allyesconfig,allnoconfig,silentoldconfig,都使用的是conf 工具,只是传给conf 的参数不同而已。
每个配置项的详细说明可以参看另外一篇博友的文章。
2. conf 工具
vendor\mstar\mboot\MBoot\sboot\scripts\kconfig\conf.c分析
首先makefile 如下目标会调用conf工具
config: $(obj)/conf
$< Config.in
oldconfig: $(obj)/conf
$< -o Config.in
silentoldconfig: $(obj)/conf
$< -s Config.in
randconfig: $(obj)/conf
$< -r Config.in
allyesconfig: $(obj)/conf
$< -y Config.in
allnoconfig: $(obj)/conf
$< -n Config.in
allmodconfig: $(obj)/conf
$< -m Config.in
defconfig: $(obj)/conf
$(Q)rm -f ./UConfig.in
if [ -a ./../u-boot-2011.06/UConfig.in ]; then \