答案内容由AI生成,仅供参考:
25.12版本编译失败问题分析与解决方案
问题概述
用户在使用 git clone 拉取最新的 OpenUBMC 25.12 版本的 manifest 后进行编译时,构建任务卡在 work.build.conan 并最终失败,报出关键错误:
KeyError: 'pwd'
此错误发生在 Conan 执行 source() 方法过程中,导致整个构建流程中断。
根本原因分析
错误类型:KeyError: 'pwd'
-
该错误明确出现在
task.log中:libsoc_adapter/1.100.25@openubmc/stable: Calling source() in /root/.conan/p/libso87dcb2edf6a2e4/s ERROR: KeyError: 'pwd' -
pwd不是环境变量或系统命令问题,而是 Conan 在解析其**配置上下文(context)**时,尝试访问名为'pwd'的键,但该键未定义。 -
此问题常见于以下场景:
- 使用新版 Conan(如 2.x)构建旧版依赖包(如
libsoc_adapter),而其conanfile.py中存在对已弃用或变更的属性访问。 source()方法中尝试读取当前路径(self.conanfile_directory或os.getcwd()),但上下文未正确初始化。
- 使用新版 Conan(如 2.x)构建旧版依赖包(如
已知相关因素
| 项目 | 当前环境信息 |
|---|---|
| Conan 版本 | 2.13.0 |
| Bingo 版本 | 0.6.120 |
| Docker 镜像 | swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09 |
| 构建任务 | work.build.conan 执行失败 |
| 日志文件 | /root/workspace/manifest/temp/log/task.log |
| 关键报错 | KeyError: 'pwd' |
注意:Conan 从 1.x 升级到 2.x 后,内部 API 有重大变更。部分旧组件(如
libsoc_adapter)的conanfile.py可能引用了已被移除或重命名的属性(例如self.conanfile_directory被替换为self.source_folder)。
报错源文件定位
“pwd” 错误发生在哪个文件?
根据知识库和日志内容:
-
错误触发点为 Conan 包:
➤libsoc_adapter/1.100.25@openubmc/stable -
具体阶段为:
➤Calling source()阶段(即执行包的源码拉取或解压) -
错误位置推测:
def source(self): # 可能类似如下代码片段导致 KeyError current_dir = self.env["pwd"] # ❌ 错误!env 中不应直接访问 'pwd' # 或 current_dir = self.context["pwd"] # ❌ 已过时或不存在
即:libsoc_adapter 的 conanfile.py 文件中的 source() 方法尝试访问不存在的 'pwd' 键,引发 KeyError。
解决方案建议
方案一:清除 Conan 缓存并强制重建
由于 libsoc_adapter 源码文件夹已“corrupted”(损坏),建议清空其缓存:
# 进入容器后执行
conan remove libsoc_adapter/1.100.25@openubmc/stable --builds --sources --generators --packages -f
# 或清空整个本地缓存(更彻底)
rm -rf /root/.conan/p/
然后再重新运行构建命令。
方案二:检查并升级 libsoc_adapter 包
- 确认是否有更新版本的
libsoc_adapter支持 Conan 2.13.0。 - 如果没有,需联系维护者修复其
conanfile.py,替代写法如下:def source(self): # ✅ 正确方式获取路径 tools.mkdir(self.source_folder) # 而非使用 self.context['pwd'] 或 self.env['pwd']
方案三:回退 Conan 版本(兼容性应急)
如果项目尚未完全适配 Conan 2.x,可临时降级至 Conan 1.62.0(已知兼容 openubmc-bingo):
pip uninstall conan -y
pip install conan==1.62.0
注意:Conan 2.x 与 1.x 不兼容,部分命令语法不同,需确认
manifest是否支持。
方案四:替换 Docker 镜像或 SDK
当前使用的镜像是 24.04.2_25.09,但你的工程是 25.12,可能存在 SDK 不匹配。
建议:
- 使用对应
25.12的 Docker 镜像; - 或手动下载并初始化匹配的 BMC SDK:
# 示例:添加正确的远程仓库 conan remote add openubmc_dev https://conan.openubmc.cn/conan_1/ --force # 登录认证(如需要) conan user <用户名> -p <密码> -r openubmc_dev
然后重新初始化项目。
推荐操作步骤(总结)
-
清理缓存
conan remove libsoc_adapter* --all -f rm -rf /root/.conan/p/ -
确认 Conan 版本兼容性
若openubmc-bingo要求 ≤1.62.0,则降级:pip install conan==1.62.0 -
确保使用正确的 SDK 和镜像版本
建议使用与25.12对应的开发镜像或手动配置 SDK。 -
重新执行构建流程
参考资料
Task Log文件路径:/root/workspace/manifest/temp/log/task.logbuild_log路径:/root/.bmcgo_log/bingo.log- Conan 远程仓库:
- 官方地址:
https://conan.openubmc.cn/conan_1/ - SDK 地址:
https://conan.openubmc.cn/bmc_sdk_25.09
- 官方地址:
预防措施
| 措施 | 说明 |
|---|---|
| 在 CI/CD 中锁定 Conan 版本避免升级冲突 | |
.conan 缓存 |
防止缓存污染导致构建失败 |
| 每次构建使用干净容器 | |
conanfile.py |
移除对 pwd 等非法键的访问 |
如有进一步日志(如完整 task.log 中 source() 调用堆栈),可进一步定位具体哪一行代码引发错误。
相关链接: