点击此处查看详细分析解答
问题分析:conan build 构建 25.12 Release 包失败
根据您提供的错误信息和上下文,当前在使用 bmcgo build 命令构建 openUBMC 25.12 Release 包时,出现以下关键错误:
ERROR: luajit/2.1.0.b021@openbmc/stable: Error in source() method, line 59
git.fetch_commit(
TypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType
这表明构建流程在 Conan 执行 source() 方法拉取 luajit 组件源码时出错,根本原因是 git.fetch_commit() 接收到的路径为 None,导致 os.stat() 调用失败。
根本原因分析
结合 知识图谱信息 和 常见构建问题,该问题的根本原因可以归结为以下几点:
1. Conan 版本与 SDK 环境不匹配(核心问题)
关联信息:
- 文档
(id=4) 提到:“conan升级2.0后,本地出现组件构建bingo build出现报错:具体错误为ERROR: luajit/xx@openubmc/stable: Error in source() method”
- 多处提及
Conan 1.62.0 与 Conan 2.x 的兼容性问题。
Conan 2.x 对 source() 方法的行为和参数处理有重大变更。git.fetch_commit() 是 openUBMC 自定义的 Git 工具方法,可能依赖某些路径变量(如 source_folder)在 Conan 1.x 中自动初始化,但在 Conan 2.x 中需显式配置。
如果您的环境中 Conan 版本已升级至 2.x,而 SDK 或 conanfile.py 脚本仍按 Conan 1.x 编写,则 source_folder 等路径变量可能未正确赋值,导致传入 git.fetch_commit() 的路径为 None。
2. SDK 路径混合使用 release 与 debug 版本(环境污染)
您提供的配置:
/root/sdk 使用 release 包
/root/rtos_compiler 使用 debug 包(但 hi1711sdk.tar.gz 是 release 版)
虽然 hi1711sdk.tar.gz 是 release 版本,但 rtos_compiler 路径来自 debug 包,可能导致以下问题:
- 编译器配置(如
profile.ini)不一致。
- Conan profiles 或缓存路径中引用了调试配置。
- 工具链路径或环境变量未对齐,导致 Conan 构建时无法正确解析路径。
3. 远程 Conan 仓库配置错误
您使用的是:
conan remote add openubmc_source https://conan.openubmc.cn/openubmc_opensource
但根据知识图谱:
错误的远程可能导致:
- 下载的
conanfile.py 不完整或版本不匹配。
source() 方法中依赖的补丁、路径变量或 Git 仓库地址未正确定义。
4. 缓存污染或构建状态不一致
Conan 缓存(~/.conan2)中可能已存在部分旧版本构建数据,特别是当您混合使用不同 SDK 版本时,会导致:
luajit 包的 source_folder 路径未正确创建。
git.fetch_commit() 调用时工作目录为空或未初始化。
解决方案
步骤 1:统一 SDK 环境(必须)
确保 所有 SDK 相关路径均来自同一 release 包:
# 删除现有 sdk 和 rtos_compiler
rm -rf /root/sdk /root/rtos_compiler
# 解压 release 包中的两个 tar.gz 文件(均从 release 包获取)
tar -xzf iBMC300_5.12.0.1.tar.gz -C /root
tar -xzf iBMC300_5.12.0.1_haf.tar.gz -C /root
不要混用 debug 包中的任何文件,尤其是 rtos_compiler。
步骤 2:检查并降级 Conan 版本(关键)
确认当前 Conan 版本是否为 2.x:
conan --version
若为 Conan 2.x,请降级至 Conan 1.62.0(openUBMC 25.12 推荐版本):
pip uninstall conan
pip install conan==1.62.0
说明:openUBMC 25.12 版本主要适配 Conan 1.x,Conan 2.x 的 source() 方法调用方式不兼容,会导致路径未初始化问题。
步骤 3:配置正确的 Conan 远程仓库
删除错误的远程并添加 官方推荐的 openubmc_sdk:
conan remote remove openubmc_source
conan remote add openubmc_sdk https://conan.openubmc.cn/bmc_sdk_latest --verify ssl=False
conan remote add openubmc_dev https://conan.openubmc.cn/bmc_sdk_latest --verify ssl=False
conan remote add openubmc https://conan.openubmc.cn/artifactory/api/conan/conan --verify ssl=True
参考知识图谱:OpenUbmc_Sdk 和 OpenUbmc_Dev 均指向 https://conan.openubmc.cn/bmc_sdk_latest
步骤 4:清除 Conan 缓存
清除可能污染的缓存:
conan remove "*" -f
rm -rf ~/.conan2/p/luajit* # 清除 luajit 相关缓存
步骤 5:重新构建
cd manifest
bmcgo build -r openubmc_sdk -b openUBMC -bt release
建议先运行 bingo fetch 预下载依赖:
bingo fetch -b openUBMC -bt release
补充建议
| 建议 |
说明 |
使用 bingo build 替代 bmcgo build |
社区推荐使用 bingo build,它自动管理依赖和 Conan 配置:bingo build -t personal -b openUBMC -bt release --stage rc |
检查 profile.ini |
确保其来自 release SDK,且 build_type=Release |
查看 conanfile.py 中 source() 方法 |
确认 git.fetch_commit() 是否依赖未初始化的路径变量 |
总结
| 问题 |
原因 |
解决方案 |
TypeError: stat: path should be string... not NoneType |
Conan 2.x 与 openUBMC 1.x 脚本不兼容 |
降级至 Conan 1.62.0 |
| 构建失败 |
SDK 混合使用 release/debug |
统一使用 release 包中的 sdk 和 rtos_compiler |
| 依赖缺失 |
远程仓库地址错误 |
使用 https://conan.openubmc.cn/bmc_sdk_latest |
| 缓存问题 |
旧构建数据干扰 |
执行 conan remove "*" 清除缓存 |
推荐最终操作流程:
# 1. 清理环境
rm -rf /root/sdk /root/rtos_compiler ~/.conan2
# 2. 安装正确 Conan 版本
pip install conan==1.62.0
# 3. 解压 release SDK
tar -xzf iBMC300_5.12.0.1.tar.gz -C /root
tar -xzf iBMC300_5.12.0.1_haf.tar.gz -C /root
# 4. 配置远程
conan remote add openubmc_sdk https://conan.openubmc.cn/bmc_sdk_latest --verify ssl=False
# 5. 进入 manifest 构建
cd manifest
bingo fetch -b openUBMC -bt release
bingo build -t personal -b openUBMC -bt release --stage rc
执行上述步骤后,构建应能成功完成。