#!/usr/bin/env bash
set -euo pipefail
ARCH="${1:?usage: build-arch.sh <arm64|amd64>}"
WIN_TARGET=""
WIN_NAME=""
case "$ARCH" in
arm64)
LINUX_TARGET=aarch64-unknown-linux-gnu
MAC_TARGET=aarch64-apple-darwin
LINUX_NAME=anvil_linux_arm64
MAC_NAME=anvil_macos_arm64
;;
amd64)
LINUX_TARGET=x86_64-unknown-linux-gnu
MAC_TARGET=x86_64-apple-darwin
LINUX_NAME=anvil_linux_amd64
MAC_NAME=anvil_macos_amd64
WIN_TARGET=x86_64-pc-windows-msvc
WIN_NAME=anvil_windows_amd64
;;
*)
echo "ERROR: unknown arch '$ARCH' (want arm64 or amd64)" >&2
exit 1
;;
esac
git config --global --add safe.directory /workspace
PUBLISH=0
if [ "${ANVIL_BRANCH:-}" = "main" ] || [ "${ANVIL_BRANCH:-}" = "refs/heads/main" ]; then
if [ -z "${ANVIL_TOKEN:-}" ]; then
echo "ERROR: ANVIL_TOKEN secret not set. Run:" >&2
echo " anvil ci set-secret --name ANVIL_TOKEN --value <pat> --repo fangorn/anvil-cli" >&2
exit 1
fi
PUBLISH=1
fi
if [ "$PUBLISH" = "1" ]; then
VERSION=$(bash ci/release.sh)
if [ -z "$VERSION" ]; then
echo "ERROR: ci/release.sh returned empty version" >&2
exit 1
fi
git tag -f "$VERSION"
fi
export PATH="/opt/zig:$PATH"
SDKROOT=$(echo /opt/MacOSX*.sdk)
if [ ! -d "$SDKROOT" ]; then
echo "ERROR: macOS SDK not found under /opt (expected from the prepared image)" >&2
exit 1
fi
export SDKROOT
export MACOSX_DEPLOYMENT_TARGET=11.0
GLIBC_FLOOR=2.31
echo "==> Building linux $ARCH (glibc $GLIBC_FLOOR floor)..."
cargo zigbuild --release --target "${LINUX_TARGET}.${GLIBC_FLOOR}" 2>&1
echo "==> Building macos $ARCH..."
cargo zigbuild --release --target "$MAC_TARGET" 2>&1
LINUX_BIN="target/${LINUX_TARGET}/release/anvil"
MAC_BIN="target/${MAC_TARGET}/release/anvil"
WIN_BIN=""
if [ -n "$WIN_TARGET" ]; then
echo "==> Building windows $ARCH ($WIN_TARGET, cargo-xwin)..."
XWIN_ACCEPT_LICENSE=1 XWIN_CACHE_DIR=/opt/xwin \
cargo xwin build --release --target "$WIN_TARGET" 2>&1
WIN_BIN="target/${WIN_TARGET}/release/anvil.exe"
fi
assert_glibc_floor() {
local bin="$1" max
max=$(grep -aoE 'GLIBC_[0-9]+\.[0-9]+' "$bin" | sort -V | tail -1)
if [ -z "$max" ]; then
echo "ERROR: no GLIBC version symbols found in $bin (unexpected)" >&2
exit 1
fi
if [ "$(printf '%s\nGLIBC_%s\n' "$max" "$GLIBC_FLOOR" | sort -V | tail -1)" != "GLIBC_${GLIBC_FLOOR}" ]; then
echo "ERROR: $bin requires $max, above the GLIBC_${GLIBC_FLOOR} floor" >&2
exit 1
fi
echo " OK: $bin max $max (<= GLIBC_${GLIBC_FLOOR})"
}
echo "==> Verifying glibc floor ($GLIBC_FLOOR)..."
assert_glibc_floor "$LINUX_BIN"
mkdir -p runner-dist
cp "$LINUX_BIN" "runner-dist/$LINUX_NAME"
cp "$MAC_BIN" "runner-dist/$MAC_NAME"
[ -n "$WIN_BIN" ] && cp "$WIN_BIN" "runner-dist/$WIN_NAME"
if [ "$PUBLISH" != "1" ]; then
exit 0
fi
ANVIL="$PWD/$LINUX_BIN"
if ! "$ANVIL" release view "$VERSION" --repo fangorn/anvil-cli >/dev/null 2>&1; then
"$ANVIL" release create \
--tag "$VERSION" \
--title "anvil-cli $VERSION" \
--body "Runner binaries for linux/{amd64,arm64}, macos/{amd64,arm64}, windows/amd64." \
--draft \
--repo fangorn/anvil-cli || true
fi
cp "$LINUX_BIN" "runner-dist/${LINUX_NAME}_${VERSION}"
cp "$MAC_BIN" "runner-dist/${MAC_NAME}_${VERSION}"
"$ANVIL" release upload "$VERSION" "runner-dist/${LINUX_NAME}_${VERSION}" --repo fangorn/anvil-cli
"$ANVIL" release upload "$VERSION" "runner-dist/${MAC_NAME}_${VERSION}" --repo fangorn/anvil-cli
if [ -n "$WIN_BIN" ]; then
cp "$WIN_BIN" "runner-dist/${WIN_NAME}_${VERSION}"
"$ANVIL" release upload "$VERSION" "runner-dist/${WIN_NAME}_${VERSION}" --repo fangorn/anvil-cli
fi
echo "==> Uploaded $ARCH binaries to draft release $VERSION"