#!/usr/bin/env bash # Build the meshbay-common package: shared venv with ALL Python dependencies. # # Usage: ./build-common.sh [staging-dir] # staging-dir defaults to /tmp/meshbay-build # # Output: $STAGING/meshbay-common-root/ (ready for dpkg-deb or rpmbuild) set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" STAGING="${1:-/tmp/meshbay-build}" ROOT="$STAGING/meshbay-common-root" VENV_FINAL="/opt/meshbay-common/venv" VENV_BUILD="$ROOT$VENV_FINAL" WHEEL_DIR="$STAGING/wheels" VERSION=$(python3 -c " import tomllib, pathlib p = pathlib.Path('$REPO/packages/meshbay-common/pyproject.toml') print(tomllib.loads(p.read_text())['project']['version']) ") echo "==> meshbay-common $VERSION" rm -rf "$ROOT" mkdir -p "$ROOT/opt/meshbay-common" "$WHEEL_DIR" # --- Create venv ----------------------------------------------------------- echo " creating venv at $VENV_BUILD" python3 -m venv "$VENV_BUILD" "$VENV_BUILD/bin/pip" install --upgrade pip wheel 2>&1 | tail -1 # --- Build wheels for all three packages ----------------------------------- echo " building wheels" for pkg in meshbay-common meshbay-hub meshbay-node; do "$VENV_BUILD/bin/pip" wheel \ --no-deps \ --wheel-dir "$WHEEL_DIR" \ "$REPO/packages/$pkg" 2>&1 | tail -1 done # --- Install everything into the venv ------------------------------------- echo " installing all packages + dependencies" "$VENV_BUILD/bin/pip" install \ --find-links "$WHEEL_DIR" \ meshbay-common meshbay-hub meshbay-node 2>&1 | tail -3 # --- Strip build tools from the venv (not needed at runtime) --------------- echo " stripping build tools" "$VENV_BUILD/bin/pip" uninstall -y pip setuptools wheel 2>&1 | tail -1 rm -rf "$VENV_BUILD/lib"/python*/site-packages/pip* rm -rf "$VENV_BUILD/lib"/python*/site-packages/setuptools* rm -rf "$VENV_BUILD/lib"/python*/site-packages/wheel* rm -f "$VENV_BUILD/bin/pip"* # --- Fix shebangs and pyvenv.cfg ------------------------------------------ # The venv was built under $ROOT but will be installed at /opt/meshbay-common/venv/ echo " fixing paths ($ROOT -> '')" for f in "$VENV_BUILD/bin"/*; do [ -f "$f" ] || continue [ -L "$f" ] && continue head -1 "$f" | grep -q "^#!" || continue sed -i "1s|$ROOT||" "$f" done sed -i "s|$ROOT||g" "$VENV_BUILD/pyvenv.cfg" # --- Remove __pycache__ (will be regenerated on first import) -------------- find "$VENV_BUILD" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true # --- Keep a copy of the wheels for reference ------------------------------- mkdir -p "$ROOT/opt/meshbay-common/wheels" cp "$WHEEL_DIR"/meshbay_common-*.whl "$ROOT/opt/meshbay-common/wheels/" echo "==> meshbay-common staging ready at $ROOT" echo " venv: $VENV_BUILD" echo " version: $VERSION"