summaryrefslogtreecommitdiffstats
path: root/packaging/build/build-packages.sh
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/build/build-packages.sh')
-rwxr-xr-xpackaging/build/build-packages.sh156
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"