Yocto:如何配置使用inherit module的树外内核模块配方?
问题描述
我编写了一个基于inherit module的OpenEmbedded配方,用于编译第三方树外内核模块u-dma-buf,配方代码如下:
SUMMARY = "User space mappable DMA Buffer" DESCRIPTION = "${SUMMARY}" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=bebf0492502927bef0741aa04d1f35f5" inherit module SRC_URI = "git://github.com/ikwzm/udmabuf.git" SRCREV = "9b943d49abc9c92a464e4c71e83d1c479ebbf80e" S = "${WORKDIR}/git" RPROVIDES_${PN} += "kernel-module-u-dma-buf"
该配方可正常工作,会在镜像中生成模块文件/lib/modules/[version]/extra/u-dma-buf.ko。
但项目文档显示存在默认禁用的选项CONFIG_U_DMA_BUF_MGR,启用后应同时生成/lib/modules/[version]/extra/u-dma-buf-mgr.ko。项目包含Kconfig文件,但修改Kconfig默认值不可行(因为内核源码需修改才能集成Kbuild)。
另外发现上游Makefile支持通过CONFIG_U_DMA_BUF_MGR=m在Kbuild外启用该功能,但不确定如何传递给make命令行。查看module.bbclass代码后,未发现向oe_runmake传递此类选项的机制,是否需要复制module_do_compile()并添加该配置?这是否是最优方法?
综上,在使用inherit module的前提下,针对现有配方,启用该配置选项的正确方法是什么?
解决方案
在使用inherit module的前提下,最优方法是通过扩展EXTRA_OEMAKE变量传递配置参数,无需重写整个do_compile任务,具体步骤如下:
- 在配方中添加
EXTRA_OEMAKE变量,将CONFIG_U_DMA_BUF_MGR=m传递给编译命令:
EXTRA_OEMAKE += "CONFIG_U_DMA_BUF_MGR=m"
EXTRA_OEMAKE是OpenEmbedded中专门用于向make命令追加额外参数的变量,module.bbclass在调用oe_runmake时会自动包含该变量的内容。
- 更新
RPROVIDES以包含新生成的模块:
RPROVIDES_${PN} += "kernel-module-u-dma-buf kernel-module-u-dma-buf-mgr"
最终修改后的完整配方如下:
SUMMARY = "User space mappable DMA Buffer" DESCRIPTION = "${SUMMARY}" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=bebf0492502927bef0741aa04d1f35f5" inherit module SRC_URI = "git://github.com/ikwzm/udmabuf.git" SRCREV = "9b943d49abc9c92a464e4c71e83d1c479ebbf80e" S = "${WORKDIR}/git" EXTRA_OEMAKE += "CONFIG_U_DMA_BUF_MGR=m" RPROVIDES_${PN} += "kernel-module-u-dma-buf kernel-module-u-dma-buf-mgr"
补充说明
- OpenEmbedded本身不直接集成树外模块的Kconfig到内核配置体系中,因为树外模块的Kconfig属于独立项目,无法直接复用内核的配置流程。
- 使用
EXTRA_OEMAKE是最简洁的方式,既保留了module.bbclass提供的所有编译、安装逻辑,又能传递所需的配置参数,避免重写任务带来的维护成本。
内容的提问来源于stack exchange,提问作者davidA
相关产品推荐
相关产品推荐

