上一篇文章说了Makefile与Kconfig,那么我们现在就看一个例子让我们对其有更加深刻的理解。(参考驱动开发详解)
假设我们要在内核源码drivers目录下为ARM新增一个my driver树形目录,如下:
my_driver/
|-- cpu
| `-- cpu.c
|-- test.c
|-- test_client.c
|-- test_ioctl.c
|-- test_proc.c
`-- test_queue.c
如前面所说,在内核里面新增目录,就要在相应的目录中创建Makefile和Kconfig文件,而新增目录的父目录也需要修改,新的Makefile、Kconfig才能被引用。那么我们下来就在my_driver目录下创建Makefile和Kconfig文件。首先我们来看下Kconfig文件的内容:
#
#MY_DRIVER configuration
#
menu "MY_DRIVER"
comment "MY_DRIVER"
config CONFIG_TEST
bool "TEST support"
config CONFIG_TEST_USER
tristate "TEST user-space interface"
depend on CONFIG_TEST
endmenu
由于test driver是内核新增的功能,所以首先创建MY_DRIVER菜单,显示TEST support等待用户选择,下来判断是否选择了MY_DRIVER,如果是(CONFIG_TEST=y),则进一步显示子供能:用户接口与cpu功能支持(CONFIG_TEST_USER),由于用户接口功能可以被编译成内核模块,所以用tristate(tristate类型的菜单项多了编译成内核模块的选项)。
为了能使这个Kconfig文件生效,还需要修改arch/arm/Kconfig文件
source "drivers/my_driver/Kconfig"
脚本中使用source说明引用新的Kconfig。
下来我们看下Makefile文件
#
# drivers/my_driver/Makefile
#
obj-$(CONFIG_TEST) += test.o test_queue.o test_client.o
obj-$(CONFIG_TEST_USER) += test_ioctl.o
obj-$(CONFIG_PROC_FS) += test_proc.o
obj-$(CONFIG_TEST_CPU) += cpu/
my_driver目录中的子目录cpu也包含Makefile文件,如下: #
# drivers/my_driver/cpu/Makefile
#
obj-$(CONFIG_TEST_CPU) += cpu.o
为了使整个my_driver目录能够被编译,my_driver父目录中的Makefile也应该新增脚本,如下:
增加了Kconfig和Makefile文件之后新的目录树形图为:
my_driver/
|-- cpu
| |-- cpu.c
| `-- Makefile
|-- Kconfig
|-- Makefile
|-- test.c
|-- test_client.c
|-- test_ioctl.c
|-- test_proc.c
`-- test_queue.c
上面就是一个Makefile和Kconfig应用的一个例子,可以让我们更加形象的理解这两个文件的意义所在。