Files
2026-07-13 13:33:03 +08:00

102 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
#
# Package MNN for OpenHarmony / HarmonyOS NEXT.
#
# Requires the OpenHarmony SDK installed and either:
# * $HARMONY_HOME pointing at the SDK root (e.g. /path/to/sdk where
# `native/build/cmake/ohos.toolchain.cmake` lives), OR
# * $OHOS_SDK_NATIVE pointing directly at the SDK `native/` directory.
#
# Usage:
# ./package_scripts/harmony/build.sh -o <output_dir>
#
# Default behaviour mirrors package_scripts/android/build.sh: enables LLM
# (+ multi-modal vision / audio) and arm64 CPU acceleration (ARM82 + SME2 +
# BF16). Output layout:
#
# <output_dir>/
# arm64-v8a/
# libMNN.so
# libllm.so (when MNN_BUILD_LLM=ON)
# libMNN_Express.so (when MNN_SEP_BUILD=ON)
# libMNNOpenCV.so (when MNN_BUILD_OPENCV=ON)
# libMNNAudio.so (when MNN_BUILD_AUDIO=ON)
set -e
usage() {
echo "Usage: $0 -o <output_dir>"
echo -e "\t-o package files output directory"
exit 1
}
while getopts "o:h" opt; do
case "$opt" in
o ) path=$OPTARG ;;
h|? ) usage ;;
esac
done
if [ -z "$path" ]; then
usage
fi
# Resolve OpenHarmony SDK toolchain file.
# Prefer $OHOS_SDK_NATIVE (set by openharmony-rs/setup-ohos-sdk), then
# fall back to $HARMONY_HOME (the variable used by project/harmony/build_64.sh).
if [ -n "$OHOS_SDK_NATIVE" ]; then
OHOS_TOOLCHAIN="$OHOS_SDK_NATIVE/build/cmake/ohos.toolchain.cmake"
elif [ -n "$HARMONY_HOME" ]; then
OHOS_TOOLCHAIN="$HARMONY_HOME/native/build/cmake/ohos.toolchain.cmake"
else
echo "[harmony/build.sh] ERROR: set OHOS_SDK_NATIVE or HARMONY_HOME first." >&2
exit 1
fi
if [ ! -f "$OHOS_TOOLCHAIN" ]; then
echo "[harmony/build.sh] ERROR: ohos toolchain not found: $OHOS_TOOLCHAIN" >&2
exit 1
fi
rm -rf "$path" && mkdir -p "$path"
PACKAGE_PATH=$(realpath "$path")
mkdir -p "$PACKAGE_PATH/arm64-v8a"
# Common cmake args (kept consistent with package_scripts/android/build.sh):
# - MNN_BUILD_LLM=ON auto-enables MNN_LOW_MEMORY + MNN_SUPPORT_TRANSFORMER_FUSE
# - MNN_BUILD_LLM_OMNI=ON auto-enables MNN_BUILD_OPENCV / MNN_BUILD_AUDIO / MNN_IMGCODECS
# (vision + audio multi-modal capabilities of LLM)
CMAKEARGS="-DMNN_BUILD_LLM=ON \
-DMNN_BUILD_LLM_OMNI=ON"
# build harmony arm64
# - MNN_ARM82=ON fp16 acceleration
# - MNN_SME2=ON Arm SME2 instructions (default ON in CMakeLists.txt)
# - MNN_SUPPORT_BF16=ON bf16 ops
rm -rf build_harmony && mkdir build_harmony
pushd build_harmony
cmake .. \
-DCMAKE_TOOLCHAIN_FILE="$OHOS_TOOLCHAIN" \
-DCMAKE_BUILD_TYPE=Release \
-DOHOS_ARCH=arm64-v8a \
-DOHOS_STL=c++_shared \
-DOHOS_PLATFORM_LEVEL=12 \
-DMNN_USE_LOGCAT=ON \
-DMNN_USE_SSE=OFF \
-DMNN_ARM82=ON \
-DMNN_SME2=ON \
-DMNN_SUPPORT_BF16=ON \
-DMNN_SEP_BUILD=OFF \
-DMNN_BUILD_SHARED_LIBS=ON \
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. \
${CMAKEARGS}
make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
cp libMNN.so "$PACKAGE_PATH/arm64-v8a/"
# Optional companion libs (best-effort; ignore if static-linked into libMNN.so).
cp libllm.so "$PACKAGE_PATH/arm64-v8a/" 2>/dev/null || true
cp express/libMNN_Express.so "$PACKAGE_PATH/arm64-v8a/" 2>/dev/null || true
cp tools/cv/libMNNOpenCV.so "$PACKAGE_PATH/arm64-v8a/" 2>/dev/null || true
cp tools/audio/libMNNAudio.so "$PACKAGE_PATH/arm64-v8a/" 2>/dev/null || true
popd