API image is Go-only (compose target api). Python rebuild is profile index. bin/cgo/zig pins Zig 0.14.1, liblbug, and tokenizers.
131 lines
3.5 KiB
Bash
Executable File
131 lines
3.5 KiB
Bash
Executable File
#!/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 "$@"
|