【问题标题】:How to define a Linux kernel Kconfig item that must at least select one of its sub-options to make it work?如何定义一个必须至少选择其子选项之一才能使其工作的 Linux 内核 Kconfig 项?
【发布时间】:2019-06-12 21:57:06
【问题描述】:

我正在编写一个内核模块,它有两个可以使用的低级选项。这两个选项都可以选择为 M/Y/N,但必须至少选择其中一个,否则模块将不起作用。如下所示:

[*]   Enable FOO support                      
       <M>     Back-end A
       <M>     Back-end B

我是这样写的,但是两个子选项都可以不选。

config FOO
   bool "Enable FOO support"
config BACKEND_A
   tristate "Back-end A"
   depends on FOO
   depends on SUBSYSTEM_X
config BACKEND_B
   tristate "Back-end B"
   depends on FOO
   depends on SUBSYSTEM_Y

如何在 kconfig 中编写这样的配置?

【问题讨论】:

    标签: linux-kernel kbuild


    【解决方案1】:

    假设AB 两个后端不能同时加载到内核中choice 配置条目似乎是那里最好的:

    config FOO
        bool "Enable FOO support"
    
    choice
        prompt "Select back-end for FOO"
        depends on FOO
    
        config BACKEND_A
             tristate "Back-end A"
             depends on SUBSYSTEM_X
        config BACKEND_B
             tristate "Back-end B"
             depends on SUBSYSTEM_Y
    endchoice
    

    choice 的行为在Documentation/kbuild/kconfig-language.txt 中有所描述:

    虽然布尔选择只允许单个配置条目 选中,三态选择还允许任意数量的配置条目 设置为'm'。如果单个驱动程序有多个驱动程序,则可以使用此功能 硬件存在,只能编译/加载单个驱动程序 内核,但所有驱动程序都可以编译为模块。

    choicetristate 的用法示例:sound/soc/davinci/Kconfig

    【讨论】:

    • 谢谢,它有效。唯一的一个小问题是用户仍然可以取消选择所有导致构建不可用的后端。但无论如何,它可以提示用户选择它,然后是它的用户的业务。
    【解决方案2】:

    您可以使FOO 不可编辑并使用反向依赖选择它:

    config FOO
            tristate
    
    menu "FOO support"
    
    config BACKEND_A
            tristate "Back-end A"
            depends on SUBSYSTEM_X
            select FOO
    config BACKEND_B
            tristate "Back-end B"
            depends on SUBSYSTEM_Y
            select FOO
    
    endmenu
    

    【讨论】:

    • 另一个好主意,也许我可以让 FOO 仅在至少选择一个后端时显示。
    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多