BitBake中oe_runmake编译Rockchip板TP-Link内核驱动失败原因
解决TP-Link TU09 USB WiFi模块内核模块编译失败问题
问题背景
尝试为Rockchip开发板(Radxa Zero 3W)编译TP-Link TU09 USB WiFi模块的内核模块,已准备好本地驱动源码,使用的BitBake配方如下:
DESCRIPTION = "Kernel module for compiling TP-Link T9UH USB dongle" # Licenses are not handled here LICENSE = "CLOSED" LIC_FILES_CHKSUM = "" # Prepare recipe to handle a non-standard driver as part of the build SRC_URI = "file://${TOPDIR}/../T9UH_Driver/src.tar.xz;protocol=file" # We don't need to track versions for now SRCREV = "${AUTOREV}" # Set the work directory that gets cleared out on a make failure CLEANBROKEN = "1" S = "${WORKDIR}/src" # Set the extra flags needed flag EXTRA_OEMAKE += "CONFIG_PLATFORM_ROCKCHIP=y \ CONFIG_PLATFORM_I386_PC=n \ CONFIG_PLATFORM_ANDROID_X86=n" # Build as a *.ko module inherit module # Do the standard compilation (make) do_compile() { oe_runmake -C ${S} } # Ensure the kernel module is copied to the correct directory once it's compiled and built do_install() { install -d ${D}/lib/modules/${KERNEL_VERSION}/extra install -m 0755 ${S}/8814au.ko ${D}/lib/modules/${KERNEL_VERSION}/extra } # Add the module to the kernel modules package FILES_${PN} = "${base_libdir}/modules/${KERNEL_VERSION}/extra/*.ko" # Add module to the dependencies to ensure it's installed correctly RDEPENDS_${PN} = "kernel-module-${KERNEL_VERSION}" # Specify the module dependencies MODULE_DEPENDS = "cfg80211" COMPATIBLE_MACHINE = "${MACHINE}"
执行bitbake -k t9uh-driver-radxa触发编译后,log.docompile出现如下错误:
DEBUG: Executing shell function do_compile NOTE: make -j 8 CONFIG_PLATFORM_ROCKCHIP=y CONFIG_PLATFORM_I386_PC=n CONFIG_PLATFORM_ANDROID_X86=n KERNEL_SRC=/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work-shared/radxa-zero-3w/kernel-source -C /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src make: Entering directory '/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src' make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- -C M=/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src modules make[1]: Entering directory '/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src' make[1]: Leaving directory '/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src' make[1]: *** M=/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src: No such file or directory. Stop. make: *** [Makefile:1714: modules] Error 2 make: Leaving directory '/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src' ERROR: oe_runmake failed WARNING: /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099:173 exit 1 from 'exit 1' WARNING: Backtrace (BB generated script): #1: bbfatal_log, /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099, line 173 #2: die, /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099, line 157 #3: oe_runmake, /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099, line 152 #4: do_compile, /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099, line 147 #5: main, /home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/temp/run.do_compile.4132099, line 186
已确认驱动源码存在于/home/mydev/Radxa_Zero_3W/build-radxa-zero-3w/tmp/work/radxa_zero_3w-poky-linux/t9uh-driver-radxa/1.0/src目录,配方文件位于/home/mydev/Radxa_Zero_3W/,编译却立即失败。
问题根源
从错误日志可见,子make命令的-C参数后为空值,未指定内核源码目录:
make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- -C M=/home/.../src modules
这是因为自定义的do_compile函数覆盖了module继承类的默认编译逻辑,而module类原本会自动传入内核源码路径作为-C的参数。
修复方案
方案1:移除自定义do_compile函数(推荐)
module继承类已封装标准的内核模块编译流程,无需手动编写do_compile。直接删除配方中的以下代码段:
do_compile() { oe_runmake -C ${S} }
删除后,BitBake会自动使用module类的默认逻辑,正确传递内核源码路径及其他编译参数。
方案2:手动指定内核源码路径(不推荐)
若必须保留自定义do_compile,需在oe_runmake中明确传入内核源码目录:
do_compile() { oe_runmake -C "${STAGING_KERNEL_DIR}" M="${S}" }
其中${STAGING_KERNEL_DIR}是OpenEmbedded提供的内核源码 staging 目录变量,会自动指向正确路径。
额外优化建议
- 将
RDEPENDS_${PN} = "kernel-module-${KERNEL_VERSION}"改为RDEPENDS_${PN} = "kernel-image",无需依赖具体内核版本号,适配性更强。 - 确认驱动Makefile中的
CONFIG_PLATFORM_ROCKCHIP配置是否适配Radxa Zero 3W的arm64架构。
内容的提问来源于stack exchange,提问作者Walter Christie
相关产品推荐
相关产品推荐

