#!/usr/bin/env bash # Meson-driven xceadmin build: install + test out-of-tree, in the meson # build directory. Never writes into the live source checkout -- unlike # xce-build.sh's separate xceadmin case (editable install, .venv inside # src/xceadmin/, meant for fast dev-loop iteration), this path is what # `meson compile`/`nix build .#xcecore` actually invoke, and both need # the same purity guarantee every other meson subdir here already has. # # Several tests reach for sibling directories outside xcecommon/xceadmin's # own tree via a fixed relative path (src/configs/, src/schema/, ha/data/ # -- e.g. test_validation.py's REPO_CONFIGS_DIR deliberately fails loud # rather than skips if that layout assumption breaks, by design). Rather # than touch test code, this script recreates the exact repo layout # out-of-tree via symlinks (read-only references, never a write into the # real tree) so every one of those relative-path assumptions still # resolves correctly from the copied location. set -euo pipefail SOURCE_DIR="$1" # .../src/xceadmin (meson.current_source_dir()) BUILD_DIR="$2" # .../xceadmin (meson.current_build_dir()) REPO_ROOT="$3" # real repo root (contains ha/, src/) PYTHON="$4" # meson's resolved python3 (import('python').find_installation()), # NOT a bare `python3` PATH lookup -- see meson.build's comment STAMP_FILE="$5" SRC_DIR="$REPO_ROOT/src" MIRROR_DIR="$BUILD_DIR/repo-mirror" WORK_DIR="$MIRROR_DIR/src/xceadmin" VENV_DIR="$BUILD_DIR/.venv" echo "=== xceadmin (meson): staging out-of-tree repo-layout mirror ===" rm -rf "$MIRROR_DIR" mkdir -p "$MIRROR_DIR/src" ln -s "$REPO_ROOT/ha" "$MIRROR_DIR/ha" ln -s "$SRC_DIR/configs" "$MIRROR_DIR/src/configs" ln -s "$SRC_DIR/schema" "$MIRROR_DIR/src/schema" cp -r "$SOURCE_DIR" "$WORK_DIR" # Never trust a stray dev-loop artifact from the live checkout (xce-build.sh's # own editable-install byproducts, if this happens to be a live checkout and # not a nix-sandboxed source copy) -- always start from a clean tree. rm -rf "$WORK_DIR/.venv" "$WORK_DIR/build" "$WORK_DIR"/src/*.egg-info \ "$WORK_DIR/.pytest_cache" "$WORK_DIR/.ruff_cache" \ "$WORK_DIR/src/xcecommon/schema_files" find "$WORK_DIR" -name "__pycache__" -type d -prune -exec rm -rf {} + SCHEMA_DST="$WORK_DIR/src/xcecommon/schema_files" echo "=== xceadmin (meson): syncing bundled schemas ===" mkdir -p "$SCHEMA_DST/json" cp "$SRC_DIR/schema/controller.capnp" "$SCHEMA_DST/controller.capnp" cp "$SRC_DIR/schema/c.capnp" "$SCHEMA_DST/c.capnp" cp "$SRC_DIR/configs/schema/"*.schema.json "$SCHEMA_DST/json/" echo "=== xceadmin (meson): pinned install into build-dir venv (python: $PYTHON) ===" rm -rf "$VENV_DIR" "$PYTHON" -m venv --system-site-packages "$VENV_DIR" "$VENV_DIR/bin/pip" install "$WORK_DIR" --quiet echo "=== xceadmin (meson): running tests ===" "$VENV_DIR/bin/python" -m pytest "$WORK_DIR/tests" -v # Build an installable wheel from the SAME schema-synced $WORK_DIR the pinned # install above just tested -- not a second, separately-assembled tree -- # so the wheel is guaranteed to carry the identical schema_files/ package # data (Requirement 5.5) the just-passed test run actually exercised. Only # reached after `set -e` has let the test run above succeed, so a wheel is # never produced (or left stale) from a red test run. --no-deps: this is # xceadmin's own wheel only, not a vendored bundle of click/pycapnp/etc -- # installing it still needs those from PyPI or (preferably) the nix shell, # same as the pinned install just above. DIST_DIR="$BUILD_DIR/dist" echo "=== xceadmin (meson): building installable wheel ===" rm -rf "$DIST_DIR" mkdir -p "$DIST_DIR" "$VENV_DIR/bin/pip" wheel "$WORK_DIR" --no-deps -w "$DIST_DIR" --quiet WHEEL_FILE=$(ls "$DIST_DIR"/xceadmin-*.whl) echo "=== xceadmin (meson): wheel built at $WHEEL_FILE ===" touch "$STAMP_FILE" echo "=== xceadmin (meson): done ==="