mirror of
https://github.com/mudler/LocalAI.git
synced 2026-07-31 02:18:50 -04:00
refactor(backends): extract shared package-system-libs.sh from package.sh
The arch-detect-and-copy-system-libs block (Darwin rpath / x86_64 / aarch64
loader + libc/libstdc++/libgcc_s/libm/libgomp/libdl/librt/libpthread) was
inlined verbatim in 31 backend package.sh scripts. Extract it into a single
sourced scripts/build/package-system-libs.sh, the CPU-side counterpart to
scripts/build/package-gpu-libs.sh and its sourcing contract.
Consolidating the copies fixes three drift classes that had crept in:
- libgcc_s.so.1 and libstdc++.so.6 were listed twice in 9 backends
(acestep-cpp, crispasr, moss-tts-cpp, omnivoice-cpp, piper,
qwen3-tts-cpp, silero-vad, stablediffusion-ggml, whisper); the shared
script copies each once.
- libgomp.so.1 was omitted from opus. OpenMP consumers dlopen it rather
than link it, so the missing copy only failed at runtime; the shared
script always includes it.
- the Darwin @loader_path/lib rpath was applied only in piper and
silero-vad; both now pass their packaged binary to the shared script,
preserving that behavior. Every other backend passes an empty binary
path so no rpath is added, preserving its current behavior.
Each backend's pre/post packaging steps (binary copy, run.sh, ldd closure
walks, ggml variant bundling, espeak/OpenBLAS extras, the ds4 validate step)
are preserved verbatim; only the inline if/elif/else arch block is replaced
by a single source line.
Signed-off-by: supermario_leo <leo.stack@outlook.com>
Co-authored-by: localai-org-maint-bot <bot-opensource@localaisrl.com>
63 lines
3.3 KiB
Bash
63 lines
3.3 KiB
Bash
#!/bin/bash
|
|
# Script to package the core system runtime libraries based on architecture.
|
|
# This script copies the CPU-side runtime (libc/libstdc++/libgcc_s/libm/libgomp/
|
|
# libdl/librt/libpthread + the dynamic loader) into a backend's target lib
|
|
# directory so backends run self-contained through their bundled lib/ld.so.
|
|
#
|
|
# This is the CPU-side counterpart to scripts/build/package-gpu-libs.sh and is
|
|
# sourced by backend package.sh files the same way. It consolidates the inline
|
|
# arch-detect-and-copy block that was duplicated across backends, where each
|
|
# copy had drifted: several backends listed libgcc_s.so.1 / libstdc++.so.6
|
|
# twice, and a few omitted libgomp.so.1 (which OpenMP consumers dlopen rather
|
|
# than link, so the missing copy only fails at runtime). The shared copy lists
|
|
# each library exactly once and always includes libgomp.
|
|
#
|
|
# Usage: source package-system-libs.sh <lib_dest_dir> [binary_for_darwin_rpath]
|
|
# $1 = absolute path to the destination lib directory (created if absent).
|
|
# $2 = optional path to a packaged binary that needs @loader_path/lib added
|
|
# as an LC_RPATH on Darwin so its @rpath-bundled dylibs resolve to
|
|
# package/lib/. Empty or absent skips the rpath step (no-op on Darwin).
|
|
|
|
set -e
|
|
|
|
DEST="${1:?missing lib destination directory}"
|
|
BIN_FOR_RPATH="${2:-}"
|
|
|
|
mkdir -p "$DEST"
|
|
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
# macOS has no glibc loader to bundle; system libraries are linked
|
|
# dynamically. Bundled dylibs that reference @rpath need an LC_RPATH
|
|
# pointing at lib/, otherwise dyld aborts with "no LC_RPATH's found".
|
|
echo "Detected Darwin; system libraries linked dynamically, no bundled loader needed"
|
|
if [ -n "$BIN_FOR_RPATH" ]; then
|
|
# Tolerate the case where the binary already carries this rpath.
|
|
install_name_tool -add_rpath @loader_path/lib "$BIN_FOR_RPATH" 2>/dev/null || true
|
|
fi
|
|
elif [ -f "/lib64/ld-linux-x86-64.so.2" ]; then
|
|
echo "Detected x86_64 architecture, copying x86_64 libraries..."
|
|
cp -arfLv /lib64/ld-linux-x86-64.so.2 "$DEST/ld.so"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libc.so.6 "$DEST/libc.so.6"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libgcc_s.so.1 "$DEST/libgcc_s.so.1"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libstdc++.so.6 "$DEST/libstdc++.so.6"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libm.so.6 "$DEST/libm.so.6"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libgomp.so.1 "$DEST/libgomp.so.1"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libdl.so.2 "$DEST/libdl.so.2"
|
|
cp -arfLv /lib/x86_64-linux-gnu/librt.so.1 "$DEST/librt.so.1"
|
|
cp -arfLv /lib/x86_64-linux-gnu/libpthread.so.0 "$DEST/libpthread.so.0"
|
|
elif [ -f "/lib/ld-linux-aarch64.so.1" ]; then
|
|
echo "Detected ARM64 architecture, copying ARM64 libraries..."
|
|
cp -arfLv /lib/ld-linux-aarch64.so.1 "$DEST/ld.so"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libc.so.6 "$DEST/libc.so.6"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libgcc_s.so.1 "$DEST/libgcc_s.so.1"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libstdc++.so.6 "$DEST/libstdc++.so.6"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libm.so.6 "$DEST/libm.so.6"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libgomp.so.1 "$DEST/libgomp.so.1"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libdl.so.2 "$DEST/libdl.so.2"
|
|
cp -arfLv /lib/aarch64-linux-gnu/librt.so.1 "$DEST/librt.so.1"
|
|
cp -arfLv /lib/aarch64-linux-gnu/libpthread.so.0 "$DEST/libpthread.so.0"
|
|
else
|
|
echo "Error: Could not detect architecture" >&2
|
|
exit 1
|
|
fi
|