zoukankan      html  css  js  c++  java
  • [编译] 10、kconfig 入门指导教程



    前言

    Kconfig 的作用就是为了让用户配置内核,在 Kconfig 中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。其和 makefile 往往需要配合使用,来组织编译大型工程。这里我们从一个 DEMO 讲起,然后介绍 Kconfig 具体语法。


    1. 安装 kconfig

    yaourt -S kconfig-frontends
    

    2. 克隆一个 demo

    ➜  git clone https://github.com/skif-web/demo-kbuild.git
    ➜  demo-kbuild git:(master) ls
    getLast.sh  KConfig  README.md
    

    3. 运行 kconfig

    运行 kconfig-mconf KConfig 会弹出交互页面,用户可以做一些选择,然后会在同级目录下自动生成一个 .config 文件,表示用户的选择


    4. 源码解析

    4.1 选择题目设计模板

    下面是选择类型的题目模板:

    choice SELECT_DESTINATION							# 选择
        prompt "Select data destination"				# 选项的题干
        default DESTINATION_TTY							# 默认选项
    
    config SELECT_DESTINATION_TTY						# 选项 SELECT_DESTINATION_TTY
        bool "show data in console"
    config SELECT_DESTINATION_FILE						# 选项 SELECT_DESTINATION_FILE
        bool "save data to file"
    endchoice
    

    对应的 GUI 为:


    4.2 填空题目设计模板

    下面是填空类型的题目模板:

    config SELECT_DESTINATION_FILE_FILENAME				# 填空
        string "destination file"						# 填空的题干
        depends on SELECT_DESTINATION_FILE				# 这个填空题是否会出现,取决于上面的选择是否选择了 SELECT_DESTINATION_FILE
        default "last.log"								# 默认填空答案
        help
          Write destination file with relative or full path
    

    对应的 GUI 为:


    4.3 判断题目设计模板

    下面是判断类型的题目模板:

    config SHOW_ONLY_CURRENT_USER     
        bool "show data only for current user"         	# bool 是否选择
        default y										# 默认选项 yes
        help											# 帮助内容
          script will get data only for currewnt user	
    

    对应的 GUI 为:


    5. 产物解析

    生成的 .config 为:

    ➜  demo-kbuild git:(master) ✗ cat .config
    #
    # Automatically generated file; DO NOT EDIT.
    # Configuration
    #
    # CONFIG_SELECT_DESTINATION_TTY is not set
    CONFIG_SELECT_DESTINATION_FILE=y
    CONFIG_SELECT_DESTINATION_FILE_FILENAME="last.log"
    CONFIG_SHOW_ONLY_CURRENT_USER=y
    

    OR

    ➜  demo-kbuild git:(master) ✗ cat .config
    #
    # Automatically generated file; DO NOT EDIT.
    # Configuration
    #
    CONFIG_SELECT_DESTINATION_TTY=y
    # CONFIG_SELECT_DESTINATION_FILE is not set
    # CONFIG_SHOW_ONLY_CURRENT_USER is not set			# bool 类型不选会这样显示,而不是 N !!!
    

    6. 产物使用

    克隆下来的仓库文件夹下有个 getLast.sh 小脚本,该脚本展示了如何使用 .config

    ➜  demo-kbuild git:(master) ✗ cat getLast.sh 
    #!/bin/bash
    
    # script running script
    workDir=`dirname "$(readlink -f "$0")"`
    
    # future command to run
    cmdline="last "
    
    # read config
    source $workDir/.config || { echo "ERROR! Unable to read config"; exit 1; }
    
    # if select
    if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]; then
        currentUser=`whoami`
        cmdline="$cmdline $currentUser"
    fi
    
    # now run command. If destination is file - ise redirect
    if [ "x$CONFIG_SELECT_DESTINATION_FILE" == "xy" ]; then
        $cmdline > $CONFIG_SELECT_DESTINATION_FILE_FILENAME
    else
        $cmdline
    fi
    

    这个例子非常经典,用 source 加载 .config,然后用 if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ] 进行优雅的判断。


    7.Kconfig语法简介

    !!! 这里直接用园友黄超树的总结《Kconfig语法简介

    每个选项都有其自己的依赖关系。这些依赖关系决定了选项是否是可见的。父选项可见,子选项才能可见。

    7.1 单一选项 config

    原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。

    一个配置选项定义可以是下面的形式:

    config MODVERSIONS
       bool "Set version information on all module symbols"
       depends MODULES
       help
          Usually, modules have to be recompiled whenever you switch to a new
          kernel. ...
    

    • "config" ,配置选项。 而它下面的几行定义了该配置选项的属性。

      属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。

      配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。

    • "bool" ,类型定义 :"bool"/"tristate"/"string"/"hex"/"int"

      每个配置选项都必须指定类型。有两个基本类型:tristate 和 string,其他类型都是基于这两个基本类型。

      类型定义可以用输入提示,所以下面的两个例子是等价的:
      
         bool "Networking support"
      和
         bool
         prompt "Networking support"
      
    • "depends on", 依赖关系:"depends on"/"requires"

      为菜单选项定义依赖关系。如果定义了复杂的逻辑依赖关系系,它们之间用 '&&','||','('与')' 间隔。

      依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式),所以下面的两个例子是等价的:

         bool "foo" if BAR
         default y if BAR
      和
         depends on BAR
         bool "foo"
         default y
      
    • "select", 反向依赖关系,语法为:**"select" ["if" ]

      反向依赖只能用在 boolean 或 tristate 选项上。

      当前选项选中后则select后指定的选项自动被选择。

      尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。

      当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。

    • "default", 默认值:"default" ["if" ]

      一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。

      默认值并不是只限于应用在定义他们的菜单选项。这就意味着默认值可以定义在任何地方或被更早的定义覆盖。

      如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。

      默认值的依赖关系可以用 "if" 添加。(可选项)


    7.2 菜单 menu

    menu条目用于生成菜单,格式如下:

    menu "Floating poing emulation"
            config FPE_NWFPE
            ..............
            config FPE_NWFPE_XP
            .............
    endmenu
    

    menu之后的字符串是菜单名,menu和endmenu之间有很多config条目(待会说介绍config条目),在配置界面上会出现如下字样的菜单,移动光标选中它之后按回车进入,就会看到config条目定义的配置选项。

    Floating point emulation  --->
               [] FPE_NWFPE
               [] FPE_NWFPE_XP
    

    7.3 选择框 choice

    choice条目将多个类似的配置选项组合在一起,供用户单选或者多选。

    choice
        prompt "arm system type"
        default arch_versatile
    config arch_aarc200
        ...
    config arch_integrator
        ...
    endchoice
    

    prompt后面跟的是提示信息,光标选中它后按回车键进入,就可以看到多个config条目定义的配置选项。
    条目中定义的变量类型只能有两种:bool和tristate,不能同时有这两种类型的变量。

    对于bool类型的choice条目,只能在多个选项中选择一个;

    对于tristate类型的choice条目,要么就把多个选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。


    7.4 提示文本 comment

    comment条目定义了一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中,格式如下:

    comment <prompt>
    <comment options>
    

    例如:

    menu "floating point emulation"
    comment "At least one emultaion must be selected"
    ...
    

    7.5 引入配置 source

    source条目用于读入另一个Kconfig文件,格式如下:

    source <promt>
    

    例如:

    source "net/Kconfig"
    

    链接



    : ** 在本博客的编译系列中,有很多关于自动化构建编译的博文:https://www.cnblogs.com/zjutlitao/category/759821.html **

  • 相关阅读:
    luogu 2491 [SDOI2011]消防 / 1099 树网的核 单调队列 + 树上问题
    BZOJ 1179: [Apio2009]Atm tarjan + spfa
    BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
    BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP
    BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 树形DP
    CF286E Ladies' Shop FFT
    CF528D Fuzzy Search FFT
    BZOJ 3771: Triple 生成函数 + FFT
    BZOJ 3513: [MUTC2013]idiots FFT
    python爬虫网页解析之parsel模块
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/15253933.html
Copyright © 2011-2022 走看看