Yocto BB配方中git subrepo的SRC_URI与SRCREV配置方法
正确配置SRC_URI拉取本地子仓库提交
之前使用的SRC_URI = "git://${TOPDIR}/../repos/lib-repo/;protocol=file"配置无法拉取本地提交,本质是git://前缀搭配file协议时,BitBake的Git抓取器默认读取仓库远程引用,不会识别本地分支未推送的提交,且缺少必要的参数声明。
配置前先确认:子仓库内的代码修改必须已通过git commit提交到本地分支,工作区未暂存、未提交的修改受Git本身机制限制,无法被任何配置拉取到构建流程中。
正确的SRC_URI配置如下:
SRC_URI = "git://${TOPDIR}/../repos/lib-repo;protocol=file;nobranch=1;usehead=1"
参数说明:
protocol=file:强制使用本地文件协议访问仓库,跳过网络请求nobranch=1:关闭分支名校验,允许直接拉取本地仓库当前所在分支的提交,无需配方硬编码匹配分支名usehead=1:直接指向本地仓库当前HEAD对应的提交,不强制要求提前指定提交哈希
路径校验技巧:如果怀疑相对路径写错,可以在配方中加一行bbnote "local repo path: ${TOPDIR}/../repos/lib-repo",执行构建时会在日志中打印解析后的绝对路径,确认路径是否指向正确的子仓库位置。
自动获取本地最新提交哈希作为SRCREV取值
根据开发阶段和正式发布阶段的不同需求,有两种常用配置方式:
开发调试阶段(免手动更新哈希)
直接在配方中配置SRCREV = "${AUTOREV}",配合上面的SRC_URI参数,BitBake会在每次构建时自动读取本地子仓库当前HEAD的哈希值,只要本地子仓库有新的提交,构建时会自动识别变更、重新拉取代码,不需要手动修改配方里的哈希值,也不需要提前把提交推送到远程仓库。
如果遇到缓存导致代码不更新的问题,执行bitbake -c cleansstate <对应配方名>清除该配方的构建缓存后重新构建即可。需要固定关联本地提交的场景
如果不想用AUTOREV每次自动解析,可以在配方中加一段简单的Python函数动态读取本地子仓库的HEAD哈希,配置如下:def get_local_repo_rev(d): import subprocess repo_path = d.expand("${TOPDIR}/../repos/lib-repo") ret = subprocess.run( ["git", "-C", repo_path, "rev-parse", "HEAD"], capture_output=True, text=True ) return ret.stdout.strip() if ret.returncode == 0 else "${AUTOREV}" SRCREV = "${@get_local_repo_rev(d)}"
开发完成后正式发布版本时,直接在子仓库目录执行git rev-parse HEAD拿到当前提交哈希,替换掉SRCREV的动态取值,再把子仓库的提交推送到对应远程仓库即可。主仓库提交时会自动记录子仓库的关联状态和提交哈希,仓库关联关系完全由Git维护,不需要额外手动同步。
内容的提问来源于stack exchange,提问作者Juno

