Kconfig配置描述文件问题记录
Kconfig文件在编写和编译时遇到需要注意的一些问题汇总。
问题1:输入提示
每个配置项最多只能有一个提示,用于显示给用户。
如果不存在提示,则配置选项是不可见,用户无法直接更改其值,并且该选项不会出现在任何配置菜单中。其值只能通过“default”和“select”设置。这意味着在menuconfig界面没有显示用户不能设置更改,同样地,在defconfig文件中即使设置也无效。
问题2:默认值
默认值只是一个建议值,可以被用户更改。一个配置选项可以有多个默认值。如果有多个默认值,则仅激活第一个定义的默认值。默认值不限于定义它们的配置项,能在其他地方定义,也可以被较早的定义覆盖。仅当用户未设置其他值时(通过上面的输入提示)才将默认值分配给配置符号。如果输入提示可见,则会将默认值呈现给用户,并且用户可以覆盖它。
系统会按其在Kconfig文件中的出现顺序(以及被包含的顺序)处理 default 语句。
例如,如果一个配置项在不同文件里都定义了default值,按照source的顺序取第一个出现的default的值。
在arch/arm/mach-imx/Kconfig中
config IMX_CONFIG
string "DCD script to use"
depends on MACH_IMX
default "arch/arm/mach-imx/spl_sd.cfg"
以及board/freescale/mx6ullevk/Kconfig中
config IMX_CONFIG
default "board/freescale/mx6ullevk/imximage.cfg"
它们都在arch/arm/Kconfig中被包含进来,source的顺序如下
...
source "arch/arm/mach-imx/mx6/Kconfig"
...
source "arch/arm/mach-imx/Kconfig"
...
所以在生成的.config中
CONFIG_IMX_CONFIG="board/freescale/mx6ullevk/imximage.cfg"
如果把source的顺序切换一下,得到的值正好相反。
CONFIG_IMX_CONFIG="arch/arm/mach-imx/spl_sd.cfg"
注意:如果配置选项没有default属性,那么此配置项默认值默认为“n”。
问题3:config配置选项不出现在.config文件中
在Kconfig中,如果你定义了一个config项,但它在.config中不出现,通常有以下两个原因:
- 该config没有设置默认值(default),并且没有被其他配置项选择(select)或依赖(depends on)的条件不满足。
- 该config可能依赖于其他配置项,而依赖条件不满足,所以它没有被显示,因此也无法设置。
问题4: ‘*‘ in different file than ‘*‘ location of the ‘*‘
make时遇到类似下面的报错:
arch/arm/mach-imx/mx6/Kconfig:31: 'endif' in different file than 'if'
arch/arm/mach-imx/mx6/Kconfig:1: location of the 'if'
arch/arm/Kconfig:36: 'endmenu' in different file than 'menu'
arch/arm/mach-imx/mx6/Kconfig:1: location of the 'menu'
make时遇到这样的报错,那是因为文本的最后一行丢失了一个换行符。只需要用vim打开文件再保存一下,或者VSCode打开的文本后留一个空行。
根据POSIX标准,文本文件的每一行都应该以换行符(LF,即’\n’)结束,包括最后一行。有些编辑器(如VSCode)在显示文件时,可能会将文件末尾的换行符显示为一个空行,但也有一些编辑器不显示这个空行。所以如果在显示为空行的编辑器里删除末尾的空行就会出现这个报错。