已合并
feat(build): add one-click build_all.sh and per-platform SDK build scripts #145
feat(build): add one-click build_all.sh and per-platform SDK build scripts #145
已合并
llluohx创建于 12 天前
llluohx
12 天前

feat(build): add one-click build_all.sh and per-platform SDK build scripts

  • scripts/build_all.sh: download deps → build deps → build SDK for
    macos/linux/android/ios/harmony via --target; MNN enabled / llama.cpp
    disabled by default; deps and SDK always clean-build.
  • Add scripts/macos/build_sdk.sh and scripts/linux/build_sdk.sh (SDK-only).
  • android/harmony build_sdk.sh: --clean no longer wipes the shared
    deps/build//install prefix that also holds MNN.
  • Unify Android NDK env priority (ANDROID_NDK > ANDROID_NDK_HOME >
    ANDROID_NDK_ROOT) across build_mnn.sh / build_openssl.sh / build_sdk.sh.
  • test/CMakeLists.txt: raise gtest discovery timeout to 60s to avoid build-time
    timeouts under parallel load.

Signed-off-by: Luo Hongxia luohongxia2@h-partners.com

likedislike
Pull Request已成功合入, 合并人@FFLee
(感谢 llluohx 的贡献)
Lllluohx
12 天前 强制推送  5 个提交:4c22d5c7-4 commits from branch main9438b64e-feat(build): add one-click build_all.sh and per-platform SDK build scripts
linhan
linhan成员
12 天前 评论:

✅ WatchCI · success

  • project: smartserve
  • sha: 2ecaeb46
  • duration: 417s
  • attempts: 1
  • exit: 0
  • updated: 2026-08-17 08:58:07
  • 详情
likedislike
Lllluohx
12 天前 强制推送  1 个提交:d1185d61-feat(build): add one-click build_all.sh and per-platform SDK build scripts
Lllluohx
12 天前 强制推送  1 个提交:8b755189-feat(build): add one-click build_all.sh and per-platform SDK build scripts
hb
hb12 天前进行代码检视2
scripts/build_all.sh
已过期
@@ -0,0 +245,4 @@
245+ 
246+ # Always clean-build the SDK (deps are cleaned in Phase 2).
247+ SDK_ARGS=(--clean)
248+ [ "${WITH_MNN}" = false ] && SDK_ARGS+=(--no-mnn)
hb
hb12 天前评论:

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

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 95100ebe view diff detail

hb
hb12 天前进行代码检视1
scripts/build_all.sh
@@ -0,0 +246,4 @@
246+ # Always clean-build the SDK (deps are cleaned in Phase 2).
247+ SDK_ARGS=(--clean)
248+ [ "${WITH_MNN}" = false ] && SDK_ARGS+=(--no-mnn)
249+ 
hb
hb12 天前评论:

248 行将 --no-mnn 放入公共 SDK_ARGS,但:

  • Android 脚本根本不支持关闭 MNN,收到 --no-mnn 后直接退出,其 CMake 配置硬编码 ENABLE_MNN_PLUGIN=ON
  • iOS 使用的参数名是 --without-mnn,收到 --no-mnn 后直接退出。

因此文档中宣称适用于所有平台的 --no-mnn 实际只支持 macOS、Linux 和 HarmonyOS。

likedislike
hb
hb12 天前进行代码检视2
scripts/build_all.sh
已过期
@@ -0,0 +256,4 @@
256+ "${SCRIPT_DIR}/linux/build_sdk.sh" "${SDK_ARGS[@]}" \
257+ $([ "${BUILD_TYPE}" = "Debug" ] && echo --debug) -j "${JOBS}"
258+ ;;
259+ android)
hb
hb12 天前评论:

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。
likedislike
hb
hb
11 天前 评论:

Android 和 iOS 独立脚本的 --help 文本尚未列出已经支持的 --debug/--release,属文档一致性问题。

建议在各自 Options 中补充

hb
hb12 天前进行代码检视3
scripts/linux/build_sdk.sh
已过期
@@ -0,0 +79,4 @@
79+ 
80+if [ "${CLEAN}" = 1 ]; then
81+ echo "Cleaning ${BUILD_DIR}"
82+ rm -rf "${BUILD_DIR}"
hb
hb12 天前评论:

传错项目根目录、用户目录等路径可能删除大量非构建文件。

建议清理前规范化路径,并至少拒绝空路径、/、项目根目录和用户主目录

更稳妥的是限制清理目标必须位于项目 build/ 下。

likedislike
hb
hb
11 天前 评论:

该问题已做保护,但修复不完整,仍存在路径绕过风险。

例如以下路径仍会通过白名单:

--build-dir /home/ubuntu/ss/build/../docs

字符串满足:/home/ubuntu/ss/build/*rm -rf 实际删除的是:/home/ubuntu/ss/docs

中间符号链接也可能绕过:build/link/subdir。如果 link 指向项目外,删除操作可能落到项目外部。

结论:白名单缺少规范化,可被 .. 或中间符号链接绕过

System
系统消息系统
11 天前 评论:

changed this line on 2ecaeb46 view diff detail

hb
hb12 天前进行代码检视3
scripts/macos/build_sdk.sh
已过期
@@ -0,0 +79,4 @@
79+ 
80+if [ "${CLEAN}" = 1 ]; then
81+ echo "Cleaning ${BUILD_DIR}"
82+ rm -rf "${BUILD_DIR}"
hb
hb12 天前评论:

同上:

传错项目根目录、用户目录等路径可能删除大量非构建文件。

建议清理前规范化路径,并至少拒绝空路径、/、项目根目录和用户主目录

更稳妥的是限制清理目标必须位于项目 build/ 下。

likedislike
hb
hb
11 天前 评论:

同上,尚未完全修复

System
系统消息系统
11 天前 评论:

changed this line on 2ecaeb46 view diff detail

hb
hb12 天前进行代码检视2
scripts/build_all.sh
已过期
@@ -0,0 +181,4 @@
181+# ── Phase 1: download dependency repos ───────────────────────────────────────
182+if [ "${SKIP_DOWNLOAD}" = false ]; then
183+ echo -e "${BLUE}== Phase 1/4: Download dependency repos ==${NC}"
184+ SUBMODULE_ARGS=(--base --tests --with-openssl)
hb
hb12 天前评论:

此处无条件向初始化脚本传递 --tests,但所有新增 SDK 构建入口都关闭了 SMARTSERVE_BUILD_TESTS,顶层流程本身也没有测试阶段。

这会额外下载 googletest,增加首次构建的网络和磁盘开销。

建议仅在确实构建测试目标时初始化测试依赖。

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 95100ebe view diff detail

hb
hb12 天前进行代码检视2
scripts/harmonyos/build_sdk.sh
@@ -191,3 +186,4 @@
186+# scripts/harmonyos/build_openssl.sh or scripts/build_all.sh.
191187 
192188# Build the Harmony OpenSSL on demand so a fresh clone needs only this script.
193189# Only the default prefix is auto-built; a caller-supplied --deps-dir is treated
hb
hb12 天前评论:

基线版本中:

  • 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

likedislike
hb
hb
11 天前 评论:

两个脚本都实现了 --rebuild-openssl,但各自的 --help 文本以及跨平台构建指南尚未列出该参数。

独立脚本用户很难发现这个解决方案。

补充类似注释:

--rebuild-openssl  Rebuild OpenSSL while preserving other dependencies suc
hb
hb12 天前进行代码检视1
test/CMakeLists.txt
@@ -40,3 +40,3 @@
4040 
4141function(smartserve_add_gtest target_name test_prefix)
42- cmake_parse_arguments(ARG "" "TIMEOUT" "" ${ARGN})
42+ cmake_parse_arguments(ARG "" "TIMEOUT;DISCOVERY_TIMEOUT" "" ${ARGN})
hb
hb12 天前评论:

CMakeLists 根配置声明 cmake_minimum_required(VERSION 3.10),而此处使用 DISCOVERY_TIMEOUT

CMake 3.10.0~3.10.2 不支持 DISCOVERY_TIMEOUT,参数可能被忽略,导致本次将 discovery timeout 提高到 60 秒的修复不生效。

CMake 官方文档确认:

最低版本声明没有覆盖所用功能

image.png

我的建议是提高到 3.10.3:

cmake_minimum_required(VERSION 3.10.3)

如果采纳,需要同步的三处

  1. CMakeLists.txt:cmake_minimum_required(VERSION 3.10) → VERSION 3.10.3;
  2. docs/build/cross_platform_sdk_build_guide.md:19:cmake >= 3.10 → >= 3.10.3;
  3. docs/build/cross_platform_binary_build_guide.md:8:同上。

AGENTS.md 的文档同步要求,后两处必须跟着改,否则声明的构建要求与实际不符。

likedislike
hb
hb12 天前进行代码检视2
deps/build_openssl.sh
@@ -48,3 +48,3 @@
4848BUILD_SHARED=ON # For Android: shared library by default
4949 
50-# Auto-detect NDK from environment variables
50+# Auto-detect NDK from environment variables. Keep the same priority as
hb
hb12 天前评论:

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,并列出另外两个兼容变量。

likedislike
hb
hb
11 天前 评论:

还有一个很轻微的遗漏:实际执行 ./deps/build_openssl.sh --help 时,动态帮助只显示:

Android-specific options (when --target android):
  --ndk-path PATH   Android NDK path

没有说明环境变量和优先级。虽然头部注释和错误提示已经正确,但用户通常只看 --help。建议同步为:

--ndk-path PATH   Android NDK path (auto: ANDROID_NDK > ANDROID_NDK_HOME > ANDROID_NDK_ROOT)"
hb
hb12 天前进行代码检视2
scripts/build_all.sh
@@ -0,0 +143,4 @@
143+ fi
144+ ;;
145+ harmony)
146+ local _sdk="${OHOS_SDK_HOME:-${HARMONYOS_SDK_HOME:-}}"
hb
hb12 天前评论:

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

会出现:

  1. 顶层预检通过;
  2. OpenSSL 阶段能够找到 SDK;
  3. MNN 阶段 OHOS_SDK 为空;
  4. Linux 上没有 macOS 默认路径,最终报 SDK 未配置。
  5. 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

同时更新其错误提示,列出所有支持的变量。

likedislike
hb
hb
11 天前 评论:

还有个轻微问题:
build_mnn.sh 的帮助文本仍只写:

--ohos-sdk PATH (or set OHOS_SDK_HOME)

需补充 HARMONYOS_SDK_HOMEOHOS_SDK_NATIVE

hb
hb12 天前进行代码检视1
scripts/build_all.sh
@@ -0,0 +143,4 @@
143+ fi
144+ ;;
145+ harmony)
146+ local _sdk="${OHOS_SDK_HOME:-${HARMONYOS_SDK_HOME:-}}"
hb
hb12 天前评论:

另外不对称是双向的:build_mnn.sh 还认 OHOS_SDK 这个变量,而另两个脚本不认。

likedislike
hb
hb12 天前进行代码检视3
scripts/linux/build_sdk.sh
已过期
@@ -0,0 +103,4 @@
103+ -DMNN_ROOT="${MNN_ROOT}" \
104+ -DLLAMACPP_ROOT="${LLAMACPP_ROOT}" \
105+ -DOPENSSL_ROOT_DIR="${DEPS_INSTALL}" \
106+ -DOPENSSL_DIR="${DEPS_INSTALL}"
hb
hb12 天前评论:

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

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 95100ebe view diff detail

hb
hb
11 天前 评论:

有一个代码风格问题:现在 OPENSSL_ROOT_DIR 已成为 CMake 命令最后一个参数,但行尾仍保留反斜杠

hb
hb12 天前进行代码检视3
scripts/macos/build_sdk.sh
已过期
@@ -0,0 +103,4 @@
103+ -DMNN_ROOT="${MNN_ROOT}" \
104+ -DLLAMACPP_ROOT="${LLAMACPP_ROOT}" \
105+ -DOPENSSL_ROOT_DIR="${DEPS_INSTALL}" \
106+ -DOPENSSL_DIR="${DEPS_INSTALL}"
hb
hb12 天前评论:

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

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 95100ebe view diff detail

hb
hb
11 天前 评论:

同上

hb
hb12 天前进行代码检视2
test/CMakeLists.txt
已过期
@@ -44,2 +44,4 @@
4444 set(ARG_TIMEOUT 120)
4545 endif()
46+ if(NOT ARG_DISCOVERY_TIMEOUT)
47+ set(ARG_DISCOVERY_TIMEOUT 60)
hb
hb12 天前评论:

建议统一维护,可以在文件顶部定义常量:

set(SMARTSERVE_GTEST_DISCOVERY_TIMEOUT 60)

然后 smartserve_add_gtest() ,smartserve_gewu_session_test, smartserve_api_test三处引用它。

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 95100ebe view diff detail

Lllluohx
11 天前 强制推送  1 个提交:95100ebe-feat(build): add one-click build_all.sh and per-platform SDK build scripts
Lllluohx
11 天前 强制推送  1 个提交:a124173f-feat(build): add one-click build_all.sh and per-platform SDK build scripts
Lllluohx
11 天前 强制推送  1 个提交:27ca6212-feat(build): add one-click build_all.sh and per-platform SDK build scripts
hb
hb11 天前进行代码检视1
scripts/android/build_sdk.sh
@@ -18,6 +18,7 @@
1818# --build-dir <dir> CMake build dir (default: <repo>/build_android_arm64)
1919# --android-api <N> Min SDK level (default: 21)
2020# --with-perf-stats Enable performance statistics (model load, prefill, decode)
21+# --no-mnn Disable the MNN plugin (default: enabled)
2122# --clean Wipe build dir before configuring
2223# -j <N> Parallel jobs (default: nproc)
2324#
@@ -46,6 +47,9 @@ ANDROID_API="21"
4647ABI="arm64-v8a"
4748CLEAN=0
4849ENABLE_PERF_STATS=0
50+ENABLE_MNN=1
hb
hb11 天前评论:

android/build_sdk.sh 在 line 30 启用了 set -u,当 --no-mnnENABLE_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
likedislike
Lllluohx
11 天前 强制推送  1 个提交:ffe3334b-feat(build): add one-click build_all.sh and per-platform SDK build scripts
Lllluohx
11 天前 强制推送  1 个提交:392bbb4c-feat(build): add one-click build_all.sh and per-platform SDK build scripts
Lllluohx
11 天前 强制推送  1 个提交:e37b504e-feat(build): add one-click build_all.sh and per-platform SDK build scripts
hbhb
11 天前 解决了最后一个问题
linhan
linhan成员11 天前进行代码检视2
scripts/linux/build_sdk.sh
已过期
@@ -0,0 +1,1 @@
1+#!/usr/bin/env bash
2+# =============================================================================
linhan
linhan11 天前评论:

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

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 2ecaeb46 view diff detail

linhan
linhan成员11 天前进行代码检视2
scripts/macos/build_sdk.sh
已过期
@@ -0,0 +1,0 @@
1+#!/usr/bin/env bash
linhan
linhan11 天前评论:

建议不新增该文件,理由同前。

likedislike
System
系统消息系统
11 天前 评论:

changed this line on 2ecaeb46 view diff detail

Lllluohx
11 天前 强制推送  1 个提交:2ecaeb46-feat(build): add one-click build_all.sh and per-platform SDK build scripts
此处折叠了8条事件消息 查看更多
FFLeeFFLee成员
8 天前 合入了pull request,合并节点 SHA:b745f4f682d4f14c4e4608eb9eb4b4faf848989b