#!/usr/bin/env bash # bin/cgo/zig — CGO toolchain: zig cc (not gcc) + pinned liblbug + libtokenizers. # # eval "$(bin/cgo/zig env)" # export CC/CXX/CGO_* # bin/cgo/zig go build ... # ensure, then exec with env # bin/cgo/zig ./bin/brain/search.go "query" # # Pins live in this file. Downloads land in var/ (gitignored). set -euo pipefail ROOT="$(CDPATH= cd -- "$(dirname "$0")/../.." && pwd)" ZIG_VERSION=0.14.1 LBUG_VERSION=0.19.1 TOKENIZERS_VERSION=1.27.0 arch="$(uname -m)" case "$arch" in x86_64|amd64) ZIG_ARCH=x86_64 LBUG_ARCH=x86_64 TOK_ARCH=x86_64 ZIG_SHA=24aeeec8af16c381934a6cd7d95c807a8cb2cf7df9fa40d359aa884195c4716c LBUG_SHA=ed263ae913f68cb0ddba0b98548b58edaac49929766d03bdaaa83be46c68847d TOK_SHA=72556cdca798dd4ea7cdaba308e5f0d68a8cb93b67c96edf485b7a0edd7b07f4 ;; aarch64|arm64) ZIG_ARCH=aarch64 LBUG_ARCH=aarch64 TOK_ARCH=aarch64 ZIG_SHA=f7a654acc967864f7a050ddacfaa778c7504a0eca8d2b678839c21eea47c992b LBUG_SHA=b07df2cd533c3976a2a3025866d6420a5f35514d0a822ecc4b2902d55b4725b7 TOK_SHA=e96545ad05930c26f51f63d932ee6d3bbd32bbed149e102c5290d587a2293067 ;; *) echo "bin/cgo/zig: unsupported arch $arch" >&2 exit 2 ;; esac CACHE="$ROOT/var/cache" LIB="$ROOT/lib-ladybug" ZIG_DIR="$ROOT/var/zig-dist" ZIG_BIN="$ROOT/var/zig/zig" sha256of() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}' else shasum -a 256 "$1" | awk '{print $1}' fi } fetch() { local url="$1" dest="$2" expect="$3" if [ -f "$dest" ] && [ "$(sha256of "$dest")" = "$expect" ]; then return 0 fi mkdir -p "$(dirname "$dest")" echo "fetch $url" >&2 curl -fsSL "$url" -o "$dest" local got got="$(sha256of "$dest")" if [ "$got" != "$expect" ]; then echo "checksum mismatch $dest: got $got want $expect" >&2 rm -f "$dest" exit 1 fi } ensure_zig() { if [ -n "${ZIG:-}" ] && [ -x "$ZIG" ]; then return 0 fi if [ -x "$ZIG_BIN" ]; then export ZIG="$ZIG_BIN" return 0 fi if command -v zig >/dev/null 2>&1; then export ZIG ZIG="$(command -v zig)" return 0 fi local tar="$CACHE/zig-${ZIG_ARCH}-linux-${ZIG_VERSION}.tar.xz" fetch "https://ziglang.org/download/${ZIG_VERSION}/zig-${ZIG_ARCH}-linux-${ZIG_VERSION}.tar.xz" \ "$tar" "$ZIG_SHA" mkdir -p "$CACHE" rm -rf "$ZIG_DIR" tar -xJf "$tar" -C "$CACHE" mv "$CACHE/zig-${ZIG_ARCH}-linux-${ZIG_VERSION}" "$ZIG_DIR" mkdir -p "$ROOT/var/zig" ln -sfn "$ZIG_DIR/zig" "$ZIG_BIN" export ZIG="$ZIG_BIN" } ensure_libs() { mkdir -p "$LIB" if [ ! -f "$LIB/liblbug.so" ]; then local tar="$CACHE/liblbug-linux-${LBUG_ARCH}.tar.gz" fetch "https://github.com/LadybugDB/ladybug/releases/download/v${LBUG_VERSION}/liblbug-linux-${LBUG_ARCH}.tar.gz" \ "$tar" "$LBUG_SHA" tar -xzf "$tar" -C "$LIB" fi if [ ! -f "$LIB/libtokenizers.a" ]; then local tar="$CACHE/libtokenizers.linux-${TOK_ARCH}.tar.gz" fetch "https://github.com/daulet/tokenizers/releases/download/v${TOKENIZERS_VERSION}/libtokenizers.linux-${TOK_ARCH}.tar.gz" \ "$tar" "$TOK_SHA" tar -xzf "$tar" -C "$LIB" fi } print_env() { printf 'export ZIG=%q\n' "$ZIG" printf 'export CC=%q\n' "$ROOT/bin/cgo/zcc" printf 'export CXX=%q\n' "$ROOT/bin/cgo/zc++" printf 'export CGO_ENABLED=1\n' printf 'export CGO_CFLAGS=%q\n' "-I$LIB" printf 'export CGO_LDFLAGS=%q\n' "-L$LIB -Wl,-rpath,${CGO_RPATH:-$LIB}" } ensure_zig ensure_libs cmd="${1:-env}" if [ "$cmd" = "env" ]; then print_env exit 0 fi eval "$(print_env)" exec "$@"