myxce/src/xceadmin/meson-build.sh
Rongsong Shen db2b5f17f0 fix(admin-config-tool): pin xceadmin's python3 to meson's own resolution
Both meson-build.sh (venv creation) and meson-install.sh (wrapper
shebang) resolved python3 independently at run time (bare `python3 -m
venv` / `command -v python3`) -- correct as long as invoked inside
nix develop/build, but nothing prevented a stray non-nix system
python3 earlier on PATH from shadowing it.

meson.build now resolves python3 once via import('python').
find_installation('python3') -- same mechanism as find_program('go')/
capnp/packcc elsewhere in this build, printed at `meson setup` time
as "Program python3 found: YES (/nix/store/...)" -- and threads that
exact resolved path into both scripts as an explicit argument instead
of a fresh lookup.

Verified: meson setup prints the pinned python3, xceadmin target
rebuilds clean (165/165 passed), and the built venv's own python3
resolves through to that exact nix store path.
2026-07-22 13:07:23 +00:00

64 lines
2.9 KiB
Bash
Executable file

#!/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
touch "$STAMP_FILE"
echo "=== xceadmin (meson): done ==="