Linux-Kconfig总结与分析
程序员文章站
2022-11-21 22:23:33
使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有"CONFIG_",只有编译内核时,自动生成autoconf.h才会出现前缀. 2.如果XX_defconfig板卡配置文件中定义新的宏=y时,而在Kconfig并没有声明它,则内核编译出来的autoconf.h里也 ......
使用kconfig时,需要注意的地方
- 1.在kconfig中定义的配置宏,前缀都没有"config_",只有编译内核时,自动生成autoconf.h才会出现前缀.
- 2.如果xx_defconfig板卡配置文件中定义新的宏=y时,而在kconfig并没有声明它,则内核编译出来的autoconf.h里也不会定义它的.
- 3.如果xx_defconfig板卡配置文件中没有设置config_modules=y,则编译make modules时将会失败,而make menuconfig时, kconfig中的tristate参数也会被读写为bool参数(也就是不能设置m)
config宏变量参数
- bool: 表示该config宏只能选择y(编译内核)或者n(不编译),不能选择m(编译为模块)
- tristate: 表示该config宏可以设置y/m/n三种模式(tristate)
- string: 表示该config宏可以设为一串字符,比如#define config_xxx "config test"
- hex: 表示该config宏可以设为一个十六进制,比如#define config_xxx 0x1234
- int: 表示该config宏可以设为一个整数,比如#define config_xxx 1234
常用参数
- default y: 表示默认是勾上的,当然也可以写为default m或者default n
- help: 帮助提示信息
- depends on:依赖项,比如depends on xxx 表示当前宏需要config_ xxx宏打开的前提下,才能设置它 (注意依赖项的config参数只有bool或tristate才有效)
- select : 反依赖项,和depends on刚好相反,比如 selecton xxx表示当前宏如果是y或者m,则会自动设置xxx=y或者m(注意参数只有bool或tristate才有效)
- choice: 会生成一个单选框,里面通过多选一方式选择config,需要注意choice中的config参数只能bool或tristate
- prompt: 提示信息,如果对于choice而言,则会用来当做一个单选框入口点的标签
- range : 设置用户输入的数据范围,比如range 0 100表示数据只能位于0~100
- menuconfig: menuconfig xxx和config xxx类似,唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)
示例1-创建复选框(多选多)-探索宏变量参数
接下来我们来试试如何给不同宏设置不同参数,以my_symbol1~ my_symbol5为例
设置my_symbol3~ my_symbol5依赖于my_symbol2
修改内核顶层kconfig文件,添加内容:
menuconfig my_symbol_test #生成一个菜单宏项 bool "my_symbol_test" default y config my_symbol1 bool "my symbol is bool" default y depends on my_symbol_test config my_symbol2 tristate "my symbo2 is tristate" default m depends on my_symbol_test config my_symbol3 string "my symbo3 is string" default "test symbo3" depends on my_symbol2 && my_symbol_test config my_symbol4 hex "my symbo4 is hex" range 0 0x2000 #设置hex区间 default 0x1234 depends on my_symbol2 && my_symbol_test config my_symbol5 int "my symbo5 is int" range 0 2000 #设置int区间 default 1234 depends on my_symbol2 && my_symbol_test
效果如下所示:
如上图所示,可以看到我们设置my symbol5超出区间[0,2000]时,直接数据报错
编译内核后,查看自动生成的autoconf.h,定义如下:
其中上面的config_my_symbol2_module宏是因为我们在kconfig设置它为default m,所以config_my_symbol2_module是个模块宏.
示例2-通过choice创建单选框(多选一)
choice prompt "choice example" #作为该单选框入口点的标签 default y default my_symbol3 #默认选择my_symbol3配置项 config my_symbol1 bool "my symbol1 is bool" help my_symbol1 example config my_symbol2 bool "my symbo2 is bool" help my_symbol2 example config my_symbol3 tristate "my symbo3 is tristate" help my_symbol3 example
endchoice
编译内核后,查看autoconf.h,如下图所示,可以看到对于choice单选框来说,tristate属性其实并没有module功能,只有y/n
未完,后续再遇到不懂的再总结~