#!/bin/sh # Build release binaries for distribution. # Builds a native binary for the current OS, plus Windows (cross-compile). # # Usage: # ./build-release.sh # version from Cargo.toml (e.g. 1.0.0) # ./build-release.sh beta1 # appends suffix (e.g. 1.0.0-beta1) # ./build-release.sh rc1 # appends suffix (e.g. 1.0.0-rc1) # # Supported host platforms: # Linux -- builds linux-x86_64 + windows-x86_64 (via MinGW) # FreeBSD -- builds freebsd-x86_64 + windows-x86_64 (via MinGW) # Windows -- use build-release.ps1 instead # # To produce all three native binaries, run this script on both # Linux and FreeBSD, then collect artifacts from both runs. # # Cross-compile Linux<->FreeBSD is not supported (requires a full sysroot). set -e # Detect host OS OS="$(uname -s)" case "$OS" in Linux) HOST="linux" ;; FreeBSD) HOST="freebsd" ;; Darwin) HOST="macos" ;; *) echo "Unsupported host OS: $OS" echo "Use build-release.ps1 on Windows." exit 1 ;; esac # Read version from the single source of truth: Cargo.toml BASE_VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' | tr -d '\r') if [ -z "$BASE_VERSION" ]; then echo "Error: Could not read version from Cargo.toml" exit 1 fi # Optional suffix (beta1, rc1, etc.) if [ -n "$1" ]; then VERSION="${BASE_VERSION}-${1}" else VERSION="$BASE_VERSION" fi RELEASE_DIR="release-artifacts" echo "Building Anvil v${VERSION} release binaries..." echo " Host platform: ${HOST}" echo " Version base: ${BASE_VERSION} (from Cargo.toml)" if [ -n "$1" ]; then echo " Suffix: ${1}" fi echo "" # Clean previous artifacts rm -rf "$RELEASE_DIR" mkdir -p "$RELEASE_DIR" # -- Native binary ----------------------------------------------------------- echo "Building ${HOST} x86_64 binary..." cargo build --release strip target/release/anvil 2>/dev/null || true echo "Packaging ${HOST} binary..." cd target/release tar -czf "../../$RELEASE_DIR/anvil-${VERSION}-${HOST}-x86_64.tar.gz" anvil cd ../.. # -- Windows binary (cross-compile via MinGW) -------------------------------- echo "" echo "Building Windows x86_64 binary (cross-compile)..." # Check if Windows target is installed if ! rustup target list | grep -q "x86_64-pc-windows-gnu (installed)"; then echo "Installing Windows cross-compile target..." rustup target add x86_64-pc-windows-gnu fi # Check for MinGW linker if ! command -v x86_64-w64-mingw32-gcc > /dev/null 2>&1; then case "$HOST" in linux) echo " Install with: sudo apt install mingw-w64 (Debian/Ubuntu)" ;; freebsd) echo " Install with: sudo pkg install mingw-w64" ;; esac echo "Skipping Windows build." else cargo build --release --target x86_64-pc-windows-gnu x86_64-w64-mingw32-strip target/x86_64-pc-windows-gnu/release/anvil.exe 2>/dev/null || true echo "Packaging Windows binary..." cd target/x86_64-pc-windows-gnu/release zip -q "../../../$RELEASE_DIR/anvil-${VERSION}-windows-x86_64.zip" anvil.exe cd ../../.. fi # -- Checksums --------------------------------------------------------------- echo "" echo "Generating checksums..." cd "$RELEASE_DIR" # sha256sum on Linux, sha256 on FreeBSD/macOS if command -v sha256sum > /dev/null 2>&1; then sha256sum * > SHA256SUMS else shasum -a 256 * > SHA256SUMS fi cd .. # -- Summary ----------------------------------------------------------------- echo "" echo "===========================================================" echo " Anvil v${VERSION} release artifacts built successfully!" echo "===========================================================" echo "" echo "Artifacts in $RELEASE_DIR/:" ls -lh "$RELEASE_DIR" echo "" echo "Checksums:" cat "$RELEASE_DIR/SHA256SUMS" echo "" echo "Note: run this script on both Linux and FreeBSD to produce" echo "all native platform binaries before creating a Gitea release." echo "" echo "Upload to Gitea:" echo " 1. Create release: Releases -> New Release -> Tag: v${VERSION}" echo " 2. Drag and drop files from $RELEASE_DIR/" echo " 3. Save" echo ""