rs-mrxvt/scripts/sysprep.sh

287 lines
9.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# sysprep.sh — install build dependencies for rs-mrxvt on any Linux distro.
#
# Detects the distro via /etc/os-release and runs the appropriate package
# manager command. Pulls in everything needed to build rs-mrxvt with all
# feature flags: rust toolchain, vulkan headers, wayland, xkbcommon, and
# the optional deps for Lua + image support.
#
# Usage:
# ./scripts/sysprep.sh # install everything
# ./scripts/sysprep.sh --no-rust # skip rustup (use system rust)
# ./scripts/sysprep.sh --no-gpu # skip GPU dev headers (TUI-only build)
# ./scripts/sysprep.sh --dry-run # print what would be installed, don't run
#
# Supported distros (auto-detected):
# arch, manjaro, endeavouros → pacman
# debian, ubuntu, pop!_os, mint → apt
# fedora, rhel, rocky, alma → dnf
# opensuse, suse → zypper
# void → xbps-install
# alpine → apk
# nixos → nix-shell (prints a shell.nix recipe)
# sourcemage → cast
# gentoo, funtoo → emerge
# unknown → prints manual instructions
set -e
# ─── Flags ───────────────────────────────────────────────────────────────────
INSTALL_RUST=1
INSTALL_GPU=1
DRY_RUN=0
for arg in "$@"; do
case "$arg" in
--no-rust) INSTALL_RUST=0 ;;
--no-gpu) INSTALL_GPU=0 ;;
--dry-run) DRY_RUN=1 ;;
-h|--help)
sed -n '2,20p' "$0"
exit 0
;;
*)
echo "unknown flag: $arg" >&2
exit 1
;;
esac
done
# ─── Helpers ─────────────────────────────────────────────────────────────────
run() {
if [ "$DRY_RUN" = "1" ]; then
echo " [dry-run] $*"
else
"$@"
fi
}
need_root() {
if [ "$(id -u)" != "0" ] && [ "$DRY_RUN" = "0" ]; then
echo "This command needs root; re-running with sudo." >&2
exec sudo "$0" "$@"
fi
}
# ─── Distro detection ────────────────────────────────────────────────────────
detect_distro() {
if [ ! -f /etc/os-release ]; then
echo "unknown"
return
fi
# shellcheck disable=SC1091
. /etc/os-release
case "$ID" in
arch|manjaro|endeavouros|garuda|artix) echo "arch" ;;
debian|ubuntu|linuxmint|pop|elementary|kali|raspbian) echo "debian" ;;
fedora|rhel|rocky|almalinux|centos|amzn) echo "fedora" ;;
opensuse*|suse|sles) echo "opensuse" ;;
void) echo "void" ;;
alpine) echo "alpine" ;;
nixos) echo "nixos" ;;
sourcemage|smgl) echo "sourcemage" ;;
gentoo|funtoo) echo "gentoo" ;;
*) echo "unknown" ;;
esac
}
DISTRO=$(detect_distro)
echo "=== rs-mrxvt sysprep ==="
echo " detected distro: $DISTRO"
echo " install rust: $([ "$INSTALL_RUST" = "1" ] && echo yes || echo no)"
echo " install gpu deps: $([ "$INSTALL_GPU" = "1" ] && echo yes || echo no)"
echo " dry-run: $([ "$DRY_RUN" = "1" ] && echo yes || echo no)"
echo ""
# ─── Common package lists ────────────────────────────────────────────────────
# Required for any build:
# - rust toolchain (rustup or system rust)
# - C compiler + linker (gcc/cc)
# - pkg-config
# - git (for fetching source if needed)
# Required for --features gpu:
# - vulkan headers/loader
# - wayland client + protocols
# - xkbcommon
# - libx11 + libxcb (for X11 fallback in winit)
# Optional for --features images:
# - none extra (image crate vendors its deps)
# Optional for --features lua:
# - none extra (mlua vendors Lua 5.4)
# ─── Per-distro installers ───────────────────────────────────────────────────
install_arch() {
echo "[arch] installing deps via pacman..."
local pkgs=(base-devel pkgconf git)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(rust)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(vulkan-headers vulkan-loader wayland-protocols libxkbcommon xorg-server-xauth)
fi
run pacman -S --needed --noconfirm "${pkgs[@]}"
}
install_debian() {
echo "[debian] installing deps via apt..."
local pkgs=(build-essential pkg-config git ca-certificates)
if [ "$INSTALL_RUST" = "1" ]; then
# Debian's rust package is often outdated; prefer rustup.
pkgs+=(curl)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(libvulkan-dev libwayland-dev libxkbcommon-dev libx11-dev libxcb1-dev)
fi
run apt-get update -y
run apt-get install -y "${pkgs[@]}"
if [ "$INSTALL_RUST" = "1" ] && [ "$DRY_RUN" = "0" ]; then
# Install rustup if rust isn't already present.
if ! command -v cargo &>/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal
# shellcheck disable=SC1091
. "$HOME/.cargo/env"
fi
fi
}
install_fedora() {
echo "[fedora] installing deps via dnf..."
local pkgs=(gcc pkgconf-pkg-config git)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(rust cargo)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(vulkan-headers vulkan-loader-devel wayland-devel wayland-protocols-devel libxkbcommon-devel libX11-devel libxcb-devel)
fi
run dnf install -y "${pkgs[@]}"
}
install_opensuse() {
echo "[opensuse] installing deps via zypper..."
local pkgs=(patterns-devel-base-devel_basis pkg-config git)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(rust cargo)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(vulkan wayland-protocols libxkbcommon-devel libX11-devel libxcb-devel)
fi
run zypper install -y "${pkgs[@]}"
}
install_void() {
echo "[void] installing deps via xbps-install..."
local pkgs=(base-devel pkg-config git)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(rust)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(vulkan-loader Vulkan-Headers wayland-protocols libxkbcommon-devel libX11-devel libxcb-devel)
fi
run xbps-install -Sy "${pkgs[@]}"
}
install_alpine() {
echo "[alpine] installing deps via apk..."
local pkgs=(build-base pkgconf git)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(rust cargo)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(vulkan-loader-dev vulkan-headers wayland-protocols libxkbcommon-dev libx11-dev libxcb-dev)
fi
run apk add "${pkgs[@]}"
}
install_nixos() {
echo "[nixos] NixOS uses declarative packaging."
echo " Create a shell.nix with:"
cat <<'EOF'
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
pkg-config
rustc cargo rustPlatform.rustcSrc
] ++ lib.optionals true [
vulkan-headers vulkan-loader
wayland wayland-protocols
libxkbcommon
xorg.libX11 xorg.libxcb
];
}
EOF
echo " Then run: nix-shell shell.nix"
}
install_sourcemage() {
echo "[sourcemage] installing deps via cast..."
local spells=(rust pkgconfig git)
if [ "$INSTALL_GPU" = "1" ]; then
spells+=(vulkan-loader wayland-protocols xkbcommon)
fi
run cast "${spells[@]}"
}
install_gentoo() {
echo "[gentoo] installing deps via emerge..."
local pkgs=(dev-vcs/git dev-util/pkgconf)
if [ "$INSTALL_RUST" = "1" ]; then
pkgs+=(dev-lang/rust)
fi
if [ "$INSTALL_GPU" = "1" ]; then
pkgs+=(media-libs/vulkan-loader dev-libs/wayland-protocols x11-libs/libxkbcommon)
fi
run emerge --ask=n "${pkgs[@]}"
}
install_unknown() {
echo "=== Unknown distro — manual install instructions ==="
echo ""
echo "Required for any build:"
echo " - rust toolchain (>= 1.75): https://rustup.rs"
echo " - C compiler + linker (gcc/clang)"
echo " - pkg-config"
echo " - git"
echo ""
echo "Required for --features gpu:"
echo " - Vulkan headers + loader"
echo " - wayland client + protocols"
echo " - xkbcommon"
echo " - libX11 + libxcb (for X11 fallback)"
echo ""
echo "Optional for --features lua:"
echo " - none (mlua vendors Lua 5.4)"
echo ""
echo "Optional for --features images:"
echo " - none (image crate vendors its deps)"
echo ""
echo "After installing deps, run: ./scripts/build.sh"
}
# ─── Main ────────────────────────────────────────────────────────────────────
case "$DISTRO" in
arch) need_root; install_arch ;;
debian) need_root; install_debian ;;
fedora) need_root; install_fedora ;;
opensuse) need_root; install_opensuse ;;
void) need_root; install_void ;;
alpine) need_root; install_alpine ;;
nixos) install_nixos ;;
sourcemage) need_root; install_sourcemage ;;
gentoo) need_root; install_gentoo ;;
*) install_unknown; exit 0 ;;
esac
echo ""
echo "=== sysprep complete ==="
if [ "$DRY_RUN" = "0" ]; then
echo "Next step: ./scripts/build.sh"
fi