linux编译配置过程,make menuconfig/.config/Kconfig的关系

本文介绍如何通过.config、Kconfig和Makefile文件来添加新功能到内核,如添加RTL8723BU WiFi驱动,并解释了这些文件的作用及它们之间的关系。

  首先要知道,内核配置跟三类文件有关,包括.config,Kconfig,Makefile,其中.config只有根目录下有,
Kconfig和Makefile在根目录和每个子目录都有,先说下他们的功能:

  • Kconfig:定义配置项
  • Makefile:说明配置项的编译方法
  • .config:控制配置项编译进内核、编译成模块还是不编译

比如我要添加个wifi功能,那么首先要在网络的子目录下的Kconfig里面添加这个wifi功能的描述,添加下面内容:

config MY_TEST_WIFI
bool “My Test wifi”

然后再在这个目录下的Makefile文件中添加这个wifi功能的编译方法,比如依赖哪些c文件和h文件,添加如下内容:

obj-$(CONFIG_MY_TEST_WIFI) += mytestwifi.o

最后再在根目录下的.config文件中添加这个功能的开关,控制这个功能直接编译进内核源码,添加如下内容:

CONFIG_MY_TEST_WIFI = y

这样就完成了新功能的添加。


make menuconfig生成的图形配置界面是根据Kconfig来的,具体的Kconfig语法看这里。当我们修改了驱动中的Kconfig文件

在这里插入图片描述
再次make menuconfig,就可以看到我们添加的wifi设备了:
在这里插入图片描述
按“y”把它编译进内核,保存
在这里插入图片描述
就可以看到根目录下的.config文件中,有了:
在这里插入图片描述

因此配置内核,我们就可以得到下面结论了:
1、添加功能涉及到3类文件:.config,Kconfig,Makefile。在Kconfig中描述功能,在Makefile中描述功能编译方法,在.config中打开功能。
2、.config可以不修改,因为修改Kconfig后,make menuconfig中就有对应条目了,在图形界面中修改对应条目实际上就是修改.config。
3、如果新的功能都添加完了,那么.config控制着每个功能的开关,因此是很重要的。make clean会清除它,因此幸幸苦苦make menuconfig裁剪完功能后,推荐它备份一下。

4、make %_defconfig命令会将arch/arm/configs/%_defconfig 文件复制为根目录下的.config 文件。因此作用和make menuconfig相同。


这么一看要添加新功能好像很容,要添加新的驱动也很容易。再用一个例子巩固下。
给开发板添加RTL8723BU驱动。
去官方上下载RTL8723BU驱动源码,地址:http://github.com/lwfinger/rtl8723bu
把源码解压后放到\drivers\net\wireless\路径下
修改\drivers\net\wireless\这个目录下的Makefile和Kconfig文件
在Kconfig文件中添加以下部分

source "drivers/net/wireless/rtl8723BU/Kconfig"

这样我们就可以在make menuconfig中配置这个驱动

在Makefile文件中添加以下部分

obj-$(CONFIG_RTL8723BU)           += rtl8723BU/

接下来就make menuconfig
但是我们不仅要加载这个驱动,还需要配置内核使其支持wifi和usb,因为RTL8723是通过USB接在开发板上面的

1.支持USB设备
在这里插入图片描述
2.支持WIFI设备
在这里插入图片描述

3.支持无线网络IEEE 802.11
在这里插入图片描述
最后是我们的RTL8723
在这里插入图片描述

我们选择将其编译为模块

Device Drivers
             Network device support
                 Wireless LAN
                      Realtek 8723B USB WiFi

然后我们编译内核

make XXXconfig(XXXconfig是你自己的配置文件)
make zImage
make modules就会生成8723bu.ko

那么当make的时候,发生了什么呢?为什么新的wifi功能就被编译进内核了呢?
我们make menuconfig

CONFIG_MY_TEST_WIFI = y

然后makefile中有:

obj-$(CONFIG_MY_TEST_WIFI) += mytestwifi.o

带入CONFIG_MY_TEST_WIFI = y有:

obj-$y += mytestwifi.o

obj-$y就是所有要编译进内核的源码的集合。之后发生了什么,有兴趣可以去研究内核编译过程。

<think>我们正在讨论Buildroot构建系统中的`make`命令,特别是`syncconfig`流程、相关配置文件路径以及环境变量`BR2_CONFIG`和`KCONFIG_AUTOHEADER`的作用。###1.Buildroot配置系统概述Buildroot使用Kconfig系统(来自Linux内核)来管理配置。用户通过`makemenuconfig`等命令配置后,会生成配置文件。Buildroot的配置流程包括:-**配置生成**:用户通过交互式界面(如`menuconfig`)修改配置,生成`.config`文件。-**同步配置**:执行`makesyncconfig`(或旧版本中的`makeoldconfig`)来更新相关文件。###2.配置文件路径详解Buildroot的关键配置文件路径如下:|文件路径|作用||----------|------||**`.config`**|主配置文件,存储用户选择的配置选项(位于Buildroot根目录)||**`Config.in`**|配置描述文件,定义配置选项的层次结构和属性(分散在各级目录)||**`output/build/autoconf.h`**|自动生成的C头文件,包含配置宏(如`BR2_PACKAGE_FOO=y`转为`#defineBR2_PACKAGE_FOO1`)||**`output/build/build-config`**|构建过程中使用的Makefile环境变量集合|###3.`syncconfig`流程详解当运行`makesyncconfig`时(通常由`makemenuconfig`等自动触发),系统执行以下步骤:1.**解析`.config`**:读取当前配置。2.**更新依赖**:-检查配置变更,更新隐藏或依赖的选项。-若删除选项,提示用户处理废弃配置(类似`oldconfig`)。3.**生成头文件**:-创建`autoconf.h`(路径由`KCONFIG_AUTOHEADER`指定)。4.**生成Makefile包含文件**:-创建`output/build/build-config`(包含所有配置Makefile变量)。###4.关键环境变量-**`BR2_CONFIG`**指定Buildroot主配置文件的路径,默认值为`$(TOPDIR)/.config`。覆盖示例(非必要不建议修改):```bashmakemenuconfigBR2_CONFIG=/custom/path/.config```-**`KCONFIG_AUTOHEADER`**指定Kconfig生成的C头文件路径,默认值为`$(BUILD_DIR)/autoconf.h`。该头文件被Buildroot构建的包广泛引用,用于条件编译。###5.配置同步示例流程```mermaidgraphLRA[makemenuconfig]-->B[修改配置]B-->C[保存生成.config]C-->D[自动触发makesyncconfig]D-->E[生成autoconf.h]D-->F[生成build-config]```###6.手动触发同步若需手动更新派生文件(如切换分支后):```bashmakesyncconfig#或旧版本中的makeoldconfig```>**注意**:Buildroot在构建时自动调用`syncconfig`,通常无需手动操作。§§相关问题§§1.Buildroot中如何自定义配置选项?2.如何解决配置迁移时的符号冲突?3.`autoconf.h`在软件包构建中如何被引用?4.配置系统如何处理依赖关系链?[^1]:Buildroot手册-配置系统章节</think>### Buildroot `make syncconfig` 流程及配置文件详解 #### 一、核心配置文件路径 1. **主配置文件** - **`$(BUILDROOT_DIR)/.config`** Buildroot 的全局配置文件,存储所有配置选项(如 `BR2_PACKAGE_*`)。由 `make menuconfig` 生成。 - **关键变量**:`BR2_CONFIG`(环境变量)指向该文件路径,默认值: ```makefile BR2_CONFIG = $(BUILD_DIR)/.config ``` 2. **自动生成头文件** - **`$(BUILD_DIR)/autoconf.h`** 包含所有配置项的 C 语言宏定义(如 `#define BR2_PACKAGE_OPENSSL 1`)。 - **关键变量**:`KCONFIG_AUTOHEADER` 指定其路径,默认值: ```makefile KCONFIG_AUTOHEADER = $(BUILD_DIR)/autoconf.h ``` 3. **Kconfig 相关文件** - **`Config.in`**:各组件(如 `package/openssl/Config.in`)的配置描述文件 - **`$(BUILD_DIR)/.kconfig.d`**:临时生成的配置依赖关系文件 #### 二、`make syncconfig` 工作流程 ```mermaid graph TD A[make menuconfig] --> B[修改 .config] B --> C[触发 make syncconfig] C --> D[解析 Config.in 文件] D --> E[生成 autoconf.h] D --> F[生成 build-config 文件] E --> G[软件包编译时包含头文件] F --> H[Makefile 读取配置变量] ``` 1. **配置同步阶段** - 当执行 `make menuconfig` 后自动触发 `syncconfig` - 解析 `.config` 和所有 `Config.in` 文件 - 生成: - `autoconf.h`(通过 `KCONFIG_AUTOHEADER` 指定路径) - `build-config`(Makefile 可包含的配置变量文件) - `.kconfig.d` 下的依赖文件 2. **头文件生成逻辑** 将 `.config` 中的配置项转换为 C 宏: ```c // autoconf.h 示例 #define BR2_PACKAGE_OPENSSL 1 #define BR2_PACKAGE_OPENSSL_VERSION "3.0.8" #undef BR2_PACKAGE_NGINX // 未启用的配置 ``` 3. **Makefile 集成** Buildroot 主 Makefile 包含 `build-config`: ```makefile -include $(BUILD_DIR)/build-config ifeq ($(BR2_PACKAGE_OPENSSL),y) include package/openssl/openssl.mk endif ``` #### 三、关键环境变量作用 | 变量名 | 默认值 | 作用 | |----------------------|----------------------------|----------------------------------------------------------------------| | `BR2_CONFIG` | `$(BUILD_DIR)/.config` | 指定主配置文件的路径,覆盖后可使用自定义配置位置 | | `KCONFIG_AUTOHEADER` | `$(BUILD_DIR)/autoconf.h` | 控制生成的配置头文件路径,影响所有软件包的预处理过程 | | `CONFIG_DIR` | `$(TOPDIR)` | 配置文件的搜索根目录(通常为 Buildroot 源码目录) | #### 四、手动调试示例 1. **强制重新生成配置**: ```bash make syncconconfig BR2_CONFIG=my_custom.config ``` 2. **查看配置传递过程**: ```bash make V=1 syncconfig # 显示详细生成步骤 ``` 3. **验证头文件内容**: ```bash grep "BR2_" $(KCONFIG_AUTOHEADER) ``` > **注意**:`syncconfig` 是 Kconfig 系统的标准步骤,确保配置变更同步到构建系统的各个层级[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值