1.举例讲,linux-3.10\drivers\usb\Makefile截取一段:
#
# Makefile for the kernel USB device drivers.
#
# Object files in subdirectories
obj-$(CONFIG_USB) += core/
obj-$(CONFIG_USB_DWC3) += dwc3/
obj-$(CONFIG_USB_MON) += mon/
我们知道obj-y就是编译进内核,obj-m就是编译成模组生成.ko文件,在需要的时候insmod这个ko。
2.那么,obj-$(CONFIG_USB) 是哪里设置的呢?这个就是在linux-3.10\.config里面定义的,linux-3.10\.config:
#
# CONFIG_I2C_HID is not set
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
因此,带入CONFIG_USB的值y,obj-$(CONFIG_USB) += core/ 便是等于:obj-y += core/。
3.那么,CONFIG_USB=y 又是哪里确定的呢?那就是linux-3.10\drivers\usb\Kconfig,里面的一句config USB:
# ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
config USB
tristate "Support for Host-side USB"
depends on USB_ARCH_HAS_HCD
select NLS # for UTF-8 strings
---help---
Universal Serial Bus (USB) is a specification for a serial bus
subsystem which offers higher speeds and more features than the
traditional PC serial port. The bus supplies power to peripherals
and allows for hot swapping. Up to 127 USB peripherals can be
connected to a single USB host in a tree structure.
这里表示有一个定义是CONFIG_USB,它是tristate 类型,在菜单中的名字是Support for Host-side USB。对Support for Host-side USB的配置值就是CONFIG_USB的值:
当我们在menuconfig里面,设置config USB的值之后,系统提示保存.config文件。这时我们设置的值就保存在.config之中,等待编译时读取这个设置了。
4.现在我们关闭这个选项并保存:
再次查看linux-3.10.config,CONFIG_USB=y就变成了# CONFIG_USB is not set:
# CONFIG_I2C_HID is not set
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
# CONFIG_USB is not set
这时,编译时就不会链接obj-$(CONFIG_USB) += core/这部分代码了。
5.tristate 有三种取值,还有一种是M,就是编译成模块,需要的时候动态链接:
这时候我们可以看到CONFIG_USB=m了:
# CONFIG_I2C_HID is not set
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=m
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=m
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y