本文不是分析Linux的make menuconfig,而是如何将Linux这套机制适配到自己的项目里。
Linux内核配置工具会使用到menuconfig。menuconfig会用到mconf、conf两个命令。这两个命令是编译内核自动生成的。网上有开源的实现,我们下载下来自己编译:
github链接:
menuconfig
下载后按照说明编译即可。
Kconfig
Kconfig文件定义了配置。
执行make menuconfig会根据具体的Kconfig加载界面。
先编写一个最简单的makefile,内如如下。
%config:
mconf Kconfig
写一个简单的Kconfig。
menu "toolchain"
choice
prompt "chose tool chain"
default gcc
config gcc
bool "gcc"
config armcc
bool "armcc"
config mingw
bool "mingw"
endchoice
config ARGFLAGS
string "argflags"
depends on gcc
default "-c -o -g -list"
config DEBUG
bool "debug"
default n
endmenu
menu "platform"
choice
prompt "chose linux"
default linux
config linux
bool "linux"
config windows
bool "windows"
config no_os
bool "no_os"
endchoice
endmenu
具体的Kconfig语法可以参考别的资料,这里就不介绍了。
执行:
make menuconfig
就会显示配置界面 :
修改保存后,会生成.config配置文件。
这样我们就完成了一个简单的menuconfig。
config.h
.config是给make编译使用的。如果代码里需要使用相应的配置,需要转换成头文件。
%config:
mconf Kconfig
conf Kconfig --silentoldconfig config.h
配置完后会生成config.h,这样在代码里包含头文件即可。
#define CONFIG_windows 1
#define CONFIG_mingw 1
defconfig
有时不同的项目默认的配置文件可能不同,需要需要在某些配置基础上修改。
例如有xxx_defconfig。原因就是将xxx_defconfig拷贝到.config。这样执行make menuconfig的时候就会在此基础上配置了。
%config:
conf --defconfig=demo_defconfig Kconfig
mconf Kconfig
conf Kconfig --silentoldconfig config.h
例如demo_defconfig作为默认的配置。
如果包含多个xxx_defconfig。随意需要增加多个%config匹配关系。
假设有xxx_defconfig、yyy_defconfig、zzz_defconfig。
.PHONY: xxx_defconfig yyy_defconfig zzz_deconfig
%config:
@echo "select default config"
@mconf Kconfig
@conf Kconfig --silentoldconfig config.h
xxx_defconfig yyy_defconfig zzz_defconfig:
@echo "select $@"
@conf --defconfig=$@ Kconfig
@mconf Kconfig
@conf Kconfig --silentoldconfig config.h
正常是可以%_defconfig的。但是虽然.PHONY配置了,还是会提示is up to date.说明匹配关系没写对。这个后面再找下原因吧。
这样就完成了menuconfig的使用规则。