176 lines
4.9 KiB
Bash
Executable File
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
|