diff options
Diffstat (limited to 'packaging/build/build-packages.sh')
| -rwxr-xr-x | packaging/build/build-packages.sh | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/packaging/build/build-packages.sh b/packaging/build/build-packages.sh new file mode 100755 index 0000000..ccacb81 --- /dev/null +++ b/packaging/build/build-packages.sh @@ -0,0 +1,156 @@ +#!/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" |