#!/usr/bin/env bash # Multi-architecture build for UniversalisOS release artifacts. # # Usage: # tools/build-release.sh # # Builds: # - kernel ELF for armv7, aarch64, riscv # - mycelium CLI (if Rust toolchain available) # - Copies all artifacts to release// # - Generates SHA256SUMS set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" VERSION="${1:?Usage: $0 }" RELEASE_DIR="$REPO_ROOT/release/$VERSION" cd "$REPO_ROOT" mkdir -p "$RELEASE_DIR" # --- Build matrix --- declare -A KERNEL_TARGETS=( ["armv7"]="qemu-arm-virt" ["aarch64"]="qemu-aarch64-virt" ["riscv"]="polarfire" ) echo "==> Building UniversalisOS $VERSION" echo "" # --- Build kernel for each architecture --- for ARCH in "${!KERNEL_TARGETS[@]}"; do PLATFORM="${KERNEL_TARGETS[$ARCH]}" echo "--- Building kernel: $ARCH/$PLATFORM ---" ( cd kernel make ARCH="$ARCH" PLATFORM="$PLATFORM" clean make ARCH="$ARCH" PLATFORM="$PLATFORM" ) ELF="kernel/build/$ARCH/$PLATFORM/universalisos.elf" if [[ -f "$ELF" ]]; then cp "$ELF" "$RELEASE_DIR/universalisos-$ARCH-$PLATFORM.elf" echo " OK: $ELF" else echo " WARN: $ELF not found, skipping" fi echo "" done # --- Build mycelium CLI --- if command -v cargo &>/dev/null && [[ -d "$REPO_ROOT/mycelium-tfw-extension" ]]; then echo "--- Building mycelium CLI ---" ( cd mycelium-tfw-extension cargo build --release 2>/dev/null || echo " WARN: cargo build failed, skipping" ) MYCELIUM_BIN="mycelium-tfw-extension/target/release/mycelium" if [[ -f "$MYCELIUM_BIN" ]]; then cp "$MYCELIUM_BIN" "$RELEASE_DIR/mycelium" echo " OK: $MYCELIUM_BIN" else echo " WARN: mycelium binary not found, skipping" fi echo "" else echo "--- Skipping mycelium CLI (cargo not found) ---" echo "" fi # --- Copy supporting files --- echo "--- Copying supporting files ---" [[ -f "$REPO_ROOT/LICENSE" ]] && cp "$REPO_ROOT/LICENSE" "$RELEASE_DIR/LICENSE" [[ -f "$REPO_ROOT/CHANGELOG.md" ]] && cp "$REPO_ROOT/CHANGELOG.md" "$RELEASE_DIR/CHANGELOG.md" [[ -f "$REPO_ROOT/VERSION" ]] && cp "$REPO_ROOT/VERSION" "$RELEASE_DIR/VERSION" # Copy uos-cover tools if [[ -d "$REPO_ROOT/tools/uos-cover" ]]; then mkdir -p "$RELEASE_DIR/tools/uos-cover" cp "$REPO_ROOT"/tools/uos-cover/*.py "$RELEASE_DIR/tools/uos-cover/" 2>/dev/null || true echo " uos-cover tools" fi # Copy uos-pkg tools if [[ -d "$REPO_ROOT/tools/uos-pkg" ]]; then mkdir -p "$RELEASE_DIR/tools/uos-pkg" cp "$REPO_ROOT"/tools/uos-pkg/*.py "$RELEASE_DIR/tools/uos-pkg/" 2>/dev/null || true echo " uos-pkg tools" fi # --- Generate SHA256SUMS --- echo "" echo "--- Generating SHA256SUMS ---" ( cd "$RELEASE_DIR" find . -type f ! -name SHA256SUMS -exec sha256sum {} \; > SHA256SUMS ) echo "" echo "==> Build complete. Artifacts in: $RELEASE_DIR" ls -la "$RELEASE_DIR/"