A better Rust ATProto crate
at main 3.9 kB view raw
1#!/usr/bin/env bash 2set -euo pipefail 3 4# Script to package jacquard-codegen and lex-fetch binaries for distribution 5# Creates tar.xz archives with binaries, README, LICENSE, and config files 6# 7# Generates two versions: 8# - Unversioned archives in binaries/ (tracked in git, overwritten each build) 9# - Versioned archives in binaries/releases/ (gitignored, for GitHub releases) 10 11# Determine project root (script is in scripts/ subdirectory) 12SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 13PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" 14cd "$PROJECT_ROOT" 15 16# Parse version from workspace Cargo.toml 17VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/') 18echo "Packaging version: $VERSION" 19 20# Detect target triple (default to x86_64-unknown-linux-gnu) 21TARGET="${CARGO_BUILD_TARGET:-x86_64-unknown-linux-gnu}" 22echo "Target: $TARGET" 23 24# Output directories 25OUTPUT_DIR="binaries" 26RELEASES_DIR="binaries/releases" 27mkdir -p "$OUTPUT_DIR" 28mkdir -p "$RELEASES_DIR" 29 30# Build binaries in release mode 31echo "Building binaries..." 32cargo build --release -p jacquard-lexicon --bin jacquard-codegen 33cargo build --release -p jacquard-lexicon --bin lex-fetch 34 35# Binary locations 36CODEGEN_BIN="target/release/jacquard-codegen" 37LEXFETCH_BIN="target/release/lex-fetch" 38 39# Verify binaries exist 40if [[ ! -f "$CODEGEN_BIN" ]]; then 41 echo "Error: jacquard-codegen binary not found at $CODEGEN_BIN" 42 exit 1 43fi 44 45if [[ ! -f "$LEXFETCH_BIN" ]]; then 46 echo "Error: lex-fetch binary not found at $LEXFETCH_BIN" 47 exit 1 48fi 49 50# Helper function to package a binary 51package_binary() { 52 local BIN_NAME=$1 53 local BIN_PATH=$2 54 local EXTRA_FILES=("${@:3}") # Additional files beyond README and LICENSE 55 56 echo "Packaging ${BIN_NAME}..." 57 58 # Names for versioned and unversioned archives 59 local VERSIONED_NAME="${BIN_NAME}_${TARGET}_v${VERSION}" 60 local UNVERSIONED_NAME="${BIN_NAME}_${TARGET}" 61 62 # Create staging directory 63 local STAGE_DIR="/tmp/${VERSIONED_NAME}" 64 rm -rf "$STAGE_DIR" 65 mkdir -p "$STAGE_DIR" 66 67 # Copy files 68 cp "$BIN_PATH" "$STAGE_DIR/" 69 cp LICENSE "$STAGE_DIR/" 70 cp README.md "$STAGE_DIR/" 71 for file in "${EXTRA_FILES[@]}"; do 72 [[ -n "$file" ]] && cp "$file" "$STAGE_DIR/" 73 done 74 75 # Strip binary (reduce size) 76 strip "$STAGE_DIR/$BIN_NAME" || echo "Warning: strip failed, skipping" 77 78 # Create versioned archive (for releases) 79 cd /tmp 80 tar -cJf "${VERSIONED_NAME}.tar.xz" "$VERSIONED_NAME" 81 mv "${VERSIONED_NAME}.tar.xz" "$PROJECT_ROOT/$RELEASES_DIR/" 82 echo " Created: ${RELEASES_DIR}/${VERSIONED_NAME}.tar.xz" 83 84 # Rename staging directory for unversioned archive 85 mv "$VERSIONED_NAME" "$UNVERSIONED_NAME" 86 87 # Create unversioned archive (tracked in git) 88 tar -cJf "${UNVERSIONED_NAME}.tar.xz" "$UNVERSIONED_NAME" 89 mv "${UNVERSIONED_NAME}.tar.xz" "$PROJECT_ROOT/$OUTPUT_DIR/" 90 echo " Created: ${OUTPUT_DIR}/${UNVERSIONED_NAME}.tar.xz" 91 92 # Cleanup 93 rm -rf "$UNVERSIONED_NAME" 94 cd "$PROJECT_ROOT" 95} 96 97# Package jacquard-codegen 98package_binary "jacquard-codegen" "$CODEGEN_BIN" 99 100# Package lex-fetch (with lexicons.kdl) 101package_binary "lex-fetch" "$LEXFETCH_BIN" "lexicons.kdl" 102 103# Print summary 104echo "" 105echo "Packaging complete!" 106echo "" 107echo "Tracked archives (binaries/):" 108ls -lh "$OUTPUT_DIR"/*.tar.xz 109echo "" 110echo "Release archives (binaries/releases/):" 111ls -lh "$RELEASES_DIR"/*.tar.xz 112 113# Generate checksums for tracked archives 114echo "" 115echo "Generating checksums for tracked archives..." 116cd "$OUTPUT_DIR" 117sha256sum *.tar.xz > SHA256SUMS 118echo "Checksums written to ${OUTPUT_DIR}/SHA256SUMS" 119cat SHA256SUMS 120 121# Generate checksums for release archives 122echo "" 123echo "Generating checksums for release archives..." 124cd "$PROJECT_ROOT/$RELEASES_DIR" 125sha256sum *.tar.xz > SHA256SUMS 126echo "Checksums written to ${RELEASES_DIR}/SHA256SUMS" 127cat SHA256SUMS