#!/bin/bash # Records the build/benchmark environment into experiments/manifests/environment_.json (no secrets). set -euo pipefail OUT="${1:-$(dirname "$0")/../experiments/manifests/environment_$(hostname -s).json}" mkdir -p "$(dirname "$OUT")" python3 -I - "$OUT" <<'PY' import json, subprocess, sys, platform, datetime, os def sh(c): try: return subprocess.run(c, shell=True, capture_output=True, text=True, timeout=60).stdout.strip() except Exception as e: return f"ERR {e}" env = { "recorded_at": datetime.datetime.now(datetime.timezone.utc).isoformat(), "host": platform.node(), "os": sh("sw_vers -productVersion 2>/dev/null || uname -r"), "build": sh("sw_vers -buildVersion 2>/dev/null"), "chip": sh("sysctl -n machdep.cpu.brand_string 2>/dev/null || grep -m1 'model name' /proc/cpuinfo"), "ncpu": sh("sysctl -n hw.ncpu 2>/dev/null || nproc"), "perf_cores": sh("sysctl -n hw.perflevel0.physicalcpu 2>/dev/null"), "eff_cores": sh("sysctl -n hw.perflevel1.physicalcpu 2>/dev/null"), "mem_bytes": sh("sysctl -n hw.memsize 2>/dev/null || grep MemTotal /proc/meminfo"), "gpu": sh("system_profiler SPDisplaysDataType 2>/dev/null | grep -E 'Chipset Model|Total Number of Cores|Metal' | sed 's/^ *//' | tr '\n' ';'"), "xcode": sh("xcodebuild -version 2>/dev/null | tr '\n' ' '"), "clang": sh("clang --version | head -1"), "sdk": sh("xcrun -sdk macosx --show-sdk-version 2>/dev/null"), "metal_toolchain": sh("xcrun -sdk macosx metal --version 2>/dev/null | head -1"), "cmake": sh("cmake --version | head -1"), "ninja": sh("ninja --version 2>/dev/null"), "brew": {p: sh(f"brew list --versions {p} 2>/dev/null") for p in ["eigen","apache-arrow","catch2","nlohmann-json","openblas","libomp"]}, "python": sh("python3 --version"), "r": sh("R --version 2>/dev/null | head -1"), "load_avg": sh("sysctl -n vm.loadavg 2>/dev/null || cat /proc/loadavg"), "thermal": sh("pmset -g therm 2>/dev/null | tr '\n' ';'"), "power_source": sh("pmset -g batt 2>/dev/null | head -1"), "uptime": sh("uptime"), "git_commit": sh("git rev-parse --short HEAD 2>/dev/null"), } json.dump(env, open(sys.argv[1], "w"), indent=1); print("wrote", sys.argv[1]) PY