文章目录
- 1、Linux内核裁剪
-
- [1.1、使用make menuconfig情况下的工作流](#1.1、使用make menuconfig情况下的工作流)
-
- 1.1.1、加载开发板默认配置
- [1.1.2、添加自己的模块选项到make menuconfig菜单](#1.1.2、添加自己的模块选项到make menuconfig菜单)
- [1.1.3、在make menuconfig勾选刚添加的选项](#1.1.3、在make menuconfig勾选刚添加的选项)
- 1.1.4、把修改后的.config保存成新的xxx_defconfig
- 1.1.5、编译
- [1.2、不使用make menuconfig情况下的工作流](#1.2、不使用make menuconfig情况下的工作流)
- 2、总结
1、Linux内核裁剪
目标:
不使用make menuconfig,增加/减少Linux内核编译输出的模块- 搞清楚
Kconfig、.config、xxx_defconfig和Makefile之间的关系
1.1、使用make menuconfig情况下的工作流
1.1.1、加载开发板默认配置
将 arch/arm/configs/100ask_imx6ull_defconfig 复制到 Linux项目的根目录下,并重命名为为 .config
bash
$ make 100ask_imx6ull_defconfig
1.1.2、添加自己的模块选项到make menuconfig菜单
- 如果要在100ask_imx6ull_defconfig的配置基础上添加自己的配置可以👇
- 在相应的目录下编写驱动程序,例如在
drivers/input/misc/下编写100ask_adxl345-spi.c - 在
drivers/input/misc/下找到Kconfig文件并修改
bash
...
config INPUT_ADXL34X
tristate "Analog Devices ADXL34x Three-Axis Digital Accelerometer"
default n
help
Say Y here if you have a Accelerometer interface using the
ADXL345/6 controller, and your board-specific initialization
code includes that in its table of devices.
This driver can use either I2C or SPI communication to the
ADXL345/6 controller. Select the appropriate method for
your system.
If unsure, say N (but it's safe to say "Y").
To compile this driver as a module, choose M here: the
module will be called adxl34x.
...
config INPUT_ADXL34x_MOD
tristate "100ask SPI bus connection"
depends on INPUT_ADXL34X && SPI
default m
help
Say Y here if you have ADXL345/6 hooked to a SPI bus.
To compile this driver as a module, choose M here: the
module will be called 100ask_adxl34x-spi.
...
1.1.3、在make menuconfig勾选刚添加的选项
在make menuconfig的GUI界面勾选编译选项后,会修改.config的编译配置
bash
$ make menuconfig

被make menuconfig修改后的.config文件如下
bash
...
CONFIG_INPUT_ADXL34X=y
...
CONFIG_INPUT_ADXL34x_MOD=m
...
👆这些变量名都会在编译时被读取到Kconfig同级目录的Makefile中,例如drivers/input/misc/的Makefile如下所示
bash
...
obj-$(CONFIG_INPUT_ADXL34X) += adxl34x.o
...
obj-$(CONFIG_INPUT_ADXL34x_MOD) += 100ask_adxl345-spi.o
...
1.1.4、把修改后的.config保存成新的xxx_defconfig
这里的xxx_defconfig == 100ask_imx6ull_defconfig
bash
$ make savedefconfig
$ mv defconfig arch/arm/configs/my_name_defconfig
1.1.5、编译
bash
# 如果obj-m, 则👇即可
make modules
# 如果obj-y, 则👇即可
make zImage
1.2、不使用make menuconfig情况下的工作流
在1.1.3章节中,直接手工修改.config文件即可
2、总结
xxx_defconfig:文件用于记录配置好的编译配置.config:内核当前的编译配置,存在于内核的顶层目录,在make xxx_defconfig后出现,从 arch/.../configs/xxx_defconfig 生成 .configmake menuconfig:修改.config,手动编辑 .config 可替代 menuconfigKconfig:定义make menuconfig的菜单项- Kconfig同级目录的
Makefile:读取.config中的CONFIG_XXX变量来决定编译行为,通过 obj- $ (CONFIG_XXX) 响应配置