Pull Request已成功合入, 合并人@FFLee
(感谢 llluohx 的贡献)构造 SDK 参数时只处理了 MNN,没有将 WITH_LLAMACPP 转换为 --with-llamacpp。
结果是 llama.cpp 会在 Phase 2 成功编译,但 macOS/Linux SDK 脚本仍使用默认值 WITH_LLAMACPP=false。最终命令显示成功,产物却不包含用户明确要求的 llama.cpp 插件。


248 行将 --no-mnn 放入公共 SDK_ARGS,但:
- Android 脚本根本不支持关闭 MNN,收到
--no-mnn后直接退出,其 CMake 配置硬编码ENABLE_MNN_PLUGIN=ON。 - iOS 使用的参数名是
--without-mnn,收到--no-mnn后直接退出。
因此文档中宣称适用于所有平台的 --no-mnn 实际只支持 macOS、Linux 和 HarmonyOS。


Android 调用会从此处传入 --debug,但 scripts/android/build_sdk.sh 中不支持该参数,命令直接失败。
iOS 分支则明确不传 Debug 参数,而iOS CMake 配置 scripts/ios/build.sh 始终硬编码为 Release。
-DCMAKE_BUILD_TYPE=Release
用户执行 --target ios --debug 时脚本仍显示 Build type: Debug,但实际生成 Release 产物,属于静默行为偏差。
建议:
- Android 增加
--debug并将CMAKE_BUILD_TYPE从硬编码 Release 改为解析值。 - iOS 增加构建类型参数,或明确拒绝
--debug,不能显示 Debug 后静默构建 Release。


传错项目根目录、用户目录等路径可能删除大量非构建文件。
建议清理前规范化路径,并至少拒绝空路径、/、项目根目录和用户主目录
更稳妥的是限制清理目标必须位于项目 build/ 下。


该问题已做保护,但修复不完整,仍存在路径绕过风险。
例如以下路径仍会通过白名单:
--build-dir /home/ubuntu/ss/build/../docs
字符串满足:/home/ubuntu/ss/build/* 但 rm -rf 实际删除的是:/home/ubuntu/ss/docs
中间符号链接也可能绕过:build/link/subdir。如果 link 指向项目外,删除操作可能落到项目外部。
结论:白名单缺少规范化,可被 .. 或中间符号链接绕过
此处无条件向初始化脚本传递 --tests,但所有新增 SDK 构建入口都关闭了 SMARTSERVE_BUILD_TESTS,顶层流程本身也没有测试阶段。
这会额外下载 googletest,增加首次构建的网络和磁盘开销。
建议仅在确实构建测试目标时初始化测试依赖。


基线版本中:
- Android
--clean会删除 OpenSSL 构建目录和共享安装前缀。 - HarmonyOS
--clean会在使用默认依赖目录时删除 OpenSSL 构建目录和安装前缀。
本次改动删除了这些逻辑。
- Android (line 135) 只检查 ssl.h 是否存在。
- HarmonyOS (line 191) 只检查既定头文件和库是否存在。
因此 OpenSSL submodule 指针或源码更新后,独立运行:
./scripts/android/build_sdk.sh --clean
./scripts/harmonyos/build_sdk.sh --clean
会继续复用旧产物。改变了 --clean 的语义。
建议:为 SDK 脚本增加独立选项,例如 --rebuild-openssl


CMakeLists 根配置声明 cmake_minimum_required(VERSION 3.10),而此处使用 DISCOVERY_TIMEOUT。
CMake 3.10.0~3.10.2 不支持 DISCOVERY_TIMEOUT,参数可能被忽略,导致本次将 discovery timeout 提高到 60 秒的修复不生效。
CMake 官方文档确认:
gtest_discover_tests()在 3.10 加入。- 3.10.1、3.10.2 使用的参数名是
TIMEOUT。 DISCOVERY_TIMEOUT从 3.10.3 才正式支持。- 参考:https://cmake.org/cmake/help/latest/module/GoogleTest.html
最低版本声明没有覆盖所用功能

我的建议是提高到 3.10.3:
cmake_minimum_required(VERSION 3.10.3)
如果采纳,需要同步的三处
CMakeLists.txt:cmake_minimum_required(VERSION 3.10) → VERSION 3.10.3;docs/build/cross_platform_sdk_build_guide.md:19:cmake >= 3.10 → >= 3.10.3;docs/build/cross_platform_binary_build_guide.md:8:同上。
按 AGENTS.md 的文档同步要求,后两处必须跟着改,否则声明的构建要求与实际不符。


Usage 中号称:
# Android-specific options (when --target android):
# --ndk-path PATH Android NDK path (auto-detected from ANDROID_NDK_HOME)
# --api-level N Android API level (default: 21)
# --abis LIST ABIs to build, comma-separated (default: arm64-v8a,armeabi-v7a)
# --static Build static library instead of shared (default: shared)
只从 ANDROID_NDK_HOME 自动检测,第 285 行也只建议设置 ANDROID_NDK_HOME
但实际优先级已经变为:
ANDROID_NDK > ANDROID_NDK_HOME > ANDROID_NDK_ROOT
属于确定的可读性/文档一致性问题,建议同步修改为:
auto-detected from ANDROID_NDK, ANDROID_NDK_HOME, or ANDROID_NDK_ROOT
错误提示(第 285 行)也应优先推荐 ANDROID_NDK,并列出另外两个兼容变量。


build_all.sh (line 145)的预检支持 OHOS_SDK_NATIVE。
harmonyos/build_sdk.sh (line 36)支持并转换它。
harmonyos/build_openssl.sh 同样支持。
但 build_mnn.sh (line 29)只读取:
OHOS_SDKOHOS SDK HOME
HARMONYOS_SDK_HOME
而且build al1.sh 的预检只把转换后的路径保存在局部变量 _sdk 中,没有导出,也没有向 MNN 调用传递 --ohos-sdk:
MNN_ARGS=(--target "${TARGET}"...)
所以仅设置:
export OHOS_SDK_NATIVE=/path/to/sdk/native
./scripts/build_all.sh --target harmony
会出现:
- 顶层预检通过;
- OpenSSL 阶段能够找到 SDK;
- MNN 阶段
OHOS_SDK为空; - Linux 上没有 macOS 默认路径,最终报 SDK 未配置。
- macOS 更糟:
build_mnn.sh:228-230 在 SDK 变量为空时会静默改用默认路径~/Library/OpenHarmony/Sdk/20,若该目录存在,MNN 会用一个与预检、OpenSSL 阶段不同的 SDK 构建,产物混进共享前缀deps/build/harmony/install而无人察觉。
建议:在 build_mnn.sh 中统一处理:
OHOS_SDK="${OHOS_SDK:-${OHOS_SDK_HOME:-${HARMONYOS_SDK_HOME:-}}}"
if [[ -z "${OHOS_SDK}" && -n "${OHOS_SDK_NATIVE:-}" ]]; then
OHOS_SDK="$(dirname "${OHOS_SDK_NATIVE}")"
fi
同时更新其错误提示,列出所有支持的变量。


OPENSSL_DIR 是项目兼容的备用变量,但这里已同时传入标准的 OPENSSL_ROOT_DIR,因此不会生效且容易让调用者误以为两个参数都必须设置,建议删除冗余参数。


changed this line on 95100ebe view diff detail
OPENSSL_DIR 是项目兼容的备用变量,但这里已同时传入标准的 OPENSSL_ROOT_DIR,因此不会生效且容易让调用者误以为两个参数都必须设置,建议删除冗余参数。


changed this line on 95100ebe view diff detail
建议统一维护,可以在文件顶部定义常量:
set(SMARTSERVE_GTEST_DISCOVERY_TIMEOUT 60)
然后 smartserve_add_gtest() ,smartserve_gewu_session_test, smartserve_api_test三处引用它。


android/build_sdk.sh 在 line 30 启用了 set -u,当 --no-mnn 时 ENABLE_MNN=0, 而 MNN)ROOT 的自动赋值仅在启用 MNN 时执行。 line 176 无条件展开:
echo " MNN : ${MNN_ROOT}"
因此未从外部设置 MNN_ROOT时:
./scripts/android/build_sdk.sh --no-mnn
通过 NDK 和 OpenSSL 检查后会在 Banner 处因 unbound variable 退出。build_all.sh --target android --no-mnn 同样受影响。
建议修复:
# :176 替换为
if [[ "${ENABLE_MNN}" == "1" ]]; then
echo " MNN : ${MNN_ROOT}"
else
echo " MNN : disabled"
fi


建议不新增该文件,理由如下:sdk主要用在端侧APP构建中,在通用平台上典型用法是构建出服务应用,通过REST请求提供推理服务。目前未遇到需要在Linux上进行sdk构建的情况,如果后续实际需要再添加,当前添加后增加维护成本。
另外该文件和macos/build_sdk.sh的重复度很高,存在代码复用可能。即便需要这个文件,当前实现也存在较多冗余。


feat(build): add one-click build_all.sh and per-platform SDK build scripts
macos/linux/android/ios/harmony via --target; MNN enabled / llama.cpp
disabled by default; deps and SDK always clean-build.
deps/build//install prefix that also holds MNN.
ANDROID_NDK_ROOT) across build_mnn.sh / build_openssl.sh / build_sdk.sh.
timeouts under parallel load.
Signed-off-by: Luo Hongxia luohongxia2@h-partners.com