本文主要是介绍Kconfig [@rt-thread],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如果想要得到自己想要的定制效果, 很难找到现成的方法, 这个时候我们需要对项目进行定制化修改.
经过刚才的介绍, 我们知道了 rt-thread 官方提供了 kconfig 工具来帮助我们管理 宏定义, 那么这些宏定义是在怎么来的呢, 我们来看看.
# 定义一个, MODVERSIONS
config MODVERSIONS# bool: 表示类型, 一共有 bool(y/n), tristate(y/n/m), string, hex, int 五种类型.# "Set version information on all module symbols": 这个是显示的提示bool "Set version information on all module symbols"# 通过 default 默认值, 下面语句表示, 如果 BAR 被选中, 那么 默认值就为 y. default y if BAR# depends on: 表示依赖于, 如果依赖的选项没有被选中, 那么该配置不会显示# BAR && m: BAR 和 m 分别为两个依赖的选项, 多个依赖的选项可以进行简单的逻辑运算.depends on BAR && m# 通过 select 关联其他选项, 如果本选项为真, 那么就将 HAVE_GENERIC_IOMAP 也选中.select HAVE_GENERIC_IOMAP# 帮助文档helpUsually, modules have to be recompiled whenever you switch to a newkernel. ...
其实
bool "Set version information on all module symbols"
和
boolprompt "Set version information on all module symbols"
是等价的.
prompt
格式的完整样式是 “prompt” <prompt> [“if” <expr>]
, 可以加入 <expr>
表达式 , 注意, 只能有一个prompt
.
default
定义默认值, 可以有0个或则多个, 样式为 “default” <expr> [“if” <expr>]
, 如果default
多个同时条件满足,那么只有第一个满足条件的值有效.
select
可以确定其他选项的情况, 样式为: “select” <symbol> [“if” <expr>]
, 这种选项的关联特别强, 配置选项被选中, 那么目标选项一定被选中.
官方提供了一个 imply
的属性. 样式为 “imply” <symbol> [“if” <expr>]
, 影响目标选项的默认值, 让目标选项的默认值不高于该选项的最大选项. 看下面例子.
config FOOtristate "foo"imply BAZconfig BAZtristate "baz"depends on BAR
FOO | BAR | BAZ’s default | choice for BAZ |
---|---|---|---|
y | y | y | Y/m/n |
y | m | n | M/n |
y | n | N | |
m | y | m | M/y/n |
m | m | m | M/n |
n | y | n | N/m/y |
n | m | n | N/m |
定义该选项是否进行显示, 我们可以使用visible if
来完成. 样式为 “visible if” <expr>
定义数字类型的取值范围, 我们可以使用 range
完成, 样式为 “range” <symbol> <symbol> [“if” <expr>]
,
其他选项, 我们可以通过 option
来自定义, 样式为 “option” <symbol>[=<value>]
还有就是上面提到的表达式, 其实可以进行一些简单的逻辑运算:
<expr> ::= <symbol> (1)<symbol> '=' <symbol> (2)<symbol> '!=' <symbol> (3)<symbol1> '<' <symbol2> (4)<symbol1> '>' <symbol2> (4)<symbol1> '<=' <symbol2> (4)<symbol1> '>=' <symbol2> (4)'(' <expr> ')' (5)'!' <expr> (6)<expr> '&&' <expr> (7)<expr> '||' <expr> (8)
- 在表达式计算的时候, bool和tristate可以对应的转化为对应的值, 其他的类型转化为 ‘n’
- 如果两则相同, 那么就 返回 y. 否则 返回 n
- 如果两者不同, 那么就 返回 n. 否则 返回 y
- 如果 symbol1 比 symbol2 小, 大, 小于等于, 大于等于. 那么就返回 y. 否则返回 n
- 优先返回表达式的值
- 返回 2-expr 的值
- 返回两者之间的最小值
- 返回两者之间的最大值
如果将所有配置都放在一页上面, 就算是作者本人, 可能也不记得几百上千的配置顺序. 对配置进行分类管理, 无疑是非常好的决定.
kconfig 里面用菜单的方式进行分类, 这里有两种写法.
-
在 menu 和 endmenu 之间直接书写:
menu "Network device support"depends on NETconfig NETDEVICES...endmenu
-
使用配置是否可见的方式来实现
config MODULESbool "Enable loadable module support"# 如果 MODVERSIONS 依赖于 MODULES 的'选中', 那么只有'选中'了, MODVERSIONS才显示出来 config MODVERSIONSbool "Set version information on all module symbols"depends on MODULES# 如果 MODVERSIONS 依赖于 MODULES 的'不选中', 那么只有'不选中'了, MODVERSIONS才显示出来 comment "module support disabled"depends on !MODULES
下面系统的介绍下 kconfig 的模块:
-
config
"config" <symbol> <config options>
-
menuconfig
和 config 比较类似, 不过该选项是管理一个列表.
"menuconfig" <symbol> <config options>
(1): # 如果 M 被 配置, 那么 C1 和 C2 就会被显示, 否则不被显示. menuconfig M if Mconfig C1config C2 endif(2): menuconfig M config C1depends on M config C2depends on M
下面的 C0 不会依赖于 M的配置, 所以一直会被显示出来. C1, C2 会根据 M的配置做显示.
(3): menuconfig Mconfig C0 if Mconfig C1config C2 endif(4): menuconfig M config C0 config C1depends on M config C2depends on M
-
choice/endchoice
choice 只能是 bool 或者 tristate 类型"choice" [symbol] <choice options> <choice block> "endchoice"
-
comment
注释"comment" <prompt> <comment options>
-
menu/endmenu
菜单模块"menu" <prompt> <menu options> <menu block> "endmenu"
-
if/endif
条件模块"if" <expr> <if block> "endif"
-
source
应用其他文件内容"source" <prompt>
-
mainmenu
菜单头"mainmenu" <prompt>
参考
- kconfig-language
这篇关于Kconfig [@rt-thread]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!