如图,构建general_hardware组件时报错:
但是出整包正常:
报错的libmgmt_protocol/1.80.43@openubmc/stable来自于社区2509_sdk仓:
![]()
请问这个问题要如何解决?
如图,构建general_hardware组件时报错:
但是出整包正常:
报错的libmgmt_protocol/1.80.43@openubmc/stable来自于社区2509_sdk仓:
![]()
请问这个问题要如何解决?
答案内容由AI生成,仅供参考:
总结
| 项目 | 内容 |
|---|---|
| 问题根源 | libbmc_protocol 的 source() 方法中访问 'pwd' 键失败,因构建上下文缺失或缓存损坏 |
| 为何整包成功 | 整包使用现成二进制缓存,跳过了 source() 源码构建阶段 |
| 根本原因 | 本地环境不匹配(特别是 bmc_sdk 未使用官方配套版本) |
| 推荐方案 | 重新使用官方 2509 初始 bmc_sdk 环境 + 清理缓存 + 执行 bingo build -t install_sdk |
最终建议操作顺序:
rm -rf ~/sdk ~/rtos_compiler ~/.conan2/p/ # 下载官方 2509 bmc_sdk.zip,解压并复制 sdk/ rtos_compiler/ 到 ~/ cd manifest bingo build -t install_sdk bingo build general_hardware
如仍失败,请提供:
conan remote list 输出conan --versionbmc_sdk 和 manifest 的具体来源链接我们将进一步排查。
general_hardware 组件构建报错 KeyError: 'pwd'根据您提供的信息,general_hardware 组件在使用 conan create 构建时失败,错误信息为:
ERROR: KeyError: 'pwd'
ERROR: 执行命令 conan create --name general_hardware ...
尽管如此,整包构建却可以正常完成。下面将结合知识库中的上下文,对问题进行深入分析并提供解决方案。
KeyError: 'pwd'ConanException),由 KeyError 触发。KeyError.Pwd 是指在执行 source() 方法时,无法在上下文中找到 'pwd' 键。libbmc_protocol/1.80.43@openubmc/stable 的 source() 方法中调用时触发。conan create ... → 下载/解压依赖 → libbmc_protocol → source() → 调用 'pwd' → KeyError
关键点:该问题并非
general_hardware本身代码导致,而是其依赖项libbmc_protocol在源码处理阶段因环境变量或配置缺失而崩溃。
从您附带的日志可以看出:
libgmm_protocol/1.80.43@openumbc/stable: Already installed! (4 of 128)
注意:包名为
libgmm_protocol,而报错包是libbmc_protocol—— 存在命名差异。
进一步分析:
| 场景 | 包管理行为 |
|---|---|
| 整包构建 | 直接安装已构建好的二进制缓存(Cache),跳过了 source() 阶段 |
单独构建 general_hardware |
触发从源码构建依赖项(Build missing),导致进入 source() 流程 |
因此,根本原因在于:当 Conan 遇到未缓存或强制重建的依赖时,会尝试从源码构建,从而触发 source() 中对 'pwd' 的访问,但当前上下文未正确初始化,导致 KeyError。
source() 方法可能依赖一个名为 'pwd' 的键(代表当前工作目录路径),但在某些构建流程中未注入。WARN: Trying to remove corrupted source folder 提示,表明源码目录可能已损坏。bmc_sdk 或 manifest 来源不一致。“这种问题一般为开发者本地 bmc_sdk 和当前版本依赖不配套”
bmc_sdk 环境这是最常见且有效的解决方式。
确认当前构建版本为 2509
# 检查 manifest 分支
git branch
git log -n1
清理旧环境
rm -rf ~/sdk ~/rtos_compiler ~/.conan2/p/
下载官方配套的 2509 bmc_sdk 初始包
bmc_sdk.zipsdk 和 rtos_compiler 到 ~ 目录重新执行依赖安装
cd manifest
bingo build -t install_sdk
再尝试构建组件
bingo build general_hardware
注意:许多用户反馈即使版本看似一致,也因非官方渠道获取的
bmc_sdk导致问题。务必使用官方发布的初始环境包。
如果目标是快速构建组件,而非调试依赖项,应避免触发 source() 阶段。
显式指定使用远程二进制(不构建缺失项):
conan create . --build=never
或仅构建目标组件本身,其他依赖全部使用缓存:
conan create . --build=general_hardware/*
原理:通过
--build=never或--build=<your_component>防止 Conan 对libbmc_protocol等依赖执行source(),从而绕过KeyError。
2.x,而某些旧版组件(如 libbmc_protocol)的 conanfile.py 可能存在向后兼容问题。2.24.0):conan --version
pip install conan==2.24.0
如果确认包已损坏,执行:
# 清除特定包缓存
conan remove libbmc_protocol/1.80.43@openubmc/stable -f
# 或清除所有
conan remove "*" -f
然后重新运行构建,允许它从远程下载完整包。
| 措施 | 说明 |
|---|---|
确保 bmc_sdk、manifest、docker 镜像版本严格配套 |
|
| 防止旧/损坏缓存干扰新构建 | |
bingo build -t install_sdk |
确保依赖项正确安装 |
conan remote list |
验证远程仓库配置无误 |
pwd 的用途虽然具体实现未披露,但从逻辑推断:
conanfile.py 的 source() 方法中,可能存在如下代码:def source(self):
self.run(f"tar -xzf {self.conan_data['sources'][self.version]['url']} -C {self.conf.get('user.pwd')}")
self.conf.get('user.pwd') 未设置,则触发 KeyError: 'pwd'。该问题反映了一个配置缺陷:不应将关键路径信息以未保护方式访问。
| 项目 | 内容 |
|---|---|
| 问题根源 | libbmc_protocol 的 source() 方法中访问 'pwd' 键失败,因构建上下文缺失或缓存损坏 |
| 为何整包成功 | 整包使用现成二进制缓存,跳过了 source() 源码构建阶段 |
| 根本原因 | 本地环境不匹配(特别是 bmc_sdk 未使用官方配套版本) |
| 推荐方案 | 重新使用官方 2509 初始 bmc_sdk 环境 + 清理缓存 + 执行 bingo build -t install_sdk |
最终建议操作顺序:
rm -rf ~/sdk ~/rtos_compiler ~/.conan2/p/ # 下载官方 2509 bmc_sdk.zip,解压并复制 sdk/ rtos_compiler/ 到 ~/ cd manifest bingo build -t install_sdk bingo build general_hardware
如仍失败,请提供:
conan remote list 输出conan --versionbmc_sdk 和 manifest 的具体来源链接我们将进一步排查。
上周不管是整包构建还是组件构建都可以,且之后没有手动修改过本地sdk、bingo、bmcgo的版本,为何本周不行了,请问应该如何定位导致二进制组件不可用的具体变动点?
请详细列出构建general_hardware的依赖日志
并列出conan remote list
着重看依赖组件的版本和整包构建是否存在明显差异
找到原因了,虽然直接报错是libmgmt_protocol,但是异常的版本不只是这个组件,应该是存在依赖关系,还有libmc4lua和libsoc_adapter。将这两个组件的版本号修正就好了。
应该是在已经出过一次整包的情况下(二进制缓存本地都有了),我构建组件时就没有再指定conan仓,结果编译时自动从错误的conan仓拉了版本更高的组件。
在编译组件时可新增参数-nc,这样可以使用本地缓存不再去远程仓更新版本