#!/usr/bin/env bash # Build kazeia_decoder_chraac : sous-process décodeur statique chraac. # Link entièrement statique contre les .a chraac (libggml + libqwen3tts-decoder) # pour être autonome — aucun .so chraac sur la tablette n'est requis au runtime. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" NDK="${ANDROID_NDK_ROOT:-/opt/Kazeia/android-ndk-r27d}" CXX="$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android31-clang++" DEC_BUILD="/opt/Kazeia/kazeia-tts-decoder-ggml/build-android-chraac-fresh" DEC_SRC="/opt/Kazeia/kazeia-tts-decoder-ggml/src" CHRAAC_GGML_INC="/opt/Kazeia/chraac-llama/ggml/include" [ -f "$DEC_BUILD/libqwen3tts-decoder.a" ] || { echo "decoder.a chraac absent: $DEC_BUILD"; exit 1; } mkdir -p "$HERE/b-jni" OUT="$HERE/b-jni/kazeia_decoder_chraac" CFLAGS=( -std=c++17 -O3 -fPIE -march=armv8.6-a+i8mm+bf16+dotprod+fp16 -Wno-unused-parameter -Wno-unused-variable -Wno-sign-compare ) INCS=( -I"$DEC_SRC" -I"$CHRAAC_GGML_INC" ) # Important : --start-group / --end-group pour résoudre les références cycliques # entre libqwen3tts-decoder et ggml. Ordre: decoder.a en premier (références # ggml symbols), puis ggml-cpu, ggml-base, ggml (qui se référencent entre eux). LIBS=( "$HERE/jni/decoder_subprocess.cpp" -Wl,--start-group "$DEC_BUILD/libqwen3tts-decoder.a" "$DEC_BUILD/ggml-build/src/libggml-cpu.a" "$DEC_BUILD/ggml-build/src/libggml-base.a" "$DEC_BUILD/ggml-build/src/libggml.a" -Wl,--end-group -fopenmp -static-openmp -llog -ldl -lm ) echo "== building $OUT ==" "$CXX" "${CFLAGS[@]}" "${INCS[@]}" "${LIBS[@]}" -o "$OUT" ls -la "$OUT" echo "== check qu'il n'y a pas de dépendance .so chraac ==" "$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf" -d "$OUT" | grep -E "NEEDED|RUNPATH"