From dcfd93cebc63b0ff274d153dbfe187d086a69249 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 3 May 2026 18:48:20 -0500 Subject: [PATCH] feat(build): add checks for miniaudio library compatibility in macOS universal build script --- scripts/build-macos-universal.sh | 9 +++++++++ scripts/ci/github-install-deps.sh | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/scripts/build-macos-universal.sh b/scripts/build-macos-universal.sh index 8c9420b..c4123fe 100644 --- a/scripts/build-macos-universal.sh +++ b/scripts/build-macos-universal.sh @@ -31,6 +31,15 @@ else echo "Reusing prebuilt frontend assets in meshchatx/public/." fi cross-env ARCH=arm64 pnpm run build-backend +_arm_miniaudio="build/exe/darwin-arm64/lib/_miniaudio.abi3.so" +if [[ -f "$_arm_miniaudio" ]]; then + _ft=$(file --brief --no-pad "$_arm_miniaudio" 2>/dev/null || true) + if [[ "$_ft" == *x86_64* && "$_ft" != *arm64* ]]; then + echo "darwin-arm64 cx_Freeze output has x86_64-only _miniaudio.abi3.so; universal lipo will fail." >&2 + echo "Rebuild miniaudio in the Poetry env (see scripts/ci/github-install-deps.sh) or fix compiler flags." >&2 + exit 1 + fi +fi if [[ -n "${PYTHON_CMD_X64:-}" ]]; then cross-env ARCH=x64 PYTHON_CMD="$PYTHON_CMD_X64" pnpm run build-backend else diff --git a/scripts/ci/github-install-deps.sh b/scripts/ci/github-install-deps.sh index 09b78a1..6c3424a 100755 --- a/scripts/ci/github-install-deps.sh +++ b/scripts/ci/github-install-deps.sh @@ -32,5 +32,36 @@ python -m poetry check --lock python -m poetry install --no-interaction --no-ansi python -m poetry run python scripts/patch_lxst_pyogg_ogg_ctypes.py +# Python 3.14 may install miniaudio from sdist; a mis-linked x86_64-only +# _miniaudio.abi3.so in the arm64 cx_Freeze tree differs from the x64 slice and +# breaks @electron/universal (lipo cannot merge two x86_64-only Mach-O files). +if [[ "$(uname -s)" == "Darwin" && "$(uname -m)" == "arm64" ]]; then + if ! poetry run python -c " +import importlib.util +import pathlib +import subprocess +import sys + +spec = importlib.util.find_spec('miniaudio') +if not spec or not spec.origin: + sys.exit(0) +so = pathlib.Path(spec.origin).resolve().parent / '_miniaudio.abi3.so' +if not so.is_file(): + sys.exit(0) +out = subprocess.check_output(['file', str(so)], text=True) +if 'x86_64' in out and 'arm64' not in out: + sys.exit(1) +sys.exit(0) +"; then + echo "Rebuilding miniaudio for arm64 (was x86_64-only)." >&2 + ( + export ARCHFLAGS="-arch arm64" + export CFLAGS="-arch arm64 ${CFLAGS:-}" + export CXXFLAGS="-arch arm64 ${CXXFLAGS:-}" + poetry run python -m pip install --force-reinstall --no-cache-dir --no-binary miniaudio "miniaudio>=1.70,<2" + ) + fi +fi + pnpm config set verify-store-integrity true pnpm install --frozen-lockfile