#!/usr/bin/env bash set -euo pipefail # usage: build-universal.sh [out-dir] (default: .) out_dir="${1:-.}" LDFLAGS="-s -w" targets=( "linux/amd64" "linux/arm64" "darwin/arm64" ) tmp_dir="$(mktemp -d /tmp/tobi-slices-XXXXXX)" trap 'rm -rf "${tmp_dir}"' EXIT mkdir -p internal/remote/payloads rm -f internal/remote/payloads/tobi-*.zst internal/remote/payloads/tobi-*.gz echo "building multi-arch carrier slices into ${tmp_dir}..." for target in "${targets[@]}"; do os="${target%%/*}" arch="${target##*/}" out="${tmp_dir}/tobi-${os}-${arch}" echo " -> compiling ${os}/${arch}..." CGO_ENABLED=0 GOOS="${os}" GOARCH="${arch}" go build -trimpath -ldflags="${LDFLAGS}" -o "${out}" . zstd -19 -q --rm "${out}" done # slices stay in the temp dir until all of them exist; anything under # internal/remote/payloads would be re-embedded by the slices of later # iterations, so the host build only sees complete slices mv "${tmp_dir}"/*.zst internal/remote/payloads/ echo "building final binary with embedded slices (${targets[*]})..." CGO_ENABLED=0 go build -trimpath -ldflags="${LDFLAGS}" -o "${out_dir}/tobi" . echo "done: ${out_dir}/tobi"