#!/usr/bin/env bash # Build all MeshBay packages for the current platform. # # Usage: # ./build-packages.sh # auto-detect format (deb on Ubuntu, rpm on Fedora) # ./build-packages.sh deb # force .deb # ./build-packages.sh rpm # force .rpm # ./build-packages.sh deb --arm64 # arm64 .deb (Pi) # # Expects to run on the target machine: # - Ubuntu 26.04 (cbesson@meshbay.org) for .deb amd64 # - Fedora 44 (local) for .rpm x86_64 # - Raspberry Pi for .deb arm64 (deferred) # # Output: packages in $STAGING/out/ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO="$(cd "$SCRIPT_DIR/../.." && pwd)" STAGING="${MESHBAY_BUILD_DIR:-/tmp/meshbay-build}" OUT="$STAGING/out" # --- Detect format -------------------------------------------------------- FORMAT="${1:-auto}" shift 2>/dev/null || true ARM64_FLAG="" for arg in "$@"; do [ "$arg" = "--arm64" ] && ARM64_FLAG="--arm64" done if [ "$FORMAT" = "auto" ]; then if [ -f /etc/debian_version ]; then FORMAT="deb" elif [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ]; then FORMAT="rpm" else echo "!! Cannot detect OS — pass 'deb' or 'rpm' as argument" >&2 exit 1 fi fi ARCH=$(dpkg --print-architecture 2>/dev/null || rpm --eval '%{_arch}' 2>/dev/null || uname -m) if [ -n "$ARM64_FLAG" ]; then ARCH="arm64" fi VERSION=$(python3 -c " import tomllib, pathlib p = pathlib.Path('$REPO/packages/meshbay-common/pyproject.toml') print(tomllib.loads(p.read_text())['project']['version']) ") echo "========================================" echo " MeshBay $VERSION — $FORMAT $ARCH" echo "========================================" echo " Repo: $REPO" echo " Staging: $STAGING" echo " Output: $OUT" echo "" rm -rf "$OUT" mkdir -p "$OUT" # --- Step 1: Build staging trees ------------------------------------------ echo "--- [1/4] meshbay-common (shared venv + all deps) ---" bash "$SCRIPT_DIR/build-common.sh" "$STAGING" echo "" echo "--- [2/4] meshbay-hub ---" bash "$SCRIPT_DIR/build-hub.sh" "$STAGING" echo "" echo "--- [3/4] meshbay-node ---" bash "$SCRIPT_DIR/build-node.sh" "$STAGING" echo "" echo "--- [4/4] meshbay-client ---" bash "$SCRIPT_DIR/build-client.sh" "$STAGING" $ARM64_FLAG # --- Step 2: Package ------------------------------------------------------ echo "" echo "--- Packaging ($FORMAT) ---" if [ "$FORMAT" = "deb" ]; then build_deb() { local pkg="$1" local root="$STAGING/${pkg}-root" local deb_src="$REPO/packaging/deb/$pkg/DEBIAN" local deb_dir="$root/DEBIAN" mkdir -p "$deb_dir" for f in "$deb_src"/*; do [ -f "$f" ] || continue sed -e "s/__VERSION__/$VERSION/g" \ -e "s/__ARCH__/$ARCH/g" \ "$f" > "$deb_dir/$(basename "$f")" chmod 755 "$deb_dir/$(basename "$f")" 2>/dev/null || true done # control files should be 644, scripts 755 [ -f "$deb_dir/control" ] && chmod 644 "$deb_dir/control" [ -f "$deb_dir/conffiles" ] && chmod 644 "$deb_dir/conffiles" dpkg-deb --build --root-owner-group "$root" "$OUT/${pkg}_${VERSION}_${ARCH}.deb" echo " -> $OUT/${pkg}_${VERSION}_${ARCH}.deb" } build_deb meshbay-common build_deb meshbay-hub build_deb meshbay-node build_deb meshbay-client elif [ "$FORMAT" = "rpm" ]; then RPMBUILD_DIR="$STAGING/rpmbuild" rm -rf "$RPMBUILD_DIR" mkdir -p "$RPMBUILD_DIR"/{SPECS,SOURCES,BUILD,RPMS,SRPMS} build_rpm() { local pkg="$1" local spec="$REPO/packaging/rpm/${pkg}.spec" local root="$STAGING/${pkg}-root" # Substitute version and pass the staging root as a macro sed "s/__VERSION__/$VERSION/g" "$spec" > "$RPMBUILD_DIR/SPECS/${pkg}.spec" rpmbuild \ --define "_topdir $RPMBUILD_DIR" \ --define "_staging_root $root" \ -bb "$RPMBUILD_DIR/SPECS/${pkg}.spec" 2>&1 | tail -5 local rpm_file rpm_file=$(find "$RPMBUILD_DIR/RPMS" -name "${pkg}-${VERSION}*.rpm" -print -quit) if [ -n "$rpm_file" ]; then cp "$rpm_file" "$OUT/" echo " -> $OUT/$(basename "$rpm_file")" fi } build_rpm meshbay-common build_rpm meshbay-hub build_rpm meshbay-node build_rpm meshbay-client fi # --- Summary -------------------------------------------------------------- echo "" echo "========================================" echo " Build complete" echo "========================================" ls -lh "$OUT"/ echo "" echo "Install order:" echo " 1. meshbay-common" echo " 2. meshbay-hub and/or meshbay-node" echo " 3. meshbay-client"