#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" DIST_DIR="${DIST_DIR:-"$ROOT_DIR/dist/field"}" TARGETS="${TARGETS:-}" APPS="${APPS:-"edge node"}" CGO_ENABLED="${CGO_ENABLED:-0}" GOFLAGS="${GOFLAGS:-"-trimpath"}" if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then cat <<'USAGE' Build field-deployable IOP edge/node binaries. Usage: bin/build/field-binaries.sh Environment: APPS="edge node" apps to build TARGETS="linux/amd64 linux/arm64" GOOS/GOARCH target list DIST_DIR=dist/field output directory VERSION= release version label COMMIT= commit label BUILD_DATE= build date label CGO_ENABLED=0 Go CGO setting GOFLAGS="-trimpath" extra go build flags LDFLAGS="-s -w" linker flags USAGE exit 0 fi VERSION="${VERSION:-"$(git -C "$ROOT_DIR" describe --tags --always --dirty 2>/dev/null || echo dev)"}" COMMIT="${COMMIT:-"$(git -C "$ROOT_DIR" rev-parse --short=12 HEAD 2>/dev/null || echo unknown)"}" BUILD_DATE="${BUILD_DATE:-"$(date -u +%Y%m%dT%H%M%SZ)"}" LDFLAGS="${LDFLAGS:-"-s -w"}" if [[ -z "$TARGETS" ]]; then TARGETS="$(go env GOOS)/$(go env GOARCH)" fi checksum() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$@" return fi shasum -a 256 "$@" } build_one() { local app="$1" local goos="$2" local goarch="$3" local output_dir="$DIST_DIR/$VERSION/$goos-$goarch" local output="$output_dir/iop-$app" mkdir -p "$output_dir" echo "building $app for $goos/$goarch -> $output" ( cd "$ROOT_DIR" GOOS="$goos" GOARCH="$goarch" CGO_ENABLED="$CGO_ENABLED" \ go build $GOFLAGS -ldflags "$LDFLAGS" -o "$output" "./apps/$app/cmd/$app" ) checksum "$output" > "$output.sha256" } for target in $TARGETS; do IFS=/ read -r goos goarch extra <<< "$target" if [[ -z "${goos:-}" || -z "${goarch:-}" || -n "${extra:-}" ]]; then echo "invalid target '$target'; expected GOOS/GOARCH" >&2 exit 1 fi for app in $APPS; do case "$app" in edge|node) build_one "$app" "$goos" "$goarch" ;; *) echo "unsupported app '$app'; expected edge or node" >&2 exit 1 ;; esac done output_dir="$DIST_DIR/$VERSION/$goos-$goarch" { echo "version=$VERSION" echo "commit=$COMMIT" echo "build_date=$BUILD_DATE" echo "target=$goos/$goarch" echo "apps=$APPS" } > "$output_dir/manifest.env" ( cd "$output_dir" checksum iop-* | grep -v '\.sha256$' > SHA256SUMS ) done echo "field binaries written to $DIST_DIR/$VERSION"