
s390x build can not find quants.c
快速结论:此报错发生在对 s390x 架构编译 Ollama 0.24.0 版本时,CMake 找不到 ggml-cpu/arch/s390/quants.c 和 cpu-feats.cpp 源文件。优先排查:检查 Ollama 仓库中 ml/backend/ggml/ggml/src/ggml-cpu/arch/s390/ 目录是否存在这两个源文件。此处 CMAKE 脚本已添加 s390x 后端变体定义,但实际源文件未提交。
问题场景
用户在 openSUSE Factory 的 s390x (zSystems) 平台上执行 Ollama v0.24.0 构建流程时触发。具体操作是通过 osc build 或在构建服务(如 build.opensuse.org)上执行 RPM 构建。
报错原文
CMake Error at ml/backend/ggml/ggml/src/ggml-cpu/CMakeLists.txt:663 (target_sources):
Cannot find source file:
ggml-cpu/arch/s390/quants.c
CMake Error at ml/backend/ggml/ggml/src/ggml-cpu/CMakeLists.txt:7 (add_library):
Cannot find source file:
ggml-cpu/arch/s390/cpu-feats.cpp
CMake Error at ml/backend/ggml/ggml/src/CMakeLists.txt:251 (add_library):
No SOURCES given to target: ggml-cpu-z15
CMake Error at ml/backend/ggml/ggml/src/ggml-cpu/CMakeLists.txt:7 (add_library):
No SOURCES given to target: ggml-cpu-z15-feats
CMake Error at ml/backend/ggml/ggml/src/CMakeLists.txt:251 (add_library):
No SOURCES given to target: ggml-cpu-z16
CMake Error at ml/backend/ggml/ggml/src/ggml-cpu/CMakeLists.txt:7 (add_library):
No SOURCES given to target: ggml-cpu-z16-feats
CMake Generate step failed. Build files cannot be regenerated correctly.
原因分析
可能原因:上游 ggml 项目(ggml-org/ggml)的 s390 架构后端源码(quants.c 和 cpu-feats.cpp)在 Ollama 仓库中被遗漏了。Ollama 0.24.0 的 CMakeLists.txt 已通过 ggml_add_cpu_backend_variant_impl 和 ggml_add_cpu_backend_features 函数为 s390x(Z15/Z16)注册了 CPU 后端变体和功能特性,调用 target_sources 和 add_library 时引用了这些文件,但实际上源文件并未从 ggml 项目同步到 Ollama 仓库的相应路径下。另一种可能原因是:s390x 支持尚在开发中(相关源文件在 ggml 仓库中已存在,但 Ollama 的 vendor 过程未正确拷贝)。
环境排查
- 确认构建平台架构:
uname -m是否返回s390x - 确认 Ollama 版本:
ollama --version是否显示0.24.0(该问题在 0.24.0 中报告) - 检查 ggml 子模块/供应商目录:
ls ml/backend/ggml/ggml/src/ggml-cpu/arch/s390/是否为空 - 检查上游 ggml 项目:
https://github.com/ggml-org/ggml/tree/master/src/ggml-cpu/arch/s390是否存在quants.c和cpu-feats.cpp - 注意:Ollama 从 0.30.0 版本开始切换了 llama.cpp 引擎的集成方式,
quants.c会在基础源码中包含,但官方未在 s390x 上测试过 0.30.0 的构建。
解决步骤
- 临时 CMake 保护(可优先尝试):在
ml/backend/ggml/ggml/src/ggml-cpu/CMakeLists.txt中,于 s390 相关源文件引用位置前增加条件检查。如果arch/s390/quants.c不存在,则跳过 s390 后端变体的构建,打印警告而非硬性报错。示例逻辑(来自 Issue 评论建议):if(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x") if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ggml-cpu/arch/s390/quants.c") message(WARNING "s390x source files missing, skipping s390 backend variants") return() endif() endif() - 从上游 ggml 导入缺失源文件:从 ggml-org/ggml/src/ggml-cpu/arch/s390 下载
quants.c和cpu-feats.cpp,放入 Ollama 仓库的ml/backend/ggml/ggml/src/ggml-cpu/arch/s390/目录,然后重新构建。 - 升级 Ollama 版本:尝试升级至 0.30.0 或更高版本(官方指出 0.30.0 版本改用新的引擎集成,
quants.c包含在基础源码中——但请注意官方并未在 s390x 实际测试该版本)。 - 如果仍希望使用 0.24.0 且在 z15 大型机环境中,将上述 CMake 保护补丁应用到本地构建脚本(如 RPM spec 或 Dockerfile)中,使构建继续。
验证方法
重新运行 CMake 配置/构建流程,确认不再出现 Cannot find source file: ggml-cpu/arch/s390/quants.c 或 No SOURCES given to target 等 CMake 错误。最终验证通过 cmake --build . --target ollama 成功生成二进制文件,并尝试在 s390x 机器上执行 ollama serve 或 ollama run 是否正确启动。



