目录

  • 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

配置画面:

linux 内核编译禁止 kvm_ide


linux 内核编译禁止 kvm_ide_02

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模块。