fix(darwin): fix vibevoice-cpp build linkage + fail-safe go backend packaging - #10276
Merged
Conversation
The darwin/arm64 vibevoice-cpp image shipped the source tree with a
half-built CMake directory (build-libgovibevoicecpp-fallback.so/) and no
backend binary, so the backend could never start: run.sh exec'd a
vibevoice-cpp binary that was not in the package and LocalAI timed out
waiting for the gRPC service.
Two durable, backend-agnostic defenses:
- backend/go/vibevoice-cpp/Makefile: mirror whisper's cleanup discipline so a
partial CMake tree cannot survive into packaging. Run `make purge` before
each variant build and `rm -rfv build*` after. The old recipe only removed
its build dir after a successful `mv`, so a failed build left the half-built
tree behind.
- scripts/build/golang-darwin.sh: before creating the OCI image, remove any
stray build-* directory and assert that the binary run.sh launches actually
exists. A build that produced no binary now fails the job loudly instead of
publishing a source tree as a working backend. The binary name is derived
from run.sh's `exec $CURDIR/<binary>` line (parakeet-cpp launches
parakeet-cpp-grpc, so it is not always ${BACKEND}) with a ${BACKEND}
fallback.
The underlying native build failure that left vibevoice-cpp half-built still
needs to be reproduced and fixed on Apple Silicon; this change ensures such a
failure can never again be published as a working image.
Refs #10267
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-opus-4-8 [Claude Code]
…path)
The darwin build failed with:
No rule to make target 'vibevoice/libvibevoice.a', needed by
'libgovibevoicecpp.so'. Stop.
The upstream vibevoice project is added with add_subdirectory(... EXCLUDE_FROM_ALL),
so its `vibevoice` static-library target is only built when something links it
as a target. The Apple branch linked only `$<TARGET_FILE:vibevoice>` - a bare
archive path with no target reference - so CMake never emitted a rule to build
libvibevoice.a, while the Linux branch worked because it passes the `vibevoice`
target name inside the --whole-archive flags.
Link the `vibevoice` target on Apple (establishing the build dependency) and
apply -force_load as a separate link option to keep whole-archive semantics so
purego can dlsym the vv_capi_* symbols.
Refs #10267
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-opus-4-8 [Claude Code]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fixes #10267.
The darwin/arm64
vibevoice-cppimage shipped the source tree with a half-built CMake directory (build-libgovibevoicecpp-fallback.so/, a directory — not a.so) and no backend binary, so the backend could never start:run.shexec'd avibevoice-cppbinary that was not in the package, and LocalAI timed out waiting for the gRPC service.Root cause (the actual build failure)
CI's darwin job surfaced it directly:
The upstream vibevoice project is added with
add_subdirectory(... EXCLUDE_FROM_ALL), so itsvibevoicestatic-library target is only built when something links it as a target. The Apple link branch inbackend/go/vibevoice-cpp/CMakeLists.txtreferenced only$<TARGET_FILE:vibevoice>— a bare archive path with no target reference — so CMake never emitted a rule to buildlibvibevoice.a. The Linux branch worked because it passes thevibevoicetarget name inside the--whole-archiveflags.Change
backend/go/vibevoice-cpp/CMakeLists.txt— the real fix: on Apple, link thevibevoicetarget (establishes the build dependency) and apply-force_loadas a separate link option to keep whole-archive semantics so purego candlsymthevv_capi_*symbols.backend/go/vibevoice-cpp/Makefile— mirror whisper's cleanup discipline (make purgebefore each variant build,rm -rfv build*after) so a partial CMake tree can't survive into packaging.scripts/build/golang-darwin.sh— fail-safe packaging for every go darwin backend: before creating the OCI image, remove any straybuild-*directory and assert the binaryrun.shlaunches actually exists (derived fromrun.sh'sexec $CURDIR/<binary>line — parakeet-cpp launchesparakeet-cpp-grpc, so it isn't always${BACKEND}— with a${BACKEND}fallback). A build that produced no binary now fails the job loudly instead of publishing a source tree as a working backend.Verification
Verified on the actual macOS arm64 CI runner: the
Build vibevoice-cpp-darwinjob now succeeds end to end (configure → compile ggml/metal/blas → buildlibvibevoice.a→ linklibgovibevoicecpp.so→ go build → package). The first push of this PR (guard + Makefile only) correctly went red at the artifact check, proving the fail-safe; the linkage commit turned it green.Assisted-by: Claude:claude-opus-4-8 [Claude Code]