3.7 Kconfig和Makefile
毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux 内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。Kconfig和Makefile就好似一个城市的地图,地图引导我们去 认识一个城市,而Kconfig和Makefile则可以让我们了解一个内核目录下面的结构。在希望研究内核的某个子系统、某个驱动或其他某个部分时,都 有必要首先仔细阅读一下相关目录下的Kconfig和Makefile文件。
2.7.1 Kconfig结构
每种平台对应的目录下面都有一个Kconfig文件,比如arch/i386/Kconfig,该文件通过source语句构建出一个Kconfig树。文件arch/i386/Kconfig的内容片段如下:
- mainmenu "Linux Kernel Configuration"
- config X86_32
- bool
- default y
- help
- This is Linux's home port. Linux was originally native to the Intel
- 386, and runs on all the later x86 processors including the Intel
- 486, 586, Pentiums, and various instruction-set-compatible chips by
- AMD, Cyrix, and others.
- ……
- source "init/Kconfig"
- menu "Processor type and features"
- source "kernel/time/Kconfig"
- ……
- config KTIME_SCALAR
- bool
- default y
Kconfig的详细语法规则可以参看内核文档Documentation/kbuild/kconfig-language.txt,下面对其简单介绍。
(1)菜单项。
config关键字可以定义一个新的菜单项,比如:
- config MODVERSIONS
- bool "Set version information on all module symbols"
- depends on MODULES
- help
- Usually, modules have to be recompiled whenever you switch to a new
- kernel. ...
后面的几行定义了该菜单项的属性,包括类型、依赖关系、选择提示、帮助信息和缺省值等。
类型包括bool、tristate、string、hex和int。bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项。
依赖关系通过"depends on"或"requires"定义,指出此菜单项是否依赖于另外一个菜单项。
帮助信息需要使用"help"或"---help---"指出。
(2)菜单组织结构。
菜单选项通过两种方式组成树状结构。
使用关键字"menu"显式声明为菜单,比如:
- menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
- config PCI
- ……
- endmenu
通过依赖关系确定菜单结构,比如:
- config MODULES
- bool "Enable loadable module support"
- config MODVERSIONS
- bool "Set version information on all module symbols"
- depends on MODULES
- comment "module support disabled"
- depends on !MODULES
MODVERSIONS菜单项依赖于MODULES,所以它就是一个子菜单项。这要求菜单项和它的子菜单项同步显示或不显示。
(3)Kconfig关键字。
Kconfig文件描述了一系列的菜单选项,除帮助信息外,文件中的每一行都以一个关键字开始,主要有config、menuconfig、 choice/endchoice、comments、menu/endmenu、if/endif、source等,它们都可以用于结束一个菜单项,只 有前5个可以用在菜单项定义的开始。