【求助】storage 组件编译失败:缺少 scsi-t10.h 和 pstorc.h 头文件

【求助】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 组件无法正常编译,影响整个系统的构建。

【复现路径】

  1. 设置sml和storelib_enable为true

  2. 执行编译命令:bmcgo build -r=master_dev

  3. 编译过程中在 sml_lsisml_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.hmpi2_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.hpstorc.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:14
  • sc_array.c:14
  • sc_ctrl.c:16
  • sc_misc.c:15
  • sc_ld.c:16

可能的原因

  1. 头文件缺失:这些头文件可能需要从其他仓库或第三方库获取
  2. 代码不完整:可能是代码迁移过程中遗漏了某些文件
  3. 版本不匹配:当前使用的 StoreLibIR3 版本可能不包含这些头文件

【需要帮助】

  1. scsi-t10.hpstorc.h 头文件应该从哪里获取?
  2. 是否有其他方法可以解决这个编译问题?

感谢您的帮助!

可以参考这个帖子,社区没法提供博通相关头文件,需要伙伴厂商自行获取。1230 基线 storage 组件如何编译 sml 库?

只打开sml_open是可以正常编译出包的

暂时通过这种dirty的操作处理了.

diff --git a/src/lualib-src/CMakeLists.txt b/src/lualib-src/CMakeLists.txt
index 7aabcfc..abf2a86 100644
--- a/src/lualib-src/CMakeLists.txt
+++ b/src/lualib-src/CMakeLists.txt
@@ -1,3 +1,5 @@
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/vendor/inc)
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/vendor/inc/lsi)
 ADD_SUBDIRECTORY(l_sml)
 if(CONAN_DEFS_SML_OPEN)
     ADD_SUBDIRECTORY(sml)
diff --git a/src/lualib-src/sml/CMakeLists.txt b/src/lualib-src/sml/CMakeLists.txt
index c96fd91..c90746f 100644
--- a/src/lualib-src/sml/CMakeLists.txt
+++ b/src/lualib-src/sml/CMakeLists.txt
@@ -2,7 +2,7 @@ ADD_SUBDIRECTORY(sml_base)
 ADD_SUBDIRECTORY(sml_histore)
 if (CONAN_DEFS_STORELIB_ENABLE)
     ADD_SUBDIRECTORY(sml_lsi)
-    ADD_SUBDIRECTORY(sml_pmc)
+   # ADD_SUBDIRECTORY(sml_pmc)
 endif()
 ADD_SUBDIRECTORY(pd_log_parse)
 ADD_SUBDIRECTORY(platform)
\ No newline at end of file

有个疑问: 如果想使用storage里面的storelib_enable, libmgmt_protocol应该设置成true还是false??

  - conan: libmgmt_protocol
    options:
      storelib_enable: true ## ???? 
  - conan: storage
    options: 
      sml_open: true
      storelib_enable: true

storage的storelib_enable这个宏不用管,可以删除这个宏,没有使用到

那么 libmgmt_protocol的storelib_enable 和storage应该怎么配套呢
比如我现在storage的storelib_enable和sml_open都设置成true, 那libmgmt_protocol应该怎么设置

看你要实现什么功能 storage的sml_open开启了就是sml_base目录,pd_log_parse目录,sml_histore目录是用storage仓的里,也就是自研RAID的代码都可以在蓝区改。
libmgmt_protocol仓的storelib_enable是为了带上sml_lsi和sml_pmc目录 和 对应的raid卡的so