From 62f1f5900df5f761c01141323c2c2115d68f9541 Mon Sep 17 00:00:00 2001 From: sneak Date: Wed, 11 Nov 2026 20:33:28 +0000 Subject: [PATCH] make build-bin: binary uses the system loader on Linux (closes #240) nix's bun loads through a glibc in the nix store, and bun build --compile copied that loader into ~/bin/quak, so nix-collect-garbage could break the cron backup. On Linux x86-64 the build now passes --target=bun-linux-x64-baseline, which makes bun use its downloaded release build with the system loader. Other Linux architectures are refused, since the fix is untested there; macOS is unchanged. Model: opus-5-5 --- Makefile | 14 +++++++++++++- README.md | 8 ++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a71e286..46f2dad 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,20 @@ build: # Bundles the built dist/, so the binary reports the version script/build # stamped. +# +# On Linux, nix's bun loads through a C library in the nix store, and a binary +# bun compiles from itself keeps that loader. nix-collect-garbage can delete +# that C library, and the binary then no longer starts. +# A --target other than the host's makes bun use its downloaded release build, +# which loads through the system's C library. That is tested only on x86-64, +# with the baseline build, so other Linux machines are refused. build-bin: build - nix-shell -p bun --run "bun build dist/bin/quak.js --compile --outfile bin/quak" + case "$$(uname -s)-$$(uname -m)" in \ + Linux-x86_64) target=--target=bun-linux-x64-baseline ;; \ + Linux-*) echo "make build-bin: on Linux only x86-64 is supported" >&2; exit 1 ;; \ + *) target= ;; \ + esac; \ + nix-shell -p bun --run "bun build dist/bin/quak.js --compile $$target --outfile bin/quak" install: build-bin mkdir -p ~/bin diff --git a/README.md b/README.md index 3db31da..def85e0 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,10 @@ requests. The "Library reference" below covers both. one binary and copies it to `~/bin/quak`. Besides what Getting Started needs, `make install` needs `make` and [nix](https://nixos.org/download). It uses bun, a JavaScript runtime, to bundle the built `dist/` into one executable. It runs -bun through `nix-shell -p bun`. +bun through `nix-shell -p bun`. On Linux it works on x86-64 only. There, the +binary is built from bun's own release build rather than nix's bun, so it does +not need the nix store. The first build downloads that release build into +`~/.bun`. Log in once with `~/bin/quak`, as the user the cron job will run as: @@ -1910,7 +1913,8 @@ These apply to people and to coding agents alike. `bin/clip-keyword-vectors` installs, by SHA-256 hash; - Node and yarn, when `script/bootstrap` installs them, by version. - Not pinned: - - bun, which `make build-bin` takes from `nix-shell -p bun`; + - bun, which `make build-bin` takes from `nix-shell -p bun`, and on Linux + the release build of the same bun version that it downloads; - `make` and `git`, which `script/bootstrap` installs from the system package manager when they are missing, as every `Dockerfile` stage does; - `bash` and `curl`, which `script/bootstrap` installs the same way when it