From 893a01db7bd48ade70b0d3ac135e4c0bbe3afae3 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Wed, 22 Jul 2026 11:10:40 +0000 Subject: [PATCH] feat(admin-config-tool): install standalone xceadmin binary via meson MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xceadmin's custom_target only built+tested (stamp-file output, no install:true) — nix build .#xcecore succeeded but shipped nothing in result/bin, unlike every other component. Add meson.add_install_script('meson-install.sh'): copies the xceadmin/xcecommon package dirs (not the whole build-dir venv, whose pip-generated shebang hardcodes a build path that stops existing after the build) into $out/lib/xceadmin-site, then writes a wrapper at $out/bin/xceadmin whose shebang and PYTHONPATH are resolved against the install script's own nix build environment — real /nix/store paths for python3 and each dependency (pycapnp, pyyaml, jsonschema, click), so nix's reference scanner keeps them alive in the closure. No venv activation needed at runtime. Verified: meson install --destdir and nix build --option sandbox false .#xcecore both produce a working result/bin/xceadmin, runnable standalone with a stripped-down PATH-only environment. --- src/xceadmin/meson-install.sh | 41 +++++++++++++++++++++++++++++++++++ src/xceadmin/meson.build | 6 +++++ 2 files changed, 47 insertions(+) create mode 100755 src/xceadmin/meson-install.sh diff --git a/src/xceadmin/meson-install.sh b/src/xceadmin/meson-install.sh new file mode 100755 index 00000000..48348abb --- /dev/null +++ b/src/xceadmin/meson-install.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# meson install-time script (meson.add_install_script) -- runs after the +# xceadmin custom_target (build_by_default) has already installed+tested +# into its own build-dir venv (meson-build.sh). This script does NOT copy +# that venv wholesale: pip's generated console_scripts wrapper hardcodes +# the *build-directory* absolute path in its shebang, which stops existing +# once the build dir is cleaned up -- copying it verbatim into $out would +# ship a binary with a shebang pointing at nowhere. +# +# Instead: copy just the xceadmin/xcecommon package dirs (pure files, no +# shebang) into $out, and hand-write a wrapper whose shebang and PYTHONPATH +# are resolved against *this* install script's own environment (python3 +# and the nix-provided pycapnp/pyyaml/jsonschema/click site-packages come +# from nativeBuildInputs, same as every other phase of this derivation) -- +# every path baked in below is a real /nix/store path, so nix's reference +# scanner picks each one up as a proper runtime dependency of $out. +set -euo pipefail + +DESTDIR_PREFIX="$MESON_INSTALL_DESTDIR_PREFIX" +PYTHON="$(command -v python3)" + +VENV_SITE_GLOB=("$MESON_BUILD_ROOT"/xceadmin/.venv/lib/python3.*/site-packages) +VENV_SITE="${VENV_SITE_GLOB[0]}" +if [ ! -d "$VENV_SITE/xceadmin" ]; then + echo "meson-install.sh: expected $VENV_SITE/xceadmin from the xceadmin build step, not found" >&2 + exit 1 +fi + +SITE_DIR="$DESTDIR_PREFIX/lib/xceadmin-site" +mkdir -p "$SITE_DIR" "$DESTDIR_PREFIX/bin" +rm -rf "$SITE_DIR/xceadmin" "$SITE_DIR/xcecommon" +cp -r "$VENV_SITE/xceadmin" "$VENV_SITE/xcecommon" "$SITE_DIR/" + +cat > "$DESTDIR_PREFIX/bin/xceadmin" <