Bitbake添加第三方GitHub仓库dbcppp编译打包报错排查
Yocto Bitbake集成dbcppp库排错方案
问题背景
- 集成目标为GitHub上的dbcppp仓库,该库可实现CAN帧读取、基于DBC文件的CAN报文解析功能,供上层应用调用
- 仓库依赖3个第三方git子模块,集成过程中先后出现do_configure阶段构建失败、打包阶段QA版本校验报错
- 相关仓库地址:dbcppp主仓库,子模块列表可查看仓库内
third-party目录
原配方的核心错误点
- 子模块拉取逻辑错误:无需为每个子模块单独编写
gitsm拉取条目,主仓库使用gitsm://协议拉取时,Bitbake会自动递归拉取所有.gitmodules中声明的子模块。单独列子模块条目会导致子模块源码被放到独立目录,不会自动同步到主仓库预期的third-party/对应路径,直接导致后续构建找不到依赖源码。 - 构建流程缺失:dbcppp项目要求先执行根目录下的configure脚本生成
config.mk文件,才能运行make指令。原配方未覆盖do_configure逻辑,Bitbake默认执行make clean时检测不到config.mk就会直接报错退出。 - 版本配置逻辑错误:
SRCREV_FORMAT参数用于多git源场景下拼接SRCPV字符串,单git源场景无需设置该参数;自定义错误的format值会导致生成的PV版本号不符合Bitbake版本排序规则,触发version-going-backwards版本回退QA报错。 - 冗余依赖拉取:libxml2在Yocto官方源已有成熟的预编译配方,无需单独从上游拉取源码编译,直接依赖系统版本即可减少兼容问题和编译耗时。
可直接使用的正确配方
将以下内容写入你自己层内的recipes-support/dbcppp/dbcppp_git.bb文件即可:
SUMMARY = "DBC format CAN signal parsing library" LICENSE = "MIT" # 首次构建如果提示LICENSE checksum不匹配,替换为Bitbake报错输出的正确md5值即可 LIC_FILES_CHKSUM = "file://LICENSE;md5=0835ade698e0bcf8506ecda2f7b4f302" # 仅需拉取主仓库,gitsm协议自动处理所有子模块 SRC_URI = "gitsm://github.com/xR3b0rn/dbcppp.git;protocol=https;branch=master" SRCREV = "${AUTOREV}" PV = "1.0+git${SRCPV}" # 依赖系统自带的libxml2库 DEPENDS = "libxml2" S = "${WORKDIR}/git" # 配置阶段:执行项目自带configure脚本生成构建配置 do_configure() { ./configure --prefix=${prefix} --build=${BUILD_SYS} --host=${HOST_SYS} } # 编译阶段:传入交叉编译参数执行make do_compile() { oe_runmake CC="${CC}" CXX="${CXX}" CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" LDFLAGS="${LDFLAGS}" } # 安装阶段:将编译产物安装到目标系统目录 do_install() { oe_runmake install DESTDIR=${D} } # 导出头文件和库文件供其他应用依赖 FILES:${PN}-dev += "${includedir}/* ${libdir}/*.so" FILES:${PN} += "${bindir}/* ${libdir}/*.so.*"
收尾操作
切换到新配方后,先执行以下命令清理之前构建残留的旧缓存和工作目录,避免版本校验报错:
bitbake -c cleanall dbcppp rm -rf tmp/pkgdata/*/runtime/dbcppp*
清理完成后重新执行bitbake dbcppp即可正常完成编译打包。
生产环境构建提示
正式发布版本不要使用${AUTOREV}拉取最新提交,需将SRCREV固定为对应稳定版本的完整commit hash,保证构建可复现。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

