Buildroot外部多自定义内核模块编译异常问题求助
解决Buildroot外部树多内核模块编译异常问题
问题根源
多模块编译异常的核心原因是:各模块的.mk配置文件未正确指定自身的本地源文件路径,导致Buildroot无法准确同步对应模块的代码文件,甚至出现路径冲突,最终引发编译失败或文件同步错误。
具体修复步骤
1. 修正每个模块的.mk配置文件
确保每个模块的.mk文件明确指定自身的本地源路径,且使用local作为源获取方式(因为是本地代码,无需下载)。
示例:kmod-example.mk
KMOD_EXAMPLE_VERSION = 1.0 # 指向当前模块在外部树中的绝对路径 KMOD_EXAMPLE_SITE = $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel-modules/kmod-example KMOD_EXAMPLE_SITE_METHOD = local # 编译指令:调用内核源码目录的Makefile编译模块 define KMOD_EXAMPLE_BUILD_CMDS $(MAKE) -C $(LINUX_DIR) M=$(@D) modules endef # 安装指令:将编译好的模块安装到目标根文件系统 define KMOD_EXAMPLE_INSTALL_TARGET_CMDS $(MAKE) -C $(LINUX_DIR) M=$(@D) modules_install INSTALL_MOD_PATH=$(TARGET_DIR) endef $(eval $(kernel-module))
示例:kmod-notifier-exmp.mk
KMOD_NOTIFIER_EXMP_VERSION = 1.0 KMOD_NOTIFIER_EXMP_SITE = $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel-modules/kmod-notifier-exmp KMOD_NOTIFIER_EXMP_SITE_METHOD = local define KMOD_NOTIFIER_EXMP_BUILD_CMDS $(MAKE) -C $(LINUX_DIR) M=$(@D) modules endef define KMOD_NOTIFIER_EXMP_INSTALL_TARGET_CMDS $(MAKE) -C $(LINUX_DIR) M=$(@D) modules_install INSTALL_MOD_PATH=$(TARGET_DIR) endef $(eval $(kernel-module))
2. 修正父级kernel-modules.mk配置
确保父级mk文件仅负责包含子模块的配置,不要添加可能覆盖子模块路径的逻辑:
# 自动包含所有子模块的.mk文件 include $(sort $(wildcard $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel-modules/kmod-*/kmod-*.mk)) # 或手动指定(更稳妥) # include $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel-modules/kmod-example/kmod-example.mk # include $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/package/kernel-modules/kmod-notifier-exmp/kmod-notifier-exmp.mk
3. 验证模块本地Makefile正确性
每个模块目录下的Makefile需符合内核模块编译规范,示例:
obj-m += kmod-example.o all: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
4. 清理Buildroot缓存并重新编译
由于之前的错误编译会留下缓存文件,需先清理再重新构建:
# 删除两个模块的构建目录 rm -rf output/build/kmod-example output/build/kmod-notifier-exmp # 重新编译指定模块 make kmod-notifier-exmp # 或编译所有模块 make kmod-example kmod-notifier-exmp
5. 验证Config.in层级配置
确保外部树的Config.in层级正确,让Buildroot能识别所有模块:
- 外部树根目录
Config.in:source "$BR2_EXTERNAL_KERNEL_MODULE_PATH/package/kernel-modules/Config.in" kernel-modules/Config.in:source "$BR2_EXTERNAL_KERNEL_MODULE_PATH/package/kernel-modules/kmod-example/Config.in" source "$BR2_EXTERNAL_KERNEL_MODULE_PATH/package/kernel-modules/kmod-notifier-exmp/Config.in"
内容的提问来源于stack exchange,提问作者mrigendra
相关产品推荐
相关产品推荐

