目录
- 1、内核源码Makefile编译过程
- 2、Kconfig .config Makefile
- 3、Kconfig介绍
- 3.1、配置项、配置类型
- 3.2、案例 demo
- 3.2.1、drivers/test/Kconfig
- 3.2.2、drivers/test/Makefile
- 3.2.3、drivers/Makefile
- 3.2.4、drivers/Kconfig
- 3.3、demo画面
- 3.4、kconfig和makefile关系
1、内核源码Makefile编译过程
1. 遍历每个源码目录(或配置指定的源码目录)Makefile
2. 每个目录的Makefile 会根据Kconfig来定制要编译对象
3. 回到顶层目录的Makeifle执行编译
2、Kconfig .config Makefile
- Kconfig ---> (每个源码目录下)提供选项
- .config ---> (源码顶层目录下)保存选择结果
- Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译
3、Kconfig介绍
Kconfig,在内核的每个源码目录下都存在,是为了配置哪些文件编译,哪些文件不用编译。比如:生成ARM架构的内核,执行make ARCH=arm menuconfig命令,会生成图形化界面,通过选项将需要驱动的代码添加到Makefile中一起编译,可以进行Linux内核驱动裁剪。
3.1、配置项、配置类型
1. 配置项:config XXXX,其中[XXXX],是选项配置
2. 配置类型:bool、int 、tristate
bool:配置项的可选择状态,只能是 Y 或 N,不支持编译成ko文件
int:表示该配置项是数值,配合range限制int范围, 配合default设置默认值
tristate : 配置有三种状态Y\N\M,其中M选项,表示可以编译成ko文件。
3.if XXX ... endif :如果XXX选项选中了,则在endif范围内的选项才会被选
4.choice ... endchioce --->表示选择列表
5.menu xxx ... endmenu --->表示该选项是不可选的菜单,其后是在选择列表的菜单名
3.2、案例 demo
在drivers目录下新建一个目录test,在这个目录下创建Kconfig、Makefile文件,具体内容见2.1和2.2
在test的上层drivers目录,添加Makefile与Kconfig的配置,具体内容见2.3和2.4
3.2.1、drivers/test/Kconfig
config TEST1
bool "test1 drivers"
select TEST2
help
this is for test1
config TEST2
tristate "DM9000 support"
config TEST3
int "test3 drivers" #---->该选项是一个整型值
range 4 9 #---->该选项的范围值
default 8 #---->该选项的默认值
help
this is for test3
choice #--->表示选择列表
prompt "Default I/O scheduler" #主目录名字
default DEFAULT_CFQ #默认CFQ
help
Select the I/O scheduler which will be used by default for all
block devices.
config DEFAULT_DEADLINE
bool "Deadline" if IOSCHED_DEADLINE=y
config DEFAULT_CFQ
bool "CFQ" if IOSCHED_CFQ=y
config DEFAULT_NOOP
bool "No-op"
endchoice
3.2.2、drivers/test/Makefile
obj-$(CONFIG_TEST) += test.o
当Kconfig文件配置的 TEST=y 时,表示对应目录下的test.c将被编译进内核
当Kconfig文件配置的 TEST=m时,对应目录下的test.c将被编译成模块
3.2.3、drivers/Makefile
obj-y += test/
3.2.4、drivers/Kconfig
source "drivers/test/Kconfig"
source: 内核源码目录树中每一个Kconfig都会用source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。
3.3、demo画面
在kernel根目录下执行配置画面命令:
$ make ARCH=arm menuconfig
配置画面:
3.4、kconfig和makefile关系
Makefile
usb_f_uvc-y := f_uvc.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_configfs.o
obj-$(CONFIG_USB_F_UVC) += usb_f_uvc.o
Kconfig
config USB_F_UVC
tristate
CONFIG是前缀,后面的USB_F_UVC,Kconfig通过USB_F_UVC关联到Makefile,从而找到usb_f_uvc.o,然后进行编译。
usb_f_uvc.o由f_uvc.c uvc_queue.c uvc_v4l2.c uvc_video.c uvc_configfs.c这五个模块组成。
-y: 表示将usb_f_uvc编译进内核.
-m: 表示将usb_f_uvc编译成ko模块。