#!/usr/bin/env bash # # build-niri-deb.sh # # Compile Niri depuis les sources, génère un paquet .deb via cargo-deb, # et gère son installation/désinstallation avec dpkg, sous Debian Trixie (13). # # Usage : # ./build-niri-deb.sh Affiche cette description # ./build-niri-deb.sh install Compile et installe Niri depuis la branche main # ./build-niri-deb.sh install Compile et installe Niri depuis le tag/branche donné # ./build-niri-deb.sh remove Désinstalle Niri et nettoie tout ce que le script a créé set -euo pipefail NIRI_REPO="https://github.com/YaLTeR/niri.git" WORKDIR="$(pwd)/niri" PKG_NAME="niri" DESKTOP_FILE="/usr/share/wayland-sessions/niri.desktop" show_description() { cat <<'EOF' build-niri-deb.sh ================== Ce script compile Niri (compositeur Wayland) depuis les sources, génère un paquet .deb via cargo-deb, puis l'installe avec dpkg. Il installe aussi un fichier .desktop de session Wayland pour que Niri apparaisse dans les gestionnaires de connexion (greetd, GDM, SDDM, ...). Usage : ./build-niri-deb.sh install Compile et installe depuis la branche main ./build-niri-deb.sh install Compile et installe depuis un tag/branche précis (ex: ./build-niri-deb.sh install v25.08) ./build-niri-deb.sh remove Désinstalle le paquet et nettoie tout (paquet dpkg, fichier .desktop, sources clonées) Sans paramètre, ce message s'affiche et le script s'arrête sans rien faire. EOF } install_niri() { local ref="${1:-main}" echo "==> Installation des dépendances de compilation" sudo apt-get update sudo apt-get install -y \ build-essential \ gcc \ clang \ git \ curl \ pkg-config \ libudev-dev \ libgbm-dev \ libxkbcommon-dev \ libegl1-mesa-dev \ libwayland-dev \ libinput-dev \ libdbus-1-dev \ libsystemd-dev \ libseat-dev \ libpipewire-0.3-dev \ libpango1.0-dev \ libdisplay-info-dev echo "==> Vérification de Rust" if ! command -v cargo >/dev/null 2>&1; then echo "Rust n'est pas installé. Installation via rustup..." curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y # shellcheck disable=SC1090 source "$HOME/.cargo/env" else echo "Rust déjà présent : $(cargo --version)" fi echo "==> Installation de cargo-deb" cargo install cargo-deb --locked echo "==> Récupération des sources de Niri (ref: ${ref})" if [ -d "${WORKDIR}" ]; then echo "Le dossier '${WORKDIR}' existe déjà, mise à jour..." cd "${WORKDIR}" git fetch --all git checkout "${ref}" git pull || true else git clone "${NIRI_REPO}" "${WORKDIR}" cd "${WORKDIR}" git checkout "${ref}" fi echo "==> Compilation en mode release" cargo build --release --locked echo "==> Génération du paquet .deb avec cargo-deb" cargo deb --no-build local deb_file deb_file=$(find target/debian -name "*.deb" | head -n1) if [ -z "${deb_file}" ]; then echo "Erreur : aucun fichier .deb trouvé dans target/debian/" exit 1 fi echo "" echo "==> Paquet généré : ${WORKDIR}/${deb_file}" echo "==> Installation avec dpkg" sudo dpkg -i "${deb_file}" echo "==> Installation du fichier .desktop pour la session Wayland" sudo mkdir -p /usr/share/wayland-sessions sudo tee "${DESKTOP_FILE}" > /dev/null < Terminé. Niri est installé et disponible comme session Wayland." } remove_niri() { echo "==> Désinstallation du paquet ${PKG_NAME} avec dpkg" if dpkg -l "${PKG_NAME}" >/dev/null 2>&1; then sudo dpkg -r "${PKG_NAME}" else echo " Le paquet ${PKG_NAME} n'est pas installé, on continue le nettoyage." fi echo "==> Suppression du fichier .desktop de session" if [ -f "${DESKTOP_FILE}" ]; then sudo rm -f "${DESKTOP_FILE}" echo " Supprimé : ${DESKTOP_FILE}" else echo " Rien à supprimer : ${DESKTOP_FILE}" fi echo "==> Suppression du dossier de sources et de build (${WORKDIR})" if [ -d "${WORKDIR}" ]; then rm -rf "${WORKDIR}" echo " Supprimé : ${WORKDIR}" else echo " Rien à supprimer : ${WORKDIR}" fi echo "" echo "==> Nettoyage terminé." } # --- Point d'entrée --- ACTION="${1:-}" case "${ACTION}" in install) install_niri "${2:-main}" ;; remove) remove_niri ;; "") show_description ;; *) echo "Paramètre inconnu : '${ACTION}'" echo "" show_description exit 1 ;; esac