1Kconfig和Makefile
毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。Kconfig和Makefile就好似一个城市的地图,地图引导我们去认识一个城市,而Kconfig和Makefile则可以让我们了解一个内核目录下面的结构。在希望研究内核的某个子系统、某个驱动或其他某个部分时,都有必要首先仔细阅读一下相关目录下的Kconfig和Makefile文件。 分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在内核配置makemenuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择。 假如想使这个驱动被编译,则要修改Makefile文件,因此,需要添加新的驱动时,需要修改的文件有两个:Kconfig,Makefile.
2菜单组织结构
一般一个Kconfig文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下:
menu菜单名
菜单项或菜单链接1
菜单项或菜单链接2
...
菜单项或菜单链接n
endmenu
复制代码
其中菜单项就是指菜单的子菜单,所谓菜单链接就是指链接到另一个Kconfig文件,如此一下,菜单就可以实现随意嵌套了.
例如:
#drivers/Kconfig
menu"DeviceDrivers"
source"drivers/base/Kconfig"
source"drivers/connector/Kconfig"
source"drivers/mtd/Kconfig"
source"drivers/of/Kconfig"
source"drivers/parport/Kconfig"
source"drivers/pnp/Kconfig"
source"drivers/block/Kconfig"
source"drivers/hello/Kconfig"
configtest
bool"提示字符串"
defaulty
...
endmenu
复制代码
2.1菜单项
语法:
config<symbol>
<configoptions>
复制代码
<symbol>为一符号,就好像代码中的局部变量x一样,可用于后边的表达式中.
例如:
configUEVENT_HELPER_PATH
string"pathtoueventhelper"
dependsonHOTPLUG
default"/sbin/hotplug"
help
Pathtoueventhelperprogramforkedbythekernelfor
everyuevent.
复制代码
上面菜单项的属性string表示菜单的类型,每一个菜单项必须有一个类型.
注:每个config菜单项都会产生一个配置选项CONFIG_XXX,XXX即为<symbol>.如上,则会产生一个配置项:CONFIG_UEVENT_HELPER_PATH,此配置项的值记录在内核根目录下的隐藏文件.config内,例:~/WORKING_DIRECTORY/kernel/goldfish/.config文件内.
2.2菜单链接
菜单链接的格式如下:
source"路径"
复制代码
如:
source"drivers/pnp/Kconfig"
复制代码
2.3菜单属性2.3.1类型
类型可以是:bool、tristate、string、hex和int。 bool类型的只能选中或不选中,选中为y,不选中为n. tristate类型的菜单项为值可为三种值,多了编译成内核模块的选项。其值可为y,n,m. string类型表示需要用户输入一串字符串。 hex类型则需要用户输入一个16进制数。 int类型表示用户输入一个整型. 总结:
菜单类型属性就好比一个控件,bool相当于单选框,trstate相当于有三种状态的复选框,string相当于供用户输入字符串的文本编辑框,hex相当于供用户输入16进制数的文本编辑框,而int就相当于供用户输入整型数的文本编辑框。 类型关键字后边可跟随提示字符,也可以不跟随,取决于情况。如:
string"pathtoueventhelper"
复制代码
bool"Preventfirmwarefrombeingbuilt"
复制代码
注:每一个菜单项必须有类型属性。
2.3.2默认值
默认值属性default一般在类型属性后边,如:
configUEVENT_HELPER_PATH
string"pathtoueventhelper"
default"/sbin/hotplug"
复制代码
表示当前菜单项若用户没有选择或输入任何值时,所取的默认值.上述所示为当前的默认值为"/sbin/totplug".
2.3.3依赖
依赖可以是"dependson"或"requires". 语法:
dependson/requires<expr>
复制代码
<expre>为表达式,可为之前定义的菜单项名.
如:
dependsonHOTPLUG
复制代码
表示此菜单项显示与否取决于另外一个菜单项HOTPLUG,只有当菜单项HOTPLUG这个菜单项有效显示,当前菜单项才会显示。
例如:
configMODULES
bool"Enableloadablemodulesupport"
configMODVERSIONS
bool"Setversioninformationonallmodulesymbols"
dependsonMODULES
comment"modulesupportdisabled"
dependson!MODULES
复制代码
菜单项MODVERSIONS的显示与否取决于菜单项MODULES。这种信赖关系常用在子菜单项中。
2.3.4选择
语法:
choice
选择项
..
endchoice
复制代码
2.3.5提示
语法:
comment"提示信息字符串"
comment选项
复制代码comment只是用来给用户提示信息的,后跟字符串,此字符串也可以在终端中显示。 comment选项只可以是depondson。
2.3.6帮助
语法:
help/---help---<字符串>
复制代码
例如:
configEXTRA_FIRMWARE_DIR
string"Firmwareblobsrootdirectory"
dependsonEXTRA_FIRMWARE!=""
default"firmware"
help
Thisoptioncontrolsthedirectoryinwhichthekernelbuildsystem
looksforthefirmwarefileslistedintheEXTRA_FIRMWAREoption.
Thedefaultisthefirmware/directoryinthekernelsourcetree,
butbychangingthisoptionyoucanpointitelsewhere,suchas
the/lib/firmware/directoryoranotherseparatedirectory
containingfirmwarefiles.
复制代码
help相当于注释一样,在给编辑Kconfig文件的人看的,这样可以保持其可读性.
3举例
Kconfig:
#drivers/Kconfig
menu"DeviceDrivers"
source"drivers/base/Kconfig"
source"drivers/connector/Kconfig"
source"drivers/mtd/Kconfig"
...
endmenu
复制代码
其对应的makemenuconfig界面如下图所示:
source"drivers/base/Kconfig"中的Kconfig内容如下:即对应着上图中的第一项"GenericDriverOption"的子菜单内容:
这里不再列出来!
显示效果如下图所示:
各个目录下的Kconfig文件经过最终配置,最终会在内核根目录下生成一个.config文件,这是个隐藏文件,这个文件记录着各个选项的配置及值。供Makefile文件使用.使用命令:ls-al可看到! 如: .config:
#
#Automaticallygeneratedmakeconfig:don'tedit
#Linuxkernelversion:2.6.29
#ThuDec1521:15:25
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
#CONFIG_GENERIC_GPIOisnotset
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_MMU=y
#CONFIG_NO_IOPORTisnotset
CONFIG_GENERIC_HARDIRQS=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_HARDIRQS_SW_RESEND=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
#CONFIG_ARCH_HAS_ILOG2_U32isnotset
#CONFIG_ARCH_HAS_ILOG2_U64isnotset
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
CONFIG_VECTORS_BASE=0xffff0000
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
复制代码
每一个CONFIG_xxx记录着之前Kconfig文件内的菜单项的值.
如果觉得《Kconfig文件结构(图文)简介》对你有帮助,请点赞、收藏,并留下你的观点哦!