diff --git a/backend/go/parakeet-cpp/Makefile b/backend/go/parakeet-cpp/Makefile index f9848dc34..7fc46f8e2 100644 --- a/backend/go/parakeet-cpp/Makefile +++ b/backend/go/parakeet-cpp/Makefile @@ -74,6 +74,7 @@ libparakeet.so: sources/parakeet.cpp cmake -B sources/parakeet.cpp/build-shared -S sources/parakeet.cpp $(CMAKE_ARGS) cmake --build sources/parakeet.cpp/build-shared --config Release -j$(JOBS) cp -fv sources/parakeet.cpp/build-shared/libparakeet.so* ./ 2>/dev/null || true + cp -fv sources/parakeet.cpp/build-shared/libparakeet.dylib ./ 2>/dev/null || true cp -fv sources/parakeet.cpp/include/parakeet_capi.h ./ parakeet-cpp-grpc: libparakeet.so main.go goparakeetcpp.go diff --git a/backend/go/parakeet-cpp/main.go b/backend/go/parakeet-cpp/main.go index 963056e23..9c6466b13 100644 --- a/backend/go/parakeet-cpp/main.go +++ b/backend/go/parakeet-cpp/main.go @@ -2,15 +2,17 @@ package main // Started internally by LocalAI - one gRPC server per loaded model. // -// Loads libparakeet.so via purego and registers the flat C-API entry -// points declared in parakeet_capi.h. The library name can be overridden -// with PARAKEET_LIBRARY (mirrors the WHISPER_LIBRARY / VIBEVOICECPP_LIBRARY -// convention in the sibling backends); the default looks for the .so next -// to this binary. +// Loads the parakeet shared library via purego and registers the flat +// C-API entry points declared in parakeet_capi.h. The library name can be +// overridden with PARAKEET_LIBRARY (mirrors the WHISPER_LIBRARY / +// VIBEVOICECPP_LIBRARY convention in the sibling backends); the default +// looks next to this binary for libparakeet.so on Linux and +// libparakeet.dylib on macOS. import ( "flag" "fmt" "os" + "runtime" "github.com/ebitengine/purego" grpc "github.com/mudler/LocalAI/pkg/grpc" @@ -28,7 +30,11 @@ type LibFuncs struct { func main() { libName := os.Getenv("PARAKEET_LIBRARY") if libName == "" { - libName = "libparakeet.so" + if runtime.GOOS == "darwin" { + libName = "libparakeet.dylib" + } else { + libName = "libparakeet.so" + } } lib, err := purego.Dlopen(libName, purego.RTLD_NOW|purego.RTLD_GLOBAL) diff --git a/backend/go/parakeet-cpp/package.sh b/backend/go/parakeet-cpp/package.sh index 0b580324c..af8e6b9e1 100755 --- a/backend/go/parakeet-cpp/package.sh +++ b/backend/go/parakeet-cpp/package.sh @@ -16,12 +16,15 @@ mkdir -p "$CURDIR/package/lib" cp -avf "$CURDIR/parakeet-cpp-grpc" "$CURDIR/package/" cp -avf "$CURDIR/run.sh" "$CURDIR/package/" -# libparakeet.so + any soname symlinks (libparakeet.so.X[.Y]). purego.Dlopen -# resolves it via LD_LIBRARY_PATH, which run.sh points at lib/. -cp -avf "$CURDIR"/libparakeet.so* "$CURDIR/package/lib/" 2>/dev/null || { - echo "ERROR: libparakeet.so not found in $CURDIR, run 'make' first" >&2 +# libparakeet shared lib + any soname symlinks. On Linux this is +# libparakeet.so[.X.Y]; on macOS it is libparakeet.dylib. purego.Dlopen +# resolves it via the *_LIBRARY_PATH that run.sh points at lib/. +cp -avf "$CURDIR"/libparakeet.so* "$CURDIR/package/lib/" 2>/dev/null || true +cp -avf "$CURDIR"/libparakeet.dylib "$CURDIR/package/lib/" 2>/dev/null || true +if ! ls "$CURDIR"/package/lib/libparakeet.* >/dev/null 2>&1; then + echo "ERROR: libparakeet shared library not found in $CURDIR, run 'make' first" >&2 exit 1 -} +fi # Detect architecture and copy the core runtime libs libparakeet.so links # against, plus the matching dynamic loader as lib/ld.so. @@ -48,7 +51,7 @@ elif [ -f "/lib/ld-linux-aarch64.so.1" ]; then cp -arfLv /lib/aarch64-linux-gnu/librt.so.1 "$CURDIR/package/lib/librt.so.1" cp -arfLv /lib/aarch64-linux-gnu/libpthread.so.0 "$CURDIR/package/lib/libpthread.so.0" elif [ "$(uname -s)" = "Darwin" ]; then - echo "Detected Darwin" + echo "Detected Darwin — system frameworks linked dynamically, no bundled libs needed" else echo "Error: Could not detect architecture" exit 1 diff --git a/backend/go/parakeet-cpp/run.sh b/backend/go/parakeet-cpp/run.sh index 6f371d4f0..be859f381 100755 --- a/backend/go/parakeet-cpp/run.sh +++ b/backend/go/parakeet-cpp/run.sh @@ -3,11 +3,17 @@ set -e CURDIR=$(dirname "$(realpath "$0")") -export LD_LIBRARY_PATH="$CURDIR/lib:$CURDIR:${LD_LIBRARY_PATH:-}" +if [ "$(uname)" = "Darwin" ]; then + export DYLD_LIBRARY_PATH="$CURDIR/lib:$CURDIR:${DYLD_LIBRARY_PATH:-}" + export PARAKEET_LIBRARY="$CURDIR/lib/libparakeet.dylib" +else + export LD_LIBRARY_PATH="$CURDIR/lib:$CURDIR:${LD_LIBRARY_PATH:-}" + export PARAKEET_LIBRARY="$CURDIR/lib/libparakeet.so" +fi # If a self-contained ld.so was packaged, route through it so the # packaged libc / libstdc++ are used instead of the host's (matches the -# whisper backend's runtime layout). +# whisper backend's runtime layout). Linux only. if [ -f "$CURDIR/lib/ld.so" ]; then echo "Using lib/ld.so" exec "$CURDIR/lib/ld.so" "$CURDIR/parakeet-cpp-grpc" "$@"