287 lines
9.5 KiB
Bash
Executable File
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
|