【求助】storage 组件编译失败:缺少 scsi-t10.h 和 pstorc.h 头文件
【openUBMC版本】
25.12
【问题现象及影响】
在编译 storage 组件时,出现头文件缺失的编译错误,导致构建失败。具体错误如下:
/root/.conan2/p/b/stora9047e5cff69dd/b/src/lualib-src/sml/sml_lsi/src/sl_diagnose.c:27:10: fatal error: lsi/scsi-t10.h: No such file or directory
#include "lsi/scsi-t10.h"
^~~~~~~~~~~~~~~~
/root/.conan2/p/b/stora9047e5cff69dd/b/src/lualib-src/sml/sml_pmc/src/sc_array.c:14:10: fatal error: pmc/pstorc.h: No such file or directory
#include "pmc/pstorc.h"
^~~~~~~~~~~~~~
影响:storage 组件无法正常编译,影响整个系统的构建。
【复现路径】
-
设置sml和storelib_enable为true
-
执行编译命令:
bmcgo build -r=master_dev -
编译过程中在
sml_lsi和sml_pmc模块出现头文件缺失错误
【已尝试的方法】
1. 添加 StoreLibIR3 include 路径
为了解决最初的 lsi/storelib.h: No such file or directory 错误,我进行了以下修改:
修改文件 1:src/lualib-src/l_sml/CMakeLists.txt
target_include_directories(${L_SML_LIB}
PUBLIC ${LUACLIB_SRC_DIR}
PUBLIC ${CONAN_INCLUDE_DIRS}
PUBLIC ${GLIB_INCLUDE_DIRS}
PUBLIC ${PROJECT_SOURCE_DIR}/vendor/StoreLibIR3/inc # 新增
)
修改文件 2:src/lualib-src/sml/sml_lsi/CMakeLists.txt
INCLUDE_DIRECTORIES(inc)
INCLUDE_DIRECTORIES(${GLIB_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(../smlib)
INCLUDE_DIRECTORIES(../platform)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/vendor/StoreLibIR3/inc)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/app_util/common_storeLib_hdr)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/fw/fw_sas_mega_api)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/apps/storelibir3_bmc/inc_mpi)
2. 复制必要的头文件
将 mpi2.h 和 mpi2_cnfg.h 从原始代码库复制到 vendor/StoreLibIR3/inc/lsi/ 目录:
cp 16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/apps/storelibir3_bmc/inc_mpi/mpi2.h vendor/StoreLibIR3/inc/lsi/
cp 16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/apps/storelibir3_bmc/inc_mpi/mpi2_cnfg.h vendor/StoreLibIR3/inc/lsi/
3. 临时修复未定义的宏
发现 sl_ctrl.c 中使用了未定义的 SL_UPDATE_CONTROLLER_CACHE 宏,已临时注释掉:
// libCmdParam.cmd = SL_UPDATE_CONTROLLER_CACHE; // TODO: 该宏在 storelib.h 中未定义
4. 搜索缺失的头文件
在项目中搜索了 scsi-t10.h 和 pstorc.h 文件,但未找到:
find 16.02/versionChangeSet/storelibir3_bmc_rel -name "scsi-t10.h" # 未找到
find . -name "pstorc.h" | grep -v ".conan2" # 未找到
【资源配置】
- 项目:openUBMC storage 组件
- 构建系统:CMake + Conan
- 编译器:GCC 7.3.0 (aarch64-target-linux-gnu)
- 构建类型:Debug
- 相关目录结构:
storage/ ├── vendor/StoreLibIR3/inc/lsi/ │ ├── storelib.h │ ├── mpi2.h │ └── mpi2_cnfg.h ├── 16.02/versionChangeSet/storelibir3_bmc_rel/storelib_src_rel/ │ ├── app_util/common_storeLib_hdr/ │ ├── fw/fw_sas_mega_api/ │ └── apps/storelibir3_bmc/inc_mpi/ └── src/lualib-src/sml/ ├── sml_lsi/ │ └── src/sl_diagnose.c # 需要 lsi/scsi-t10.h └── sml_pmc/ └── src/sc_array.c # 需要 pmc/pstorc.h
【问题分析】
代码中的使用情况
1. sml_lsi 模块中的使用
在 src/lualib-src/sml/sml_lsi/src/sl_diagnose.c 中:
/* 解决包含scsi-t10.h的编译问题 */
typedef U8 uchar;
typedef U16 ushort;
typedef U32 uint;
typedef U8 uint8;
typedef U64 uint64;
#include <errno.h>
#include "lsi/scsi-t10.h" // 第27行,编译失败
typedef struct _tag_controller_event {
gulong receive_timestamp;
MR_EVT_DETAIL details;
} SL_CONTROLLER_EVENT_S;
该文件中使用了 SCSI_SENSE 类型:
SCSI_SENSE *scsi_sense = NULL;
scsi_sense->fixedFormat.senseKey = mock_event->pd_sense_key & 0x0F;
2. sml_pmc 模块中的使用
在 src/lualib-src/sml/sml_pmc/ 目录下的多个文件中引用了 pmc/pstorc.h:
sc_pd.c:14sc_array.c:14sc_ctrl.c:16sc_misc.c:15sc_ld.c:16
可能的原因
- 头文件缺失:这些头文件可能需要从其他仓库或第三方库获取
- 代码不完整:可能是代码迁移过程中遗漏了某些文件
- 版本不匹配:当前使用的 StoreLibIR3 版本可能不包含这些头文件
【需要帮助】
scsi-t10.h和pstorc.h头文件应该从哪里获取?- 是否有其他方法可以解决这个编译问题?
感谢您的帮助!
