#!/bin/bash # Si l'utilisateur a oublié de mettre sudo, on redémarre le script avec sudo if [ "$EUID" -ne 0 ]; then echo "Le build nécessite les droits administrateur (sudo). Redémarrage..." exec sudo bash "$0" "$@" fi set -e ISO_NAME="arch-custom-iso" # On récupère le nom de l'utilisateur normal (pas root) pour makepkg BUILD_USER="${SUDO_USER:-root}" CUSTOM_PKGS_DIR="$PWD/custom-pkgs" # ============================================================================== # LES LISTES DE PAQUETS # ============================================================================== EXTRA_PACKAGES=( "neovim" "ghostty" "hyprland" "xdg-desktop-portal-hyprland" "git" "yazi" "dolphin" "rofi" "waybar" "wiremix" "impala" "bluetui" "btop" "cava" "fastfetch" "obsidian" "obs-studio" "lazygit" "docker" "docker-buildx" "docker-compose" "lazydocker" "mpv" "prismlauncher" "rust" "chromium" "bat" "base-devel" "cmake" "nodejs" "npm" "pnpm" "python" "python-pip" "curl" "wget" "unzip" ) AUR_PACKAGES=( "visual-studio-code-bin" "subtui-bin" "localsend-bin" ) # ============================================================================== # PROCESSUS DE BUILD # ============================================================================== echo "=====================================" echo " Building Arch Linux ISO" echo " Project: $ISO_NAME" echo " Build lancé par l'utilisateur: $BUILD_USER" echo "=====================================" if ! command -v mkarchiso &> /dev/null; then echo "[ERROR] archiso is not installed" echo "Run: sudo pacman -S archiso" exit 1 fi echo "[1/5] Cleaning previous build..." rm -rf work out offline_cache # --- TÉLÉCHARGEMENT DES PAQUETS OFFICIELS --- echo "[2/6] Downloading Official Packages for offline cache..." # On utilise /tmp pour éviter tout problème de permissions dans le Home TMP_CACHE="/tmp/archiso_cache_$$" mkdir -p "$TMP_CACHE" sudo pacman -Sy --noconfirm # On télécharge (-w) sans installer, dans le dossier temporaire sudo pacman -Sw --noconfirm --cachedir "$TMP_CACHE" "${EXTRA_PACKAGES[@]}" || true # On crée le vrai dossier de cache et on déplace les paquets mkdir -p offline_cache cp "$TMP_CACHE"/*.pkg.tar.zst offline_cache/ 2>/dev/null || true rm -rf "$TMP_CACHE" # --- COMPILATION DES PAQUETS PERSONNALISÉS --- echo "[3/6] Building custom packages from custom-pkgs/..." mkdir -p custom_pkg_build for pkg_dir in "$CUSTOM_PKGS_DIR"/*; do [ -d "$pkg_dir" ] || continue [ -f "$pkg_dir/PKGBUILD" ] || continue pkg_name=$(basename "$pkg_dir") echo " -> Building custom package: $pkg_name" rm -rf "custom_pkg_build/$pkg_name" cp -a "$pkg_dir" "custom_pkg_build/$pkg_name" chown -R "$BUILD_USER":"$BUILD_USER" "custom_pkg_build/$pkg_name" sudo -u "$BUILD_USER" bash -lc "cd '$PWD/custom_pkg_build/$pkg_name' && makepkg -f --noconfirm --needed" mv "custom_pkg_build/$pkg_name"/*.pkg.tar.zst offline_cache/ 2>/dev/null || true done rm -rf custom_pkg_build # --- COMPILATION DES PAQUETS AUR --- echo "[4/6] Building AUR Packages for offline cache..." mkdir -p aur_build for pkg in "${AUR_PACKAGES[@]}"; do echo " -> Building AUR package: $pkg" cd aur_build rm -rf "$pkg" git clone "https://aur.archlinux.org/${pkg}.git" --depth 1 # CRUCIAL : On donne les droits à l'utilisateur NORMAL pour que makepkg accepte de tourner chown -R "$BUILD_USER":"$BUILD_USER" "$pkg" cd "$pkg" # CRUCIAL : On lance makepkg EN TANT QU'UTILISATEUR NORMAL (pas de -s pour éviter de reboucler sur sudo) sudo -u "$BUILD_USER" makepkg -d -f --noconfirm --needed # On déplace le paquet compilé dans notre cache mv *.pkg.tar.zst ../../offline_cache/ cd ../.. done rm -rf aur_build # --- INJECTION DANS L'ISO --- echo "[5/6] Injecting offline cache into ISO skeleton..." mkdir -p airootfs/root/offline_cache cp offline_cache/*.pkg.tar.zst airootfs/root/offline_cache/ rm -rf offline_cache # Copier les scripts personnalisés dans la racine du live system si nécessaire mkdir -p airootfs/usr/local/bin cp custom-pkgs/hello-custom/hello-custom.sh airootfs/usr/local/bin/hello-custom 2>/dev/null || true chmod +x airootfs/usr/local/bin/hello-custom 2>/dev/null || true # --- CRÉATION DE L'ISO --- echo "[6/6] Building ISO (this will take a while)..." sudo mkarchiso -v . if [ -f out/*.iso ]; then echo "" echo "=====================================" echo " Build successful!" echo " ISO located in: out/" echo "=====================================" else echo "[ERROR] ISO not found in out/" exit 1 fi