zoukankan      html  css  js  c++  java
  • Kconfig 配置文件编码规则

      最早接触到Kconfig是在u-boot的移植过程中。所今天来好好学习一下如何编写一个符合Kconffigde 配置文件。Kbuild或者是Kconfig的中文翻译意思是内核配置/构建系统。他最早出自哪里我不太清楚,但是Linux内核上的应用渐渐的增加了他的曝光度也让我见识到了。他的基本思路就是编辑一些配置字段,其中处理了各个配置之间的依赖和互斥等逻辑从而为一个复杂庞大的软件系统源码移植裁剪提供了优秀的配置工具,主要分为无界面版本和有界面的。使用方式无界面的现在常常被用来使用提供好的配置文件生成符合源码依赖关系的配置文件,而图形配置界面才是常常使用来进行配置裁剪源码系统的工具。图形化界面是靠读取指定的Kconfig文件进行显示渲染和配置并最后生成对应的配置文件,所以这里来学习记录一下Kconfig文件的编码规则。

    config

    Kconfig用config 定义一个配置项编码形式如下:

    config   XXX
        type 
        select        xxx
        depends on    xxx || xxx
        default
        range 
        prompt
        help

    XXX为这个配置名称,在整个配置系统中唯一,如果在多个地方定义这个配置项,实际上配置工具会自动统一不同地方的同名配置的值为同一个,所以最好避免这类使用方式。可以说config定义的配置项时整个kbuild的一个最小配置单元。这里配置项目地下的具体内容描述如下:

    type

    bool          
    只有y和n,其后可以跟输入提示,如果没有则图形配置界面上将不会显示出当前配置项。
    int           
    整形数,输入提示同上bool;
    hex           
    十六进制数,输入提示同上bool;和int的区别就是输入数字时生成的内容会自动添加0x在前面
    string        
    字符串 ,输入提示同上bool;
    tristate     
    Linux源码构建特有的配置类型,输入提示同上bool;他的可取值比bool多了一个m,但是有时候不一定支持m值所以这个类型就和bool相同了。

    select

    表示选择这个选项时会同时自动选择另一个配置项,且当前配置项必须是具备bool类属性的配置项,其次是被select的选项也必须是bool类属性的配置选项。
    这里的配置项选项类似于bool,tristate这种配置项。

    default

    表示这个配置项的默认值。需要根据具体的配置项类型决定。

    depends on

    表示这个配置选项的启用依赖其他的选项。如果依赖项未启用则界面上不显示出来。

    range

    作为int和hex类型时配置还可以支持range 属性增加输入的范围限制。输入超出限制时软件会给出提示。

    prompt

    使用prompt 单独一行书写输入提示信息,也常常用字其他不能直接在配置类型后书写提示字段的类型的配置中。

    choice

    Kconfig用choice 定义一个配置项包含同类配置项的多选一情况,编码形式如下:

    choice
    config    choice1
        bool "choice1"    
    config    choice2
        bool "choice2"
    config    choice3
        bool "choice3"
    config    choice4
        bool "choice4"
    endchoice

    他最后呈现到配置界面就是,罗列出choice下的配置项选择一个使能。当前choice不会生成具体的配置项只会生成所选配置项的配置内容,他存在的意义更像是将多个选项的互斥关系体现出来,更加凸显所配置特定功能的不同配置模式的意味。choice不能嵌套——choice禁止套娃。chioce可以使用上面的config的部分属性关键字如prompt,default,help等,但是有一点choice的子配置项只能是bool或者tristate类型的选项,且选项下的每一个config都不再使用default属性。

    menu

    Kconfig用menu定义一个子菜单配置项集合编码形式如下:

    menu menu_test
        comment "This is an  memu "
    
        config   TEST_HEX
            hex   
            prompt "hex test config"
            range  0 20
            help  
                None
            
            
        config   TEST_INT
            int   "int test config"
            range  0 20
            help  
                None
                
        config   TEST_BOOL
            bool   "bool test config"
            select TEST_SELECT2
            help  
                None
                
        config   TEST_STRING2
            string   "string test config"
            default     2
            help  
                None 
    endmenu

    menu是kconfig将一些配置项划分为一个子项功能相关的配置集合的子菜单目录,他同choice一样本身不描述具体的配置。类似UI界面的子菜单,子菜单中的设置也可以拿出来单独配置但就是缺乏分类不方便人使用管理,menu允许嵌套,形成多级子菜单这和常见的系统设置的概念相同。

    comment

    常用来显示大标题类似的注释内容使用,常常在menu选项下用,最后会以***comment***的形式显示。除了给指定的menu进行注释可以使用comment,他还可以直接卸载配置文件的顶层即不属于任何一个项,类似config一样。

    source

    实际的工程源码往往都会根据具体的功能或其他方面的考虑分为不同的目录,而开发过程也习惯将对应的配置文件Kconfig也放到指定的源码根目录下。这样只要顶级根目录下的Kconfig使用source引用对应目录下的文件就可以将对象目下的配置导入。注意的是Kconfig是支持递归导入的导入的内容就是类似C代码中的include直接将指定文件的内容贴在source 调用的位置且在运行时就完成了导入内容的展开。

    总结

          Kbuild工具的出现大大的减轻了大型软件如Linux和u-boot等的移植,因为他帮移植过程处理了一部分依赖和互斥逻辑,这在你对一个系统的软件源码之间依赖关系不是很清楚的时候是很有用的。最后在配合对相应的工具将生成的配置文件转为C代码的头文件,在编译时引用对应的头文件就能对源码进行条件编译了进而完成率移植裁剪。对了Kconfig的源码也是支持注释的,注释使用“#”后面的单行就是注释的内容了。

  • 相关阅读:
    攻防一体 暴力攻击
    新的亮眼的但不彻底的交互
    利用物联网或智能化区分产品
    Character Sets, Collation, Unicode :: utf8_unicode_ci vs utf8_general_ci
    容灾 RPO RTO
    微信找人代付 下单账号 支付账号
    微信公众号 openId 支付 php中file_get_contents与curl性能比较分析
    t
    accesstoken 中控服务器 并发刷新 加并发锁
    a
  • 原文地址:https://www.cnblogs.com/w-smile/p/13973216.html
Copyright © 2011-2022 走看看