dotfiles/.local/bin/build-niri-deb.sh

176 lines
4.9 KiB
Bash
Executable File

#!/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 <tag> 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 <tag> 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 <<EOF
[Desktop Entry]
Name=Niri
Comment=A scrollable-tiling Wayland compositor
Exec=/usr/bin/niri --session
Type=Application
DesktopNames=niri
EOF
echo ""
echo "==> 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