JJ_MKVMaker/tool/build_sdcpp_android.sh

44 lines
2.7 KiB
Bash

#!/bin/sh
# 123 · 121: Android (arm64) 용 stable-diffusion.cpp 의 sd-cli 를 소스에서 빌드해
# third_party/sdcpp/android/arm64-v8a/libsdcli.so 로 둔다 (APK 의 jniLibs 로 들어가 앱의 네이티브 라이브러리 폴더에서 실행된다 -
# Android 10+ 는 앱 데이터 폴더의 파일을 실행할 수 없으므로 받아서 쓰지 않는다).
# 소스: https://github.com/leejet/stable-diffusion.cpp (MIT) 커밋 고정 - Windows 실행 파일 (ai_catalog.dart 의 sdCppVersion) 과 같은 판
# CPU 만 (OpenMP 는 끈다). 두 벌 (195):
# v82 (기본) = armv8.2-a + dotprod · i8mm · fp16 → libsdcli.so (빠름, S10 · 노트 10+ 등)
# v80 = armv8-a (dotprod · fp16 없는 보급형 CPU, 예: Snapdragon 662) → libsdcli_v80.so
# 앱은 /proc/cpuinfo 의 asimddp · fphp 를 보고 고른다 (lib/app/ai_local.dart sdCli). v82 를 v8.0 CPU 에서 돌리면 SIGILL 로 죽는다.
# 사용법 (Git Bash): sh tool/build_sdcpp_android.sh [v82|v80] - Android NDK · SDK 의 cmake (tools/android-sdk) 가 필요
set -e
VARIANT=${1:-v82}
case "$VARIANT" in
v82) ARCH=armv8.2-a+dotprod+i8mm+fp16; NAME=libsdcli.so ;;
v80) ARCH=armv8-a; NAME=libsdcli_v80.so ;;
*) echo "모르는 판: $VARIANT (v82 · v80)"; exit 1 ;;
esac
APP=$(cd "$(dirname "$0")/.." && pwd)
COMMIT=228c707fde018221de74674f1c2f480a9d2b228e
SHORT=228c707
NDK_ROOT=${ANDROID_NDK:-$(ls -d "$APP"/../tools/android-sdk/ndk/* | sort | tail -1)}
CMAKE_DIR=$(ls -d "$APP"/../tools/android-sdk/cmake/* | sort | tail -1)/bin
case "$(uname -s)" in MINGW*|MSYS*|CYGWIN*) HOST=windows-x86_64; EXE=.exe ;; Darwin) HOST=darwin-x86_64; EXE= ;; *) HOST=linux-x86_64; EXE= ;; esac
TC=$NDK_ROOT/toolchains/llvm/prebuilt/$HOST/bin
WORK=${SDCPP_WORK:-${TMPDIR:-/tmp}/jj_sdcpp_android}
if [ ! -d "$WORK/src/.git" ]; then
rm -rf "$WORK" && mkdir -p "$WORK"
git clone --recursive https://github.com/leejet/stable-diffusion.cpp.git "$WORK/src"
fi
cd "$WORK/src"
git fetch --depth 1 origin "$COMMIT" 2>/dev/null || git fetch origin
git checkout -q "$COMMIT" 2>/dev/null || git checkout -q "$SHORT"
git submodule update --init --recursive
PATH="$CMAKE_DIR:$PATH"
cmake -S . -B build-android-$VARIANT -G Ninja -DCMAKE_MAKE_PROGRAM="$CMAKE_DIR/ninja$EXE" \
-DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-28 -DCMAKE_BUILD_TYPE=Release \
-DGGML_OPENMP=OFF -DGGML_CPU_ARM_ARCH=$ARCH > cmake-$VARIANT.log
cmake --build build-android-$VARIANT --target sd-cli -j 8 > build-$VARIANT.log 2>&1
OUT="$APP/third_party/sdcpp/android/arm64-v8a"
mkdir -p "$OUT"
"$TC/llvm-strip$EXE" -o "$OUT/$NAME" build-android-$VARIANT/bin/sd-cli
ls -l "$OUT/$NAME"