#!/bin/bash # ============================================================================= # build-pagan-complete.sh - Kompletny builder Pagan Linux # ============================================================================= # Pełna budowa: LFS Ch. 5, 6, 7, 8 + BLFS + Kernel 6.18.43 + systemd + GRUB # ============================================================================= set -euo pipefail # ========================= KONFIGURACJA ========================= # Absolutna ścieżka do katalogu skryptów – działa nawet po `cd /` w main() SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PAGAN_ROOT="${PAGAN_ROOT:-/mnt/pagan}" PAGAN_VERSION="${PAGAN_VERSION:-0.0.1}" PAGAN_DE="${PAGAN_DE:-xfce}" # gnome (Wayland domyślnie) | xfce | deepin | budgie PAGAN_RELEASE="2026.07" LFS_VERSION="13.0" # Kernel (można zmienić: KERNEL_VERSION=7.1.5 dla latest, KERNEL_VERSION=6.12.98 dla starszego LTS) KERNEL_VERSION="${KERNEL_VERSION:-6.18.43}" KERNEL_URL="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${KERNEL_VERSION}.tar.xz" # Hardware MAKEFLAGS="-j$(nproc)" LFS_TGT="$(uname -m)-pagan-linux-gnu" # Ścieżki SRC_DIR="$PAGAN_ROOT/sources" TOOLS_DIR="$PAGAN_ROOT/tools" CROSS_BIN="$TOOLS_DIR/bin" OUTPUT_DIR="${OUTPUT_DIR:-/var/pagan-build/output}" mkdir -p "$OUTPUT_DIR" # Artefakt końcowy: img | iso | both | ask ARTIFACT_MODE="${ARTIFACT_MODE:-img}" # Wymuś pełne czyszczenie i budowę od zera: 1|true|yes REBUILD_FROM_SCRATCH="${REBUILD_FROM_SCRATCH:-0}" # Rozmiar obrazu IMG (MB) IMAGE_SIZE="${IMAGE_SIZE:-16384}" # 16GB # ========================= SYSTEM LOGÓW ========================= # Poziomy: 0=DEBUG 1=INFO 2=WARN 3=ERROR : "${PAGAN_LOG_LEVEL:=0}" LOG_FILE="/var/log/pagan-build.log" SUMMARY_FILE="/var/log/pagan-build.summary.log" mkdir -p "$(dirname "$LOG_FILE")" # Inicjalizuj plik logu cat > "$LOG_FILE" < "$SUMMARY_FILE" # ========================= KOLORY (tylko konsola) ========================= RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' BLUE='\033[0;34m'; MAGENTA='\033[0;35m'; CYAN='\033[0;36m' BOLD='\033[1m'; DIM='\033[2m'; NC='\033[0m' # ========================= INTERFEJS UŻYTKOWNIKA ========================= source "$SCRIPT_DIR/ui.sh" ui_init # ========================= STATYSTYKI ========================= PKG_BUILT=0; PKG_FAILED=0; PKG_SKIPPED=0 RESUME_FILE="${RESUME_FILE:-/var/log/pagan-build.done}" # ========================= SYSTEM RESUME ========================= # Sprawdza czy pakiet był już zbudowany _is_built() { local pkg="$1" # --force-pkg nadpisuje resume [[ -n "${FORCE_PKGS:-}" ]] && [[ ",${FORCE_PKGS}," == *",${pkg},"* || ",${FORCE_PKGS}," == *",${pkg%%-*},"* ]] && return 1 [[ -f "$RESUME_FILE" ]] && grep -qxF "$pkg" "$RESUME_FILE" 2>/dev/null } # Oznacza pakiet jako zbudowany _mark_built() { local pkg="$1" mkdir -p "$(dirname "$RESUME_FILE")" echo "$pkg" >> "$RESUME_FILE" } _is_true() { case "${1:-}" in 1|true|TRUE|yes|YES|on|ON|y|Y) return 0 ;; *) return 1 ;; esac } clean_build_state() { step "Tryb: zbuduj od nowa" if [[ -z "$PAGAN_ROOT" || "$PAGAN_ROOT" == "/" ]]; then error "Niebezpieczny PAGAN_ROOT='$PAGAN_ROOT' - odmawiam czyszczenia" fi if declare -F umount_virtual_fs >/dev/null; then umount_virtual_fs >/dev/null 2>&1 || true fi warn "Czyszczenie katalogu builda: $PAGAN_ROOT" rm -rf --one-file-system "$PAGAN_ROOT" rm -f "$RESUME_FILE" mkdir -p "$PAGAN_ROOT" "$OUTPUT_DIR" ok "Wyczyszczono rootfs i stan resume; start od zera" } # ========================= FUNKCJE LOGOWANIA ========================= # _log_raw – zapisuje do pliku (bez kolorów) i na konsolę _log_raw() { local color="$1" lvl="$2" msg="$3" local ts; ts=$(date '+%H:%M:%S') echo -e "${color}[${ts}] [${lvl}]${NC} $msg" echo "[${ts}] [${lvl}] $msg" >> "$LOG_FILE" } dbg() { [[ $PAGAN_LOG_LEVEL -le 0 ]] && _log_raw "${DIM}" "DEBUG" "$*" || true } info() { [[ $PAGAN_LOG_LEVEL -le 1 ]] && _log_raw "${BLUE}" "INFO " "$*" || true } warn() { [[ $PAGAN_LOG_LEVEL -le 2 ]] && _log_raw "${YELLOW}" "WARN " "$*" >&2 || true } error() { _log_raw "${RED}" "ERROR" "$*" >&2 _dump_stack _log_raw "${RED}" "FATAL" "Budowa przerwana. Log: $LOG_FILE" >&2 exit 1 } ok() { _log_raw "${GREEN}" "OK " "$*" ((PKG_BUILT++)) || true echo "✓ $*" >> "$SUMMARY_FILE" } step() { local title="$*" echo "" echo -e "${MAGENTA}${BOLD}═══ ${title} ═══${NC}" echo "━━━ $(date '+%H:%M:%S') ━━━ ${title} ━━━" >> "$LOG_FILE" dbg "START: $title" } _dump_stack() { local frame=0 echo " Stack trace:" >> "$LOG_FILE" while caller $frame 2>/dev/null; do ((frame++)) done >> "$LOG_FILE" } # Trap błędów – łapie SIGERR _on_error() { local lineno="$1" cmd="$2" echo -e "${RED}[ERROR]${NC} Linia ${lineno}: \"${cmd}\"" | tee -a "$LOG_FILE" >&2 echo "[$(date '+%H:%M:%S')] [ERROR] Linia ${lineno}: ${cmd}" >> "$LOG_FILE" _dump_stack } trap '_on_error "${LINENO}" "${BASH_COMMAND}"' ERR # Podsumowanie na wyjściu _show_summary() { # Best-effort cleanup: avoid stale mounts after cancel/error. if declare -F umount_virtual_fs >/dev/null; then umount_virtual_fs >/dev/null 2>&1 || true fi ui_summary } trap _show_summary EXIT # ========================= KONFIGURACJA ========================= # ========================= BANNER ========================= show_banner() { cat << EOF ╔═══════════════════════════════════════════════════════════════════╗ ║ ║ ║ ██████ █████ █████ █████ ███ ██ ║ ║ ██ ██ ██ ██ ██ ██ ██ ████ ██ ║ ║ ██████ ███████ ██████ ███████ ██ ██ ██ ║ ║ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ║ ║ ██ ██ ██ █████ ██ ██ ██ ████ ║ ║ ║ ║ ╔══════════════════════════════════════════════════════════╗ ║ ║ ║ 🐉 Pagan Linux Builder v${PAGAN_VERSION} ║ ║ ║ ║ 📦 LFS ${LFS_VERSION} + BLFS + ${PAGAN_DE^^} ║ ║ ║ ║ 🖥️ Architektura: $(uname -m) ║ ║ ║ ║ 📅 Data: $(date +'%Y-%m-%d %H:%M:%S') ║ ║ ║ ╚══════════════════════════════════════════════════════════╝ ║ ║ ║ ╚═══════════════════════════════════════════════════════════════════╝ EOF } # ========================= SPRAWDZANIE ZALEŻNOŚCI ========================= check_dependencies() { step "Sprawdzanie zależności systemowych" local deps=( "gcc" "g++" "make" "bison" "flex" "texinfo" "bc" "wget" "curl" "tar" "xz" "bzip2" "gzip" "patch" "gawk" "sed" "grep" "find" "file" "diff" "cmp" "python3" "perl" "m4" "cmake" "git" "rsync" "cpio" "gpg" "pkg-config" "xorriso" "mkfs.fat" "parted" "mksquashfs" "ninja" "meson" "glib-mkenums" "g-ir-scanner" "intltool-update" "iceauth" ) local missing=() for dep in "${deps[@]}"; do if ! command -v "$dep" &>/dev/null; then missing+=("$dep") fi done if [[ ${#missing[@]} -gt 0 ]]; then warn "Brakujące pakiety: ${missing[*]}" info "Instalowanie brakujących pakietów..." if command -v apt-get &>/dev/null; then apt-get update apt-get install -y "${missing[@]}" \ libncurses-dev libssl-dev libreadline-dev \ libxml2-dev libxslt1-dev libglib2.0-dev \ libgtk-3-dev libpango1.0-dev libcairo2-dev \ libx11-dev libxext-dev libxft-dev \ libfreetype6-dev libfontconfig1-dev \ libjpeg-dev libpng-dev libtiff-dev \ libgdk-pixbuf2.0-dev libnotify-dev \ libdbus-1-dev libsystemd-dev libudev-dev libmnl-dev libevdev-dev \ libelf-dev libffi-dev libunistring-dev libacl1-dev libattr1-dev \ libpam0g-dev libgirepository1.0-dev gobject-introspection \ libqt5svg5-dev qtbase5-dev qtdeclarative5-dev qttools5-dev \ shared-mime-info intltool xsltproc gperf valac gcc-multilib \ libc6-dev-i386 python3-pip python3-venv elif command -v dnf &>/dev/null; then dnf groupinstall -y "Development Tools" "Development Libraries" dnf install -y "${missing[@]}" \ ncurses-devel openssl-devel readline-devel \ libxml2-devel libxslt-devel glib2-devel \ gtk3-devel pango-devel cairo-devel \ libX11-devel libXext-devel libXft-devel \ freetype-devel fontconfig-devel \ libjpeg-devel libpng-devel libtiff-devel \ gdk-pixbuf2-devel libnotify-devel \ dbus-devel systemd-devel libudev-devel libmnl-devel libevdev-devel \ elfutils-libelf-devel libffi-devel libacl-devel libattr-devel \ pam-devel gobject-introspection-devel qt5-qtbase-devel \ qt5-qtdeclarative-devel qt5-qtsvg-devel shared-mime-info intltool \ libxslt-devel gperf vala gcc-c++ multilib-rpm-config \ python3-devel python3-pip elif command -v pacman &>/dev/null; then # Mapowanie nazw: Debian/Ubuntu → Arch local arch_pkgs=() for dep in "${missing[@]}"; do case "$dep" in xz) arch_pkgs+=("xz") ;; mkfs.fat) arch_pkgs+=("dosfstools") ;; mksquashfs) arch_pkgs+=("squashfs-tools") ;; find) arch_pkgs+=("findutils") ;; diff|cmp) arch_pkgs+=("diffutils") ;; libjpeg|libjpeg-dev) arch_pkgs+=("libjpeg-turbo") ;; glib-mkenums) arch_pkgs+=("glib2-devel") ;; g-ir-scanner) arch_pkgs+=("gobject-introspection") ;; g++) arch_pkgs+=("gcc") ;; intltool-update) arch_pkgs+=("intltool") ;; *) arch_pkgs+=("$dep") ;; esac done pacman -Sy --noconfirm --needed base-devel "${arch_pkgs[@]}" \ ncurses openssl readline libxml2 libxslt glib2 glib2-devel \ gtk3 pango cairo libx11 libxext libxft xtrans xorg-util-macros intltool \ freetype2 fontconfig libjpeg-turbo libpng libtiff \ gdk-pixbuf2 libnotify dbus systemd \ elfutils libffi python python-pip wayland-protocols else error "Nieznany menedżer pakietów. Zainstaluj ręcznie: ${missing[*]}" fi fi ok "Wszystkie zależności spełnione" } # ========================= INICJALIZACJA ========================= init_build() { step "Inicjalizacja środowiska budowy" cd / mkdir -p "$PAGAN_ROOT" "$SRC_DIR" "$TOOLS_DIR" "$OUTPUT_DIR" # Katalogi systemowe for dir in usr bin sbin lib lib64 etc var boot home root \ opt tmp run mnt media srv; do mkdir -p "$PAGAN_ROOT/$dir" done # Katalogi PAG mkdir -p "$PAGAN_ROOT/var/lib/pag"{,/packages,/snapshots} mkdir -p "$PAGAN_ROOT/var/cache/pag" # Deploymenty mkdir -p "$PAGAN_ROOT/.deployments" ok "Środowisko zainicjowane w: $PAGAN_ROOT" } # ========================= POBIERANIE PAKIETÓW ========================= _spinner() { local pid=$1 delay=0.1 spinstr='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏' text="${2:-}" local i=0 while kill -0 "$pid" 2>/dev/null; do i=$(( (i+1) % ${#spinstr} )) printf '\r %s %s' "${spinstr:$i:1}" "$text" sleep "$delay" done printf '\r ✓ %s\n' "$text" } _archive_is_valid() { local file="$1" [[ -s "$file" ]] || return 1 case "$file" in *.tar.xz) xz -t "$file" >/dev/null 2>&1 ;; *.tar.gz|*.tgz) gzip -t "$file" >/dev/null 2>&1 ;; *.tar.bz2|*.tbz2) bzip2 -t "$file" >/dev/null 2>&1 ;; *.tar.zst) if command -v zstd >/dev/null 2>&1; then zstd -t "$file" >/dev/null 2>&1 else unzstd -t "$file" >/dev/null 2>&1 fi ;; *.tar) tar -tf "$file" >/dev/null 2>&1 ;; *.zip) unzip -tqq "$file" >/dev/null 2>&1 ;; *) ! file "$file" 2>/dev/null | grep -qE "HTML document|XML document|ASCII text|empty" ;; esac } download_pkg() { local url="$1" dest="$2" sha="${3:-SKIP}" force="${4:-0}" mkdir -p "$(dirname "$dest")" if [[ "$force" != "1" && -f "$dest" ]]; then if _archive_is_valid "$dest"; then info " ⏭ $(basename "$dest") – już pobrany" return 0 fi warn "Uszkodzone archiwum: $(basename "$dest") – pobieram ponownie" rm -f "$dest" fi # Lista adresów do próby (główny + mirror) local urls=("$url") case "$url" in *ftp.gnu.org/gnu/*) urls+=("https://mirror.kumi.systems/gnu/${url#https://ftp.gnu.org/gnu/}") urls+=("https://mirrors.ocf.berkeley.edu/gnu/${url#https://ftp.gnu.org/gnu/}") urls+=("https://ftp.nluug.nl/pub/gnu/${url#https://ftp.gnu.org/gnu/}") ;; *cdn.kernel.org/*|*www.kernel.org/*) urls+=("https://mirrors.edge.kernel.org/${url#https://cdn.kernel.org/}") urls+=("https://mirrors.edge.kernel.org/${url#https://www.kernel.org/}") ;; *download.savannah.gnu.org*) urls+=("$(echo "$url" | sed 's|https://download.savannah.gnu.org|https://mirror.rabisu.com/mirrors/savannah|')") ;; *github.com*releases*download*.tar.xz) # GitHub: próbuj .tar.gz zamiast .tar.xz (nie zawsze jest .tar.xz) urls+=("${url%.tar.xz}.tar.gz") ;; *github.com*releases*download*.tar.bz2) urls+=("${url%.tar.bz2}.tar.gz") ;; *prdownloads.sourceforge.net*|*downloads.sourceforge.net*|*download.sourceforge.net*) urls+=("${url}?download") ;; *sourceforge.net/projects/*) urls+=("$(echo "$url" | sed 's|https://sourceforge.net/projects/|https://downloads.sourceforge.net/|')?download") ;; esac local ok=0 for u in "${urls[@]}"; do if [[ "$u" != "$url" ]]; then info " ↻ Próbuję mirror: $u" fi rm -f "$dest" if wget -q --show-progress -O "$dest" "$u" 2>/dev/null || \ curl -f -# -L -o "$dest" "$u" 2>/dev/null; then # Sprawdź czy archiwum jest poprawne (nie ucięte/nie HTML) if _archive_is_valid "$dest"; then ok=1 break fi warn "Pobrano uszkodzony/błędny plik z $u – próbuję kolejne źródło" fi done if [[ $ok -eq 0 ]]; then rm -f "$dest" error "Nie udało się pobrać: $url" fi info " ✓ $(basename "$dest")" } # ========================= BUDOWA PAKIETU LFS ========================= build_lfs_pkg() { local pkg_name="$1" local pkg_version="$2" local pkg_url="$3" local pkg_sha="$4" local pkg_config="$5" # Prawdziwa nazwa pliku z URL – niezależna od pkg_name local archive archive=$(basename "$pkg_url" | sed 's/?.*//') local archive_path="$SRC_DIR/$archive" local pkg_dir="$SRC_DIR/build-${pkg_name}" ((UI_PKG_N++)) || true # Resume – pomiń jeśli pakiet już zbudowany if _is_built "${pkg_name}-${pkg_version}"; then ui_skip "${pkg_name}-${pkg_version}" ((PKG_SKIPPED++)) || true return 0 fi info " 📦 Budowanie: ${pkg_name}-${pkg_version}" download_pkg "$pkg_url" "$archive_path" "$pkg_sha" rm -rf "$pkg_dir" mkdir -p "$pkg_dir" # Sprawdź czy archiwum ma katalog nadrzędny (np. gcc-14.2.0/) czy jest płaskie (tzdata) local _strip="" local _tar_first _tar_second tar tf "$archive_path" > /tmp/_tar_first.tmp 2>/dev/null || true _tar_first=$(sed -n '1p' /tmp/_tar_first.tmp 2>/dev/null) _tar_second=$(sed -n '2p' /tmp/_tar_first.tmp 2>/dev/null) rm -f /tmp/_tar_first.tmp # Niektóre tarballe (np. openssh) listują katalog nadrzędny BEZ końcowego '/', # więc jeśli 1. wpis nie ma '/', ale 2. już ma → to katalog nadrzędny. if [[ "$_tar_first" == *"/"* ]]; then _strip="--strip-components=1" elif [[ -n "$_tar_second" && "$_tar_second" == *"/"* ]]; then _strip="--strip-components=1" fi case "$archive" in *.tar.xz) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar.gz) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar.zst) unzstd -d "$archive_path" -o "$SRC_DIR/${archive%.zst}" && \ tar -xf "$SRC_DIR/${archive%.zst}" -C "$pkg_dir" $_strip ;; *.tar.bz2|*.tbz2) tar -xjf "$archive_path" -C "$pkg_dir" $_strip ;; *.tgz) tar -xzf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.zip) unzip -q "$archive_path" -d "$pkg_dir" ;; # Pliki bez archiwum (np. .pem, .crt) – kopiuj bezpośrednio *) cp "$archive_path" "$pkg_dir/$(basename "$archive")" ;; esac || { warn "Rozpakowanie $pkg_name nieudane – wymuszam ponowne pobranie i retry" rm -f "$archive_path" "$SRC_DIR/${archive%.zst}" download_pkg "$pkg_url" "$archive_path" "$pkg_sha" 1 case "$archive" in *.tar.xz) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar.gz) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar.zst) unzstd -d "$archive_path" -o "$SRC_DIR/${archive%.zst}" && tar -xf "$SRC_DIR/${archive%.zst}" -C "$pkg_dir" $_strip ;; *.tar.bz2|*.tbz2) tar -xjf "$archive_path" -C "$pkg_dir" $_strip ;; *.tgz) tar -xzf "$archive_path" -C "$pkg_dir" $_strip ;; *.tar) tar -xf "$archive_path" -C "$pkg_dir" $_strip ;; *.zip) unzip -q "$archive_path" -d "$pkg_dir" ;; *) cp "$archive_path" "$pkg_dir/$(basename "$archive")" ;; esac || error "Rozpakowanie $pkg_name nieudane" } pushd "$pkg_dir" > /dev/null local pkg_log="$UI_LOG_DIR/${pkg_name}-${pkg_version}.log" if [[ -n "$pkg_config" && "$pkg_config" != "SKIP" ]]; then ui_build_eval "${pkg_name}-${pkg_version}" "$pkg_log" "$pkg_config" \ || error "Configure failed for $pkg_name (log: $pkg_log)" fi # Pomijaj auto make/install jeśli pkg_config już robi wszystko sam local _skip_auto_make=0 case "$pkg_config" in *"cp -"*) _skip_auto_make=1 ;; *"cp "*) _skip_auto_make=1 ;; *"make install"*) _skip_auto_make=1 ;; *"DESTDIR="*) _skip_auto_make=1 ;; *"ninja"*) _skip_auto_make=1 ;; *"pip3"*) _skip_auto_make=1 ;; *"pip install"*) _skip_auto_make=1 ;; *"cmake --install"*) _skip_auto_make=1 ;; *"./bootstrap"*) _skip_auto_make=1 ;; *"install -m"*) _skip_auto_make=1 ;; *"osinfo-db-import"*) _skip_auto_make=1 ;; *"PREFIX="*) _skip_auto_make=1 ;; *"ZONEINFO="*) _skip_auto_make=1 ;; make*) _skip_auto_make=1 ;; esac if [[ $_skip_auto_make -eq 0 ]]; then info " 🔨 Make: $pkg_name" ui_build_eval "${pkg_name}-${pkg_version} (make)" "$pkg_log" "make $MAKEFLAGS && make install" \ || error "Make/Install failed for $pkg_name (log: $pkg_log)" fi popd > /dev/null rm -rf "$pkg_dir" # Remove .la files (libtool archives) – they have hardcoded paths, break cross-building find "$PAGAN_ROOT/usr/lib" -name "*.la" -delete 2>/dev/null || true # Fix .pc files: rewrite prefix paths so pkg-config finds target without SYSROOT for pc in "$PAGAN_ROOT/usr/lib/pkgconfig/"*.pc "$PAGAN_ROOT/usr/share/pkgconfig/"*.pc; do if [[ -f "$pc" ]]; then sed -i 's|^prefix=/usr$|prefix='"$PAGAN_ROOT"'/usr|' "$pc" # Remove bare -I${includedir} (without subdir) to avoid exposing target libc headers sed -i '/^Cflags:/ { s/ -I\${includedir} / /g; s/^-I\${includedir} //; s/ -I\${includedir}$// }' "$pc" fi done 2>/dev/null || true _mark_built "${pkg_name}-${pkg_version}" ok " ✅ Zbudowano: $pkg_name-$pkg_version" } # ========================= ABI SANITY (TARGET ONLY) ========================= _max_ver_from_strings() { local file="$1" prefix="$2" strings -a "$file" 2>/dev/null \ | rg -o "${prefix}_[0-9]+\.[0-9]+" 2>/dev/null \ | sed "s/^${prefix}_//" \ | sort -V \ | tail -n 1 || true } _ver_gt() { # true jeśli $1 > $2 [[ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | tail -n 1)" == "$1" && "$1" != "$2" ]] } check_target_abi() { step "ABI sanity check (target LFS libs)" local target_libc="$PAGAN_ROOT/usr/lib/libc.so.6" if [[ ! -f "$target_libc" ]]; then warn "Brak $target_libc - pomijam ABI check" return 0 fi local target_glibc target_glibc=$(_max_ver_from_strings "$target_libc" "GLIBC") if [[ -z "$target_glibc" ]]; then warn "Nie udało się odczytać wersji GLIBC z targetu - pomijam ABI check" return 0 fi info "Target GLIBC (z $target_libc): $target_glibc" local bad=0 while IFS= read -r so; do local req req=$(_max_ver_from_strings "$so" "GLIBC") [[ -z "$req" ]] && continue if _ver_gt "$req" "$target_glibc"; then warn "ABI mismatch (target): $(basename "$so") wymaga GLIBC_$req > GLIBC_$target_glibc" ((bad++)) || true fi done < <(find "$PAGAN_ROOT/usr/lib" -maxdepth 1 -type f -name '*.so*' 2>/dev/null) if [[ $bad -gt 0 ]]; then error "Wykryto $bad bibliotek(i) w targetowym $PAGAN_ROOT/usr/lib wymagających nowszego GLIBC niż LFS target. To nie jest host-check, tylko check targetu. Wyczyść $PAGAN_ROOT i zbuduj od nowa." fi ok "ABI sanity check targetu: OK" } # ========================= LFS PATCH CHECK (BEST-EFFORT) ========================= check_lfs_patches() { step "Sprawdzanie dostępnych patchy LFS (best-effort)" local patch_index_url="https://www.linuxfromscratch.org/patches/lfs/${LFS_VERSION}/" local html if ! html=$(curl -fsSL --max-time 20 "$patch_index_url" 2>/dev/null); then warn "Nie udało się pobrać indeksu patchy LFS: $patch_index_url" warn "Pomijam check patchy (build będzie kontynuowany)." return 0 fi local tracked=( "bash-5.2.37" "bzip2-1.0.8" "coreutils-9.5" "diffutils-3.10" "findutils-4.10.0" "glibc-2.44" "grep-3.11" "gzip-1.13" "make-4.4.1" "openssl-3.3.2" "python-3.12.5" "sed-4.9" "systemd-256.4" "tar-1.35" "util-linux-2.40.2" ) local found=0 for pkg in "${tracked[@]}"; do if echo "$html" | rg -qi "${pkg}.*\.patch"; then warn "LFS patch dostępny dla: $pkg" ((found++)) || true fi done if [[ $found -eq 0 ]]; then ok "Nie wykryto oczywistych patchy dla śledzonych pakietów LFS ${LFS_VERSION}" else warn "Wykryto $found potencjalnych patchy LFS. Rozważ integrację przed release build." fi } report_artifacts() { step "LOKALIZACJE ARTEFAKTÓW" local img_file="$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.img" local iso_file="$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.iso" local printed=0 if [[ -f "$img_file" ]]; then info "IMG: $img_file ($(du -h "$img_file" 2>/dev/null | cut -f1))" echo "IMG: $img_file" >> "$SUMMARY_FILE" printed=1 fi if [[ -f "$iso_file" ]]; then info "ISO: $iso_file ($(du -h "$iso_file" 2>/dev/null | cut -f1))" echo "ISO: $iso_file" >> "$SUMMARY_FILE" printed=1 fi if [[ $printed -eq 0 ]]; then warn "Nie znaleziono artefaktów IMG/ISO w $OUTPUT_DIR" fi } # ========================= BUDOWA TOOLCHAIN (Ch. 5) ========================= build_toolchain() { step "ROZDZIAŁ 5: BUDOWA TOOLCHAIN" ui_set_total 7 export LC_ALL=POSIX export LFS="$PAGAN_ROOT" export LFS_TGT="$LFS_TGT" # 5.2 - Linux headers (host make) build_lfs_pkg "linux-headers-tc" "$KERNEL_VERSION" \ "$KERNEL_URL" \ "SKIP" \ "make mrproper && make headers && find usr/include -type f ! -name '*.h' -delete && cp -rv usr/include $PAGAN_ROOT/usr" # 5.3 - GMP (statycznie – PRZED binutils, czysty host PATH!) # GCC 16 (C23) zabija stare testy GMP. -std=gnu89 dla configure (testy), # ale build potrzebuje C99 → make CFLAGS='-O2' (nadpisuje Makefile). build_lfs_pkg "gmp-tc" "6.3.0" \ "https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz" \ "SKIP" \ "CFLAGS='-std=gnu89 -O2' ./configure --prefix=$TOOLS_DIR --enable-cxx --disable-shared --enable-static && make CFLAGS='-O2' $MAKEFLAGS && make install" # 5.4 - MPFR (host PATH) build_lfs_pkg "mpfr-tc" "4.2.1" \ "https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz" \ "SKIP" \ "CFLAGS='-std=gnu89 -O2' ./configure --prefix=$TOOLS_DIR --disable-shared --enable-static --with-gmp=$TOOLS_DIR && make CFLAGS='-O2' $MAKEFLAGS && make install" # 5.5 - MPC (host PATH) build_lfs_pkg "mpc-tc" "1.3.1" \ "https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz" \ "SKIP" \ "CFLAGS='-std=gnu89 -O2' ./configure --prefix=$TOOLS_DIR --disable-shared --enable-static --with-gmp=$TOOLS_DIR --with-mpfr=$TOOLS_DIR && make CFLAGS='-O2' $MAKEFLAGS && make install" # 5.6 - Binutils pass 1 (cross-tools – od teraz PATH=$TOOLS_DIR/bin:$PATH) export PATH="$TOOLS_DIR/bin:$PATH" build_lfs_pkg "binutils-pass1" "2.43.1" \ "https://ftp.gnu.org/gnu/binutils/binutils-2.43.1.tar.xz" \ "SKIP" \ "mkdir -v build && cd build && ../configure --prefix=$TOOLS_DIR --with-sysroot=$PAGAN_ROOT --target=$LFS_TGT --disable-nls --enable-gprofng=no --disable-werror --disable-dependency-tracking && make $MAKEFLAGS && make install" # 5.7 - GCC pass 1 (cross-compiler) # GCC 16.1.1 host kompiluje GCC 14.2.0 źródła jako C++. safe-ctype.h # definiuje #define isgraph(c) do_not_use_isgraph..., a GCC16 # robi using ::isgraph; → makro się rozwija → łamie parser locale_facets.h. # Fix: w system.h dodajemy #include przed safe-ctype.h i # #undef makr po nim. build_lfs_pkg "gcc-pass1" "14.2.0" \ "https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz" \ "SKIP" \ 'case $(uname -m) in x86_64) sed -e "/m64=/s/lib64/lib/" -i.orig gcc/config/i386/t-linux64 ;; esac; sed -i "s/__cplusplus != 201103/__cplusplus < 201103/g; s/__cplusplus > 201103/__cplusplus < 201103/g" libcody/configure 2>/dev/null || true; sed -i "/^#include \"safe-ctype.h\"/i #ifdef __cplusplus\n#include \n#endif" gcc/system.h 2>/dev/null || true; sed -i "/^#include \"safe-ctype.h\"/a #ifdef __cplusplus\n#undef isalpha\n#undef isalnum\n#undef iscntrl\n#undef isdigit\n#undef isgraph\n#undef islower\n#undef isprint\n#undef ispunct\n#undef isspace\n#undef isupper\n#undef isxdigit\n#undef toupper\n#undef tolower\n#endif" gcc/system.h 2>/dev/null || true; mkdir -v build && cd build && ../configure --target='"$LFS_TGT"' --prefix='"$TOOLS_DIR"' --with-gmp='"$TOOLS_DIR"' --with-mpfr='"$TOOLS_DIR"' --with-mpc='"$TOOLS_DIR"' --with-glibc-version=2.44 --with-sysroot='"$PAGAN_ROOT"' --with-newlib --without-headers --enable-default-pie --enable-default-ssp --disable-nls --disable-shared --disable-multilib --disable-threads --disable-libatomic --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv --disable-libstdcxx --enable-languages=c,c++ --enable-werror=no CXXFLAGS="-std=gnu++20 -O2 -Wno-error=return-type -fno-char8_t -Wno-deprecated-enum-enum-conversion" && make '"$MAKEFLAGS"' && make install && cd .. && ln -sf gcc '"$CROSS_BIN"'/cc' # 5.8 - Glibc (cross-kompilowana) build_lfs_pkg "glibc-tc" "2.44" \ "https://ftp.gnu.org/gnu/glibc/glibc-2.44.tar.xz" \ "SKIP" \ "rm -rf $PAGAN_ROOT/usr/include/gnu $PAGAN_ROOT/usr/include/features.h $PAGAN_ROOT/usr/include/stdc-predef.h 2>/dev/null; mkdir -v build && cd build && ../configure --prefix=/usr --host=$LFS_TGT --build=\$(../scripts/config.guess) --enable-kernel=4.14 --with-headers=$PAGAN_ROOT/usr/include libc_cv_slibdir=/usr/lib --disable-werror CFLAGS=\"-O2 -Wno-error=maybe-uninitialized\" && make $MAKEFLAGS && make DESTDIR=$PAGAN_ROOT install" ok "Toolchain zbudowany!" } # ========================= BUDOWA SYSTEMU KOŃCOWEGO (Ch. 6) ========================= build_final_system() { step "ROZDZIAŁ 6-8: PEŁNY SYSTEM KOŃCOWY LFS 13.0" # Używamy NARZĘDZI HOSTA podczas budowy (nie chroot). $PAGAN_ROOT/usr/bin # celowo pomijamy: targetowe binarki (groff 1.23.0, msgfmt) nie działają na # hoście (szukają fontów/bibliotek w /usr lub nie mają LD_LIBRARY_PATH). # /usr/bin/core_perl+/vendor_perl: sudo resetuje PATH i gubi je (pod2man!). export PATH="$TOOLS_DIR/bin:/usr/bin/core_perl:/usr/bin/vendor_perl:$PATH" export LC_ALL=POSIX # Globalna kompatybilność z GCC 16 (Arch) – wycisza nowe warningi, # które stają się błędami przez -Werror w wielu projektach. # -std=gnu17: stare pakiety (gnulib: m4/coreutils/grep) nie rozumieją C23 ([[nodiscard]]) export CFLAGS="-std=gnu17 -O2 -Wno-error=implicit-function-declaration -Wno-error=int-conversion -Wno-error=return-type -Wno-error=maybe-uninitialized -Wno-error=discarded-qualifiers -Wno-error=unterminated-string-initialization -Wno-error=incompatible-pointer-types -Wno-error=null-dereference -Wno-error=override-init" export CXXFLAGS="-O2 -Wno-error=return-type -Wno-error=maybe-uninitialized" # Coreutils (i inne GNU) odmawiają configure jako root bez tej zmiennej export FORCE_UNSAFE_CONFIGURE=1 # Targetowe metadane mają pierwszeństwo podczas budowy systemu PaganOS. export PKG_CONFIG_DIR="" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/lib/x86_64-linux-gnu/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" export PKG_CONFIG_LIBDIR="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/lib/x86_64-linux-gnu/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="$PAGAN_ROOT" # Linkuj z targetowymi libami (glibc 2.44, zgodne z hostem) # UWAGA: brak globalnego CPPFLAGS=-I$PAGAN_ROOT/usr/include — glibc budując sam siebie # nie może mieć -I na zainstalowane headery glibc (guard _LIBC w gnu/stubs-64.h) export LDFLAGS="-L$PAGAN_ROOT/usr/lib -L$PAGAN_ROOT/lib64 -Wl,-rpath-link,$PAGAN_ROOT/usr/lib -Wl,-rpath-link,$PAGAN_ROOT/lib64" local packages=( # ======== ADMINISTRACJA I KONFIGURACJA ======== "man-pages:6.17:https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.17.tar.xz:SKIP:make -R prefix=/usr install" "iana-etc:20260202:https://github.com/Mic92/iana-etc/releases/download/20260202/iana-etc-20260202.tar.gz:SKIP:cp services protocols \$PAGAN_ROOT/etc" "tzdata:2025c:https://www.iana.org/time-zones/repository/releases/tzdata2025c.tar.gz:SKIP:ZONEINFO=\$PAGAN_ROOT/usr/share/zoneinfo && mkdir -p \$ZONEINFO && cp -r ./* \$ZONEINFO/" # ======== BIBLIOTEKI BAZOWE ======== "glibc:2.44:https://ftp.gnu.org/gnu/glibc/glibc-2.44.tar.xz:SKIP:mkdir bld && cd bld && ../configure --prefix=/usr --enable-kernel=4.14 --enable-stack-protector=strong libc_cv_slibdir=/usr/lib --disable-werror CFLAGS=\"-O2 -Wno-error=maybe-uninitialized\" && make && make install DESTDIR=\$PAGAN_ROOT" "zlib:1.3.2:https://zlib.net/fossils/zlib-1.3.2.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "bzip2:1.0.8:https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz:SKIP:make -f Makefile-libbz2_so && make install PREFIX=\$PAGAN_ROOT/usr" "xz:5.8.2:https://github.com/tukaani-project/xz/releases/download/v5.8.2/xz-5.8.2.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "zstd:1.5.7:https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz:SKIP:make prefix=/usr && make prefix=/usr DESTDIR=\$PAGAN_ROOT install" "lz4:1.10.0:https://github.com/lz4/lz4/releases/download/v1.10.0/lz4-1.10.0.tar.gz:SKIP:make && make PREFIX=/usr DESTDIR=\$PAGAN_ROOT install" "readline:8.3:https://ftp.gnu.org/gnu/readline/readline-8.3.tar.gz:SKIP:./configure --prefix=/usr --disable-static --with-curses && make SHLIB_LIBS=-lncurses && make install DESTDIR=\$PAGAN_ROOT" "gmp:6.3.0:https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz:SKIP:./configure --prefix=/usr --enable-cxx --disable-static CFLAGS=\"-O2 -std=gnu89\" && make CFLAGS=\"-O2\" && make install DESTDIR=\$PAGAN_ROOT" "mpfr:4.2.2:https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.2.tar.xz:SKIP:./configure --prefix=/usr --disable-static --enable-thread-safe && make && make install DESTDIR=\$PAGAN_ROOT" "mpc:1.3.1:https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "isl:0.27:https://libisl.sourceforge.io/isl-0.27.tar.bz2:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "attr:2.5.2:https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "acl:2.3.2:https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "libcap:2.77:https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.77.tar.xz:SKIP:make prefix=/usr lib=lib && make prefix=/usr lib=lib DESTDIR=\$PAGAN_ROOT install" "libxcrypt:4.5.2:https://github.com/besser82/libxcrypt/releases/download/v4.5.2/libxcrypt-4.5.2.tar.xz:SKIP:./configure --prefix=/usr --enable-hashes=strong,glibc --disable-static CFLAGS=\"-O2 -Wno-error=discarded-qualifiers -Wno-error=unterminated-string-initialization\" && make && make install DESTDIR=\$PAGAN_ROOT" "pcre2:10.47:https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.47/pcre2-10.47.tar.bz2:SKIP:./configure --prefix=/usr --enable-unicode --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "elfutils:0.194:https://sourceware.org/ftp/elfutils/0.194/elfutils-0.194.tar.bz2:SKIP:./configure --prefix=/usr --disable-debuginfod --disable-libdebuginfod --disable-werror && make && make -C libelf install DESTDIR=\$PAGAN_ROOT" "libffi:3.4.6:https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" # ======== KOMPILATOR GCC (z C i C++) ======== "gcc:15.2.0:https://ftp.gnu.org/gnu/gcc/gcc-15.2.0/gcc-15.2.0.tar.xz:SKIP:sed -i 's/__cplusplus != 201103/__cplusplus < 201103/g; s/__cplusplus > 201103/__cplusplus < 201103/g' libcody/configure 2>/dev/null || true; sed -i '/^#include \"safe-ctype.h\"/i #ifdef __cplusplus\n#include \n#endif' gcc/system.h 2>/dev/null || true; case \$(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 ;; esac; mkdir -v build && cd build && ../configure --prefix=/usr --enable-languages=c,c++ --disable-multilib --disable-bootstrap --with-system-zlib --enable-default-pie --enable-default-ssp --disable-libsanitizer --enable-werror=no CXXFLAGS=\"-O2 -Wno-error=return-type -fno-char8_t -Wno-deprecated-enum-enum-conversion\" && make \$MAKEFLAGS && make install DESTDIR=\$PAGAN_ROOT && ln -sf gcc \$PAGAN_ROOT/usr/bin/cc" # ======== NARZĘDZIA SYSTEMOWE ======== "file:5.46:https://astron.com/pub/file/file-5.46.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "m4:1.4.21:https://ftp.gnu.org/gnu/m4/m4-1.4.21.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "bc:7.0.3:https://github.com/gavinhoward/bc/releases/download/7.0.3/bc-7.0.3.tar.xz:SKIP:CC=gcc CFLAGS=\"-std=c99 -O2\" ./configure --prefix=/usr -G -O3 && make && make install DESTDIR=\$PAGAN_ROOT" "flex:2.6.4:https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT && ln -sf flex \$PAGAN_ROOT/usr/bin/lex" "bison:3.8.2:https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "tcl:8.6.17:https://downloads.sourceforge.net/tcl/tcl8.6.17-src.tar.gz:SKIP:cd unix && ./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "expect:5.45.4:https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz:SKIP:cp -f pty_termios.c pty_.c 2>/dev/null || true; ./configure --prefix=/usr --with-tcl=/usr/lib --enable-shared && sed -e 's/^#undef HAVE_TERMIOS/#define HAVE_TERMIOS 1/' -e 's/^#undef HAVE_UNISTD_H/#define HAVE_UNISTD_H 1/' -e 's/^#undef HAVE_SYS_FCNTL_H/#define HAVE_SYS_FCNTL_H 1/' -e 's/^#undef HAVE_SYS_SELECT_H/#define HAVE_SYS_SELECT_H 1/' -e 's/^#undef HAVE_SYS_TIME_H/#define HAVE_SYS_TIME_H 1/' -e 's/^#undef HAVE_SYS_TYPES_H/#define HAVE_SYS_TYPES_H 1/' -e 's/^#undef HAVE_SYS_STAT_H/#define HAVE_SYS_STAT_H 1/' -e 's/^#undef HAVE_STDLIB_H/#define HAVE_STDLIB_H 1/' -e 's/^#undef HAVE_STRING_H/#define HAVE_STRING_H 1/' -e 's/^#undef HAVE_MEMORY_H/#define HAVE_MEMORY_H 1/' -e 's/^#undef HAVE_INTTYPES_H/#define HAVE_INTTYPES_H 1/' -e 's/^#undef HAVE_LIMITS_H/#define HAVE_LIMITS_H 1/' -e 's/^#undef HAVE_TCGETS_OR_TCGETA_IN_TERMIOS_H/#define HAVE_TCGETS_OR_TCGETA_IN_TERMIOS_H 1/' -e 's/^#undef HAVE_TIOCGWINSZ_IN_TERMIOS_H/#define HAVE_TIOCGWINSZ_IN_TERMIOS_H 1/' -e 's/^#undef HAVE_SYSMACROS_H/#define HAVE_SYSMACROS_H 1/' -e 's/^#undef HAVE_STDARG_H/#define HAVE_STDARG_H 1/' -e 's/^#undef TIME_WITH_SYS_TIME/#define TIME_WITH_SYS_TIME 1/' expect_cf.h.in > expect_cf.h && sed -i '\$a#define NO_UNION_WAIT 1\n#define SETPGRP_VOID 1\n#define POSIX 1\n#define RETSIGTYPE void\n#define HAVE_OPENPTY 1\n#define HAVE_TCSETATTR 1\n#define HAVE_SYS_WAIT_H 1\n#define HAVE_SYSCONF 1\n#define HAVE_STRFTIME 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MEMCPY 1\n#define HAVE_TIMEZONE 1\n#define HAVE_SIGLONGJMP 1\n#define HAVE_STRCHR 1\n#define HAVE_LONG_FILE_NAMES 1\n#define HAVE_TIME_H 1\n#define REARM_SIG 1\n#define WNOHANG_REQUIRES_POSIX_SOURCE 1' expect_cf.h && make && make install DESTDIR=\$PAGAN_ROOT" "autoconf:2.72:https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "automake:1.18.1:https://ftp.gnu.org/gnu/automake/automake-1.18.1.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "libtool:2.5.4:https://ftp.gnu.org/gnu/libtool/libtool-2.5.4.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "gdbm:1.26:https://ftp.gnu.org/gnu/gdbm/gdbm-1.26.tar.gz:SKIP:./configure --prefix=/usr --disable-static --enable-libgdbm-compat && make && make install DESTDIR=\$PAGAN_ROOT" "gperf:3.3:https://ftp.gnu.org/gnu/gperf/gperf-3.3.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "expat:2.7.4:https://github.com/libexpat/libexpat/releases/download/R_2_7_4/expat-2.7.4.tar.xz:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "gettext:0.22.5:https://ftp.gnu.org/gnu/gettext/gettext-0.22.5.tar.xz:SKIP:./configure --prefix=/usr --disable-static --disable-acl && make && make install DESTDIR=\$PAGAN_ROOT" "check:0.15.2:https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz:SKIP:./configure --prefix=/usr --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "groff:1.23.0:https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "texinfo:7.2:https://ftp.gnu.org/gnu/texinfo/texinfo-7.2.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "intltool:0.51.0:https://deb.debian.org/debian/pool/main/i/intltool/intltool_0.51.0.orig.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" # ======== NARZĘDZIA GNU CORE ======== "ncurses:6.6:https://invisible-mirror.net/archives/ncurses/ncurses-6.6.tar.gz:SKIP:./configure --prefix=/usr --with-shared --without-debug --without-normal --enable-widec && make && make install DESTDIR=\$PAGAN_ROOT && for lib in ncurses form panel menu; do ln -sfv lib\${lib}w.so \$PAGAN_ROOT/usr/lib/lib\${lib}.so 2>/dev/null; done && ln -sfv libncursesw.so \$PAGAN_ROOT/usr/lib/libtinfo.so 2>/dev/null" "bash:5.3:https://ftp.gnu.org/gnu/bash/bash-5.3.tar.gz:SKIP:./configure --prefix=/usr --without-bash-malloc --with-installed-readline && make && make install DESTDIR=\$PAGAN_ROOT && ln -sf bash \$PAGAN_ROOT/bin/sh" "coreutils:9.10:https://ftp.gnu.org/gnu/coreutils/coreutils-9.10.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "diffutils:3.12:https://ftp.gnu.org/gnu/diffutils/diffutils-3.12.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "findutils:4.10.0:https://ftp.gnu.org/gnu/findutils/findutils-4.10.0.tar.xz:SKIP:./configure --prefix=/usr --localstatedir=/var/lib/locate && make && make install DESTDIR=\$PAGAN_ROOT" "gawk:5.3.2:https://ftp.gnu.org/gnu/gawk/gawk-5.3.2.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "grep:3.12:https://ftp.gnu.org/gnu/grep/grep-3.12.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "gzip:1.14:https://ftp.gnu.org/gnu/gzip/gzip-1.14.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "make:4.4.1:https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "patch:2.8:https://ftp.gnu.org/gnu/patch/patch-2.8.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "sed:4.9:https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "tar:1.35:https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz:SKIP:./configure --prefix=/usr --without-posix-acls && make && make install DESTDIR=\$PAGAN_ROOT" "libpipeline:1.5.8:https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.8.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "man-db:2.13.1:https://download.savannah.gnu.org/releases/man-db/man-db-2.13.1.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --disable-setuid && make && make install DESTDIR=\$PAGAN_ROOT" "vim:9.2.0078:https://github.com/vim/vim/archive/v9.2.0078/vim-9.2.0078.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT && ln -sf vim \$PAGAN_ROOT/usr/bin/vi" # ======== BEZPIECZEŃSTWO ======== "openssl:3.6.1:https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz:SKIP:./Configure --prefix=/usr --openssldir=/etc/ssl --libdir=lib shared zlib-dynamic && make && make install DESTDIR=\$PAGAN_ROOT" "libbsd:0.12.2:https://libbsd.freedesktop.org/releases/libbsd-0.12.2.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "shadow:4.19.3:https://github.com/shadow-maint/shadow/releases/download/4.19.3/shadow-4.19.3.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --with-group-name-max-length=32 && make && make install DESTDIR=\$PAGAN_ROOT" "linux-pam:1.6.1:https://github.com/linux-pam/linux-pam/releases/download/v1.6.1/Linux-PAM-1.6.1.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "sudo:1.9.16p2:https://www.sudo.ws/dist/sudo-1.9.16p2.tar.gz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --with-secure-path && make && make install DESTDIR=\$PAGAN_ROOT" "polkit:125:https://github.com/polkit-org/polkit/archive/refs/tags/125.tar.gz:SKIP:meson setup build --prefix=/usr && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install" # ======== SIEC ======== "curl:8.9.1:https://curl.se/download/curl-8.9.1.tar.xz:SKIP:./configure --prefix=/usr --with-openssl --disable-static && make && make install DESTDIR=\$PAGAN_ROOT" "inetutils:2.7:https://ftp.gnu.org/gnu/inetutils/inetutils-2.7.tar.gz:SKIP:./configure --prefix=/usr --disable-logger --disable-whois --disable-servers && make && make install DESTDIR=\$PAGAN_ROOT" "iproute2:6.18.0:https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.18.0.tar.xz:SKIP:sed -i /ARPD/d Makefile && make && make DESTDIR=\$PAGAN_ROOT SBINDIR=/usr/sbin install" "dhcpcd:10.0.8:https://github.com/NetworkConfiguration/dhcpcd/releases/download/v10.0.8/dhcpcd-10.0.8.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc && make && make install DESTDIR=\$PAGAN_ROOT" "wpa_supplicant:2.10:https://w1.fi/releases/wpa_supplicant-2.10.tar.gz:SKIP:cd wpa_supplicant && cp defconfig .config && make && make DESTDIR=\$PAGAN_ROOT install" "iptables:1.8.10:https://www.netfilter.org/projects/iptables/files/iptables-1.8.10.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc && make && make install DESTDIR=\$PAGAN_ROOT" # ======== SYSTEM I USŁUGI ======== "util-linux:2.41.3:https://www.kernel.org/pub/linux/utils/util-linux/v2.41/util-linux-2.41.3.tar.xz:SKIP:./configure --bindir=/usr/bin --libdir=/usr/lib --sbindir=/usr/sbin --disable-chfn-chsh --disable-login --disable-nologin --disable-su --disable-runuser --disable-pylibmount --disable-liblastlog2 --without-python --without-systemd && make && make install DESTDIR=\$PAGAN_ROOT" "e2fsprogs:1.47.3:https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.3/e2fsprogs-1.47.3.tar.gz:SKIP:mkdir bld && cd bld && ../configure --prefix=/usr --sysconfdir=/etc --enable-elf-shlibs --disable-fuse2fs && make && make install DESTDIR=\$PAGAN_ROOT" "procps-ng:4.0.6:https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.6.tar.xz:SKIP:./configure --prefix=/usr --disable-static --disable-kill --without-ncurses && make && make install DESTDIR=\$PAGAN_ROOT" "psmisc:23.7:https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.7.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "kmod:34.2:https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-34.2.tar.xz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --disable-manpages --with-openssl --with-xz --with-zstd --with-zlib && make && make install DESTDIR=\$PAGAN_ROOT" "kbd:2.9.0:https://www.kernel.org/pub/linux/utils/kbd/kbd-2.9.0.tar.xz:SKIP:./configure --prefix=/usr --disable-vlock && make && make install DESTDIR=\$PAGAN_ROOT" "less:692:https://www.greenwoodsoftware.com/less/less-692.tar.gz:SKIP:./configure --prefix=/usr --sysconfdir=/etc && make && make install DESTDIR=\$PAGAN_ROOT" "sysklogd:2.7.2:https://github.com/troglobit/sysklogd/releases/download/v2.7.2/sysklogd-2.7.2.tar.gz:SKIP:./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var && make && make install DESTDIR=\$PAGAN_ROOT" "dbus:1.16.2:https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz:SKIP:CC=gcc CXX=g++ cmake -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_LOCALSTATEDIR=/var -DDBUS_BUILD_TESTS=OFF -DDBUS_SYSTEMD_USER_SERVICE_DIR=/usr/lib/systemd/user && make -C build && make -C build DESTDIR=\$PAGAN_ROOT install" "systemd:259.1:https://github.com/systemd/systemd/archive/v259.1.tar.gz:SKIP:CC=gcc CXX=g++ meson setup build --prefix=/usr --sysconfdir=/etc --localstatedir=/var -Dmode=release -Dman=disabled -Ddefault-dnssec=no -Dwerror=false && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install" "grub:2.14:https://ftp.gnu.org/gnu/grub/grub-2.14.tar.xz:SKIP:touch grub-core/extra_deps.lst && ./configure --prefix=/usr --sysconfdir=/etc --disable-werror --with-platform=efi && make && make install DESTDIR=\$PAGAN_ROOT" # ======== PERL I PYTHON ======== "sqlite:3510200:https://sqlite.org/2026/sqlite-autoconf-3510200.tar.gz:SKIP:CC=gcc ./configure --prefix=/usr --disable-static --enable-fts5 && make && make install DESTDIR=\$PAGAN_ROOT" "perl:5.42.0:https://www.cpan.org/src/5.0/perl-5.42.0.tar.xz:SKIP:sh Configure -des -Dcc=gcc -Dprefix=/usr -Duseshrplib && make && make install DESTDIR=\$PAGAN_ROOT" "python:3.14.3:https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tar.xz:SKIP:sed -i 's|^@MODULE__CRYPT_TRUE@_crypt|#_crypt|' Modules/Setup.stdlib.in && ac_cv_lib_crypt_crypt_r=no ac_cv_func_crypt_r=no ./configure --prefix=/usr --enable-shared && make && make install DESTDIR=\$PAGAN_ROOT" "ninja:1.13.2:https://github.com/ninja-build/ninja/archive/v1.13.2/ninja-1.13.2.tar.gz:SKIP:python3 configure.py --bootstrap && install -m755 ninja \$PAGAN_ROOT/usr/bin/" "meson:1.10.1:https://github.com/mesonbuild/meson/releases/download/1.10.1/meson-1.10.1.tar.gz:SKIP:pip3 wheel -w dist --no-build-isolation --no-deps \$PWD && pip3 install --no-index --find-links dist --root=\$PAGAN_ROOT meson" "pkgconf:2.5.1:https://distfiles.ariadne.space/pkgconf/pkgconf-2.5.1.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "cmake:3.31.6:https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6.tar.gz:SKIP:cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF && cmake --build build $MAKEFLAGS && DESTDIR=\$PAGAN_ROOT cmake --install build" # ======== NARZĘDZIA DEWELOPERSKIE ======== "git:2.47.2:https://www.kernel.org/pub/software/scm/git/git-2.47.2.tar.xz:SKIP:./configure --prefix=/usr --with-openssl --with-curl --with-expat && make && make install DESTDIR=\$PAGAN_ROOT" "gnupg:2.4.7:https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.4.7.tar.bz2:SKIP:./configure --prefix=/usr --sysconfdir=/etc && make && make install DESTDIR=\$PAGAN_ROOT" "openssh:9.9p2:https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz:SKIP:./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords && make && make install DESTDIR=\$PAGAN_ROOT" "rsync:3.3.0:https://www.samba.org/ftp/rsync/src/rsync-3.3.0.tar.gz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "htop:3.3.0:https://github.com/htop-dev/htop/releases/download/3.3.0/htop-3.3.0.tar.xz:SKIP:./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" "nano:8.1:https://www.nano-editor.org/dist/v8/nano-8.1.tar.xz:SKIP:./configure --prefix=/usr --enable-utf8 && make && make install DESTDIR=\$PAGAN_ROOT" # ======== DODATKOWE NARZĘDZIA ======== "ca-certificates:2024:https://curl.se/ca/cacert-2024-07-02.pem:SKIP:mkdir -p \$PAGAN_ROOT/etc/ssl/certs && cp cacert-2024-07-02.pem \$PAGAN_ROOT/etc/ssl/certs/ca-certificates.crt" "icu:75.1:https://github.com/unicode-org/icu/releases/download/release-75-1/icu4c-75_1-src.tgz:SKIP:( export CFLAGS=\"-fno-stack-protector -std=gnu17 -O2 -Wno-error=override-init\"; export CXXFLAGS=\"-fno-stack-protector -O2\"; S=\$'\72'; cd source && ./configure --prefix=/usr && sed -i \"s#\\\$(LIBRARY_PATH_PREFIX)\\\$(LIBDIR)\${S}\\\$(top_builddir)/stubdata\${S}\\\$(top_builddir)/tools/ctestfw#\$PWD/lib\${S}\$PWD/stubdata\${S}\$PWD/tools/ctestfw#g; s#\\\$(top_builddir)/stubdata\${S}\\\$(top_builddir)/tools/ctestfw\${S}\\\$(LIBRARY_PATH_PREFIX)\\\$(LIBDIR)#\$PWD/stubdata\${S}\$PWD/tools/ctestfw\${S}\$PWD/lib#g\" icudefs.mk && make && ( make install DESTDIR=\$PAGAN_ROOT || true ) && ln -sf libicudata.so.75.1 \$PAGAN_ROOT/usr/lib/libicudata.so.75 && ln -sf libicudata.so.75.1 \$PAGAN_ROOT/usr/lib/libicudata.so )" "shared-mime-info:2.4:https://gitlab.freedesktop.org/xdg/shared-mime-info/-/archive/2.4/shared-mime-info-2.4.tar.bz2:SKIP:meson setup build --prefix=/usr && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install" ) ui_set_total "${#packages[@]}" for pkg_info in "${packages[@]}"; do name="${pkg_info%%:*}"; rest="${pkg_info#*:}" ver="${rest%%:*}"; rest="${rest#*:}" config="${rest##*:}"; rest_no_cfg="${rest%:*}" sha="${rest_no_cfg##*:}" url="${rest_no_cfg%:*}" build_lfs_pkg "$name" "$ver" "$url" "$sha" "$config" done _configure_basic_system ok "System końcowy zbudowany!" } _configure_basic_system() { # /etc/passwd cat > "$PAGAN_ROOT/etc/passwd" <<'EOF' root:x:0:0:root:/root:/bin/bash nobody:x:65534:65534:nobody:/:/bin/false EOF # /etc/group cat > "$PAGAN_ROOT/etc/group" <<'EOF' root:x:0: bin:x:1: sys:x:2: kmem:x:3: tty:x:4: tape:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: usb:x:14: cdrom:x:15: mail:x:34: nogroup:x:65534: EOF # /etc/fstab cat > "$PAGAN_ROOT/etc/fstab" <<'EOF' # /etc/fstab /dev/sda1 / ext4 defaults 0 1 proc /proc proc nosuid,noexec,nodev 0 0 sysfs /sys sysfs nosuid,noexec,nodev 0 0 devtmpfs /dev devtmpfs mode=0755,nosuid 0 0 tmpfs /tmp tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 shm /dev/shm tmpfs defaults 0 0 EOF # /etc/systemd/system.conf cat > "$PAGAN_ROOT/etc/systemd/system.conf" <<'EOF' [Manager] DefaultTimeoutStopSec=10s DefaultTimeoutStartSec=10s DefaultStartLimitIntervalSec=10s DefaultStartLimitBurst=5 EOF # /etc/systemd/logind.conf cat > "$PAGAN_ROOT/etc/systemd/logind.conf" <<'EOF' [Login] HandlePowerKey=poweroff HandleSuspendKey=suspend HandleHibernateKey=hibernate HandleLidSwitch=suspend HandleLidSwitchExternalPower=suspend HandleLidSwitchDocked=ignore PowerKeyIgnoreInhibited=no SuspendKeyIgnoreInhibited=no HibernateKeyIgnoreInhibited=no LidSwitchIgnoreInhibited=yes HoldoffTimeoutSec=30s IdleAction=ignore IdleActionSec=30min RuntimeDirectorySize=10% InhibitDelayMaxSec=5 UserTasksMax=infinity KillUserProcesses=no KillExcludeUsers=root RemoveIPC=yes EOF # /etc/hostname echo "pagan" > "$PAGAN_ROOT/etc/hostname" # /etc/locale.conf cat > "$PAGAN_ROOT/etc/locale.conf" <<'EOF' LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 EOF # /etc/vconsole.conf cat > "$PAGAN_ROOT/etc/vconsole.conf" <<'EOF' KEYMAP=pl FONT=Lat2-Terminus16 EOF # Symlink init systemd ln -sf /usr/lib/systemd/systemd "$PAGAN_ROOT/sbin/init" 2>/dev/null || true # Enable podstawowych usług (best-effort, może nie działać przy DESTDIR) chroot "$PAGAN_ROOT" systemctl enable systemd-logind 2>/dev/null || true chroot "$PAGAN_ROOT" systemctl enable systemd-timesyncd 2>/dev/null || true } # ========================= BUDOWA BLFS (PEŁNE BIBLIOTEKI) ========================= build_blfs() { step "BLFS: BIBLIOTEKI I ZALEŻNOŚCI" # Sprawdzamy WYŁĄCZNIE biblioteki targetu LFS w $PAGAN_ROOT/usr/lib # zanim zaczniemy BLFS, żeby nie kontynuować z uszkodzonym ABI. check_target_abi export PATH="$TOOLS_DIR/bin:/usr/bin/core_perl:/usr/bin/vendor_perl:$PATH" export PKG_CONFIG_DIR="" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/lib/x86_64-linux-gnu/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="$PAGAN_ROOT" export PKG_CONFIG_LIBDIR="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/lib/x86_64-linux-gnu/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" export CPPFLAGS="-I$PAGAN_ROOT/usr/include" export LDFLAGS="-L$PAGAN_ROOT/usr/lib -L$PAGAN_ROOT/lib64 -Wl,-rpath-link,$PAGAN_ROOT/usr/lib -Wl,-rpath-link,$PAGAN_ROOT/lib64" # Wykryj architekturę dla cross-file (działa na x86_64, aarch64, armv7l...) local ARCH ARCH=$(uname -m) case "$ARCH" in x86_64|amd64) ARCH=x86_64 ;; aarch64|arm64) ARCH=aarch64 ;; armv7l|armv7*) ARCH=arm ;; esac # Meson cross-file + stub .pc files cat > /tmp/pagan-cross.ini < "$PAGAN_ROOT/usr/include/sysprof-6/sysprof-capture.h" <<'SYSPROFH' #ifndef SYSPROF_CAPTURE_H #define SYSPROF_CAPTURE_H #include typedef struct _SysprofCaptureWriter SysprofCaptureWriter; typedef struct _SysprofCaptureReader SysprofCaptureReader; #endif SYSPROFH for stub in iconv sysprof-capture-4; do [[ -f "$PAGAN_ROOT/usr/lib/pkgconfig/$stub.pc" ]] || \ cat > "$PAGAN_ROOT/usr/lib/pkgconfig/$stub.pc" < /dev/null info " ⚙ Konfiguracja jądra (defconfig + tweaks Pagan)..." # Generuj pelna konfiguracje domyslna dla x86_64 (zawsze aktualna dla wersji kernela) make defconfig || error "Kernel defconfig failed" # === PaganOS overrides === ./scripts/config --set-str CONFIG_LOCALVERSION "-pagan" ./scripts/config --disable CONFIG_LOCALVERSION_AUTO ./scripts/config --disable CONFIG_WERROR # Preemption i scheduling (dla desktop/pulpitu) ./scripts/config --enable CONFIG_PREEMPT ./scripts/config --disable CONFIG_PREEMPT_VOLUNTARY ./scripts/config --set-val CONFIG_HZ 1000 ./scripts/config --enable CONFIG_SCHED_HRTICK # Moduly ./scripts/config --enable CONFIG_MODULES ./scripts/config --enable CONFIG_MODULE_UNLOAD ./scripts/config --enable CONFIG_MODULE_FORCE_UNLOAD ./scripts/config --enable CONFIG_MODVERSIONS ./scripts/config --disable CONFIG_MODULE_SIG # EFI (obowiazkowe dla nowoczesnego sprzetu) ./scripts/config --enable CONFIG_EFI ./scripts/config --enable CONFIG_EFI_STUB # KVM / wirtualizacja ./scripts/config --enable CONFIG_VIRTUALIZATION ./scripts/config --enable CONFIG_KVM ./scripts/config --enable CONFIG_KVM_INTEL ./scripts/config --enable CONFIG_KVM_AMD # WiFi (jako moduly) ./scripts/config --enable CONFIG_WIRELESS ./scripts/config --module CONFIG_CFG80211 ./scripts/config --module CONFIG_MAC80211 ./scripts/config --module CONFIG_IWLWIFI ./scripts/config --module CONFIG_IWLMVM ./scripts/config --module CONFIG_ATH9K ./scripts/config --module CONFIG_ATH10K ./scripts/config --module CONFIG_RTW88 ./scripts/config --module CONFIG_BRCMFMAC # Uzupelnij wszystkie brakujace opcje domyslnymi info " ⚙ olddefconfig (uzupelnianie configu)..." make olddefconfig || error "Kernel olddefconfig failed" info " 🔨 Kompilacja jądra..." make $MAKEFLAGS bzImage || error "Kernel build failed" make $MAKEFLAGS modules || error "Kernel modules build failed" info " 📥 Instalacja jądra..." make INSTALL_MOD_PATH="$PAGAN_ROOT" modules_install || error "Modules install failed" cp arch/x86/boot/bzImage "$PAGAN_ROOT/boot/vmlinuz-${KERNEL_VERSION}-pagan" cp System.map "$PAGAN_ROOT/boot/System.map-${KERNEL_VERSION}-pagan" cp .config "$PAGAN_ROOT/boot/config-${KERNEL_VERSION}-pagan" # Symlink ln -sf "vmlinuz-${KERNEL_VERSION}-pagan" "$PAGAN_ROOT/boot/vmlinuz-linux" ln -sf "System.map-${KERNEL_VERSION}-pagan" "$PAGAN_ROOT/boot/System.map" popd > /dev/null ok "Kernel ${KERNEL_VERSION} zbudowany!" } # ========================= STEROWNIKI NVIDIA (open-gpu-kernel-modules) ========================= # Buduje moduły NVIDIA z oficjalnego open-source repo NVIDIA # (https://github.com/NVIDIA/open-gpu-kernel-modules) przeciw zbudowanemu kernelowi. install_nvidia_drivers() { step "INSTALACJA STEROWNIKÓW NVIDIA (open-gpu-kernel-modules)" local nv_ver="${NVIDIA_VERSION:-main}" local nv_url="https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/heads/${nv_ver}.tar.gz" local nv_arch="$SRC_DIR/nvidia-open-gpu-kernel-modules-${nv_ver}.tar.gz" local nv_dir="$SRC_DIR/build-nvidia-open" # Kernel źródła muszą być zbudowane (po build_kernel) if [[ ! -f "$SRC_DIR/linux-${KERNEL_VERSION}/.config" ]]; then warn "Brak zbudowanego kernela – pomijam NVIDIA (zbuduj kernel najpierw)" return 0 fi download_pkg "$nv_url" "$nv_arch" "SKIP" || return 0 rm -rf "$nv_dir" mkdir -p "$nv_dir" tar -xf "$nv_arch" -C "$nv_dir" --strip-components=1 2>/dev/null || { warn "Rozpakowanie NVIDIA nieudane"; return 0; } pushd "$nv_dir" > /dev/null info " 🔨 Budowa modułów NVIDIA (to potrwa)..." if make -j$(nproc) modules \ SYSSRC="$SRC_DIR/linux-${KERNEL_VERSION}" \ SYSOUT="$SRC_DIR/linux-${KERNEL_VERSION}" 2>/tmp/nvidia-build.log; then info " 📥 Instalacja modułów NVIDIA do systemu..." make modules_install \ SYSSRC="$SRC_DIR/linux-${KERNEL_VERSION}" \ SYSOUT="$SRC_DIR/linux-${KERNEL_VERSION}" \ DESTDIR="$PAGAN_ROOT" 2>/tmp/nvidia-install.log || \ warn "NVIDIA modules_install nieudane" ok "NVIDIA open-gpu-kernel-modules zbudowane i zainstalowane" else warn "NVIDIA modules build nieudane – pomijam (log: /tmp/nvidia-build.log)" fi popd > /dev/null } # ========================= INSTALACJA XFCE ========================= install_xfce() { step "INSTALACJA XFCE" export PATH="$TOOLS_DIR/bin:$PATH" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" # Target libs first for rpath-link: host pangoft2 is ABI-newer than target # pango, causing symbol mismatch when host pangoft2 resolves against target pango. export LDFLAGS="-L$PAGAN_ROOT/usr/lib -L/usr/lib -Wl,-rpath-link,$PAGAN_ROOT/usr/lib -Wl,-rpath-link,/usr/lib" # Xorg build_lfs_pkg "xorg-server" "21.1.13" \ "https://www.x.org/releases/individual/xserver/xorg-server-21.1.13.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-glamor --enable-dri3 --enable-xcsecurity --disable-systemd-logind" # Xorg drivers build_lfs_pkg "xf86-input-libinput" "1.4.0" \ "https://www.x.org/releases/individual/driver/xf86-input-libinput-1.4.0.tar.xz" \ "SKIP" \ "./configure --prefix=/usr" build_lfs_pkg "xf86-video-fbdev" "0.5.0" \ "https://gitlab.freedesktop.org/xorg/driver/xf86-video-fbdev/-/archive/xf86-video-fbdev-0.5.0/xf86-video-fbdev-0.5.0.tar.gz" \ "SKIP" \ "./autogen.sh && ./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" # Xfce dependencies (not in BLFS) # libwnck: test executables fail to link when host pangoft2 is newer than # target pango. Patch meson.build to skip test_progs (no --Dtests option). build_lfs_pkg "libwnck" "43.0" \ "https://download.gnome.org/sources/libwnck/43/libwnck-43.0.tar.xz" \ "SKIP" \ "sed -i 's/progs + test_progs/[]/' libwnck/meson.build && meson setup build --prefix=/usr -Dgtk_doc=false -Dintrospection=disabled && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install" build_lfs_pkg "startup-notification" "0.12" \ "https://www.freedesktop.org/software/startup-notification/releases/startup-notification-0.12.tar.gz" \ "SKIP" \ "./configure --prefix=/usr && make && make install DESTDIR=\$PAGAN_ROOT" # Xfce core local xfce_packages=( "libxfce4util:4.18.2:https://archive.xfce.org/src/xfce/libxfce4util/4.18/libxfce4util-4.18.2.tar.bz2" "xfconf:4.18.3:https://archive.xfce.org/src/xfce/xfconf/4.18/xfconf-4.18.3.tar.bz2" "libxfce4ui:4.18.6:https://archive.xfce.org/src/xfce/libxfce4ui/4.18/libxfce4ui-4.18.6.tar.bz2" "exo:4.18.0:https://archive.xfce.org/src/xfce/exo/4.18/exo-4.18.0.tar.bz2" "garcon:4.18.2:https://archive.xfce.org/src/xfce/garcon/4.18/garcon-4.18.2.tar.bz2" "xfce4-panel:4.18.6:https://archive.xfce.org/src/xfce/xfce4-panel/4.18/xfce4-panel-4.18.6.tar.bz2" "thunar:4.18.10:https://archive.xfce.org/src/xfce/thunar/4.18/thunar-4.18.10.tar.bz2" "xfce4-settings:4.18.6:https://archive.xfce.org/src/xfce/xfce4-settings/4.18/xfce4-settings-4.18.6.tar.bz2" "xfce4-session:4.18.4:https://archive.xfce.org/src/xfce/xfce4-session/4.18/xfce4-session-4.18.4.tar.bz2" "xfdesktop:4.18.1:https://archive.xfce.org/src/xfce/xfdesktop/4.18/xfdesktop-4.18.1.tar.bz2" "xfwm4:4.18.0:https://archive.xfce.org/src/xfce/xfwm4/4.18/xfwm4-4.18.0.tar.bz2" "xfce4-appfinder:4.18.1:https://archive.xfce.org/src/xfce/xfce4-appfinder/4.18/xfce4-appfinder-4.18.1.tar.bz2" "xfce4-terminal:1.1.3:https://archive.xfce.org/src/apps/xfce4-terminal/1.1/xfce4-terminal-1.1.3.tar.bz2" "tumbler:4.18.2:https://archive.xfce.org/src/xfce/tumbler/4.18/tumbler-4.18.2.tar.bz2" "mousepad:0.6.2:https://archive.xfce.org/src/apps/mousepad/0.6/mousepad-0.6.2.tar.bz2" "ristretto:0.13.2:https://archive.xfce.org/src/apps/ristretto/0.13/ristretto-0.13.2.tar.bz2" ) for pkg_info in "${xfce_packages[@]}"; do IFS=':' read -r name ver url <<< "$pkg_info" build_lfs_pkg "$name" "$ver" "$url" "SKIP" \ "./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-introspection && make \$MAKEFLAGS && make install DESTDIR=\$PAGAN_ROOT" done # xfce4-power-manager (potrzebuje upower+libnotify — build best-effort bez nich) build_lfs_pkg "xfce4-power-manager" "4.18.4" \ "https://archive.xfce.org/src/xfce/xfce4-power-manager/4.18/xfce4-power-manager-4.18.4.tar.bz2" \ "SKIP" \ "./configure --prefix=/usr --sysconfdir=/etc --disable-introspection --enable-polkit --disable-upower --disable-notifications 2>/dev/null && make \$MAKEFLAGS || true; make install DESTDIR=\$PAGAN_ROOT 2>/dev/null || true" # LightDM build_lfs_pkg "lightdm" "1.32.0" \ "https://github.com/canonical/lightdm/releases/download/1.32.0/lightdm-1.32.0.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-gtk-doc && make \$MAKEFLAGS && make install DESTDIR=\$PAGAN_ROOT" build_lfs_pkg "lightdm-gtk-greeter" "2.0.8" \ "https://github.com/Xfce/lightdm-gtk-greeter/archive/refs/tags/lightdm-gtk-greeter-2.0.8.tar.gz" \ "SKIP" \ "./configure --prefix=/usr --sysconfdir=/etc && make \$MAKEFLAGS && make install DESTDIR=\$PAGAN_ROOT" # Firefox build_lfs_pkg "firefox" "128.0" \ "https://ftp.mozilla.org/pub/firefox/releases/128.0/linux-$(uname -m)/en-US/firefox-128.0.tar.xz" \ "SKIP" \ "tar -xf firefox-*.tar.xz -C $PAGAN_ROOT/usr/lib && ln -sf /usr/lib/firefox/firefox $PAGAN_ROOT/usr/bin/" _configure_xfce ok "Xfce zainstalowane!" } _configure_xfce() { # LightDM mkdir -p "$PAGAN_ROOT/etc/lightdm" cat > "$PAGAN_ROOT/etc/lightdm/lightdm.conf" <<'EOF' [LightDM] greeter-session=lightdm-gtk-greeter user-session=xfce minimum-vt=7 xserver-command=X -background none -verbose [Seat:*] greeter-session=lightdm-gtk-greeter user-session=xfce EOF # .xinitrc mkdir -p "$PAGAN_ROOT/etc/skel" cat > "$PAGAN_ROOT/etc/skel/.xinitrc" <<'EOF' #!/bin/sh exec startxfce4 EOF chmod +x "$PAGAN_ROOT/etc/skel/.xinitrc" # Użytkownik chroot "$PAGAN_ROOT" useradd -m -G wheel,audio,video,cdrom,plugdev -s /bin/bash pagan 2>/dev/null || true echo "pagan:changeme" | chroot "$PAGAN_ROOT" chpasswd 2>/dev/null || true; chroot "$PAGAN_ROOT" passwd -e pagan 2>/dev/null || true } # ========================= INSTALACJA DEEPIN ========================= install_deepin() { step "INSTALACJA DEEPIN" export PATH="$TOOLS_DIR/bin:$PATH" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" # Xorg build_lfs_pkg "xorg-server" "21.1.13" \ "https://www.x.org/releases/individual/xserver/xorg-server-21.1.13.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-glamor --enable-dri3 --enable-xcsecurity" # Qt6 build_lfs_pkg "qtbase" "6.7.2" \ "https://download.qt.io/official_releases/qt/6.7/6.7.2/submodules/qtbase-everywhere-src-6.7.2.tar.xz" \ "SKIP" \ "./configure -prefix /usr -opensource -confirm-license -release -shared -nomake tests -nomake examples" # Deepin local deepin_packages=( "dde-qt-dbus-factory:https://github.com/linuxdeepin/dde-qt-dbus-factory/releases/latest/download/dde-qt-dbus-factory.tar.xz" "dtkcore:https://github.com/linuxdeepin/dtkcore/releases/latest/download/dtkcore.tar.xz" "dtkgui:https://github.com/linuxdeepin/dtkgui/releases/latest/download/dtkgui.tar.xz" "dtkwidget:https://github.com/linuxdeepin/dtkwidget/releases/latest/download/dtkwidget.tar.xz" "dde-dock:https://github.com/linuxdeepin/dde-dock/releases/latest/download/dde-dock.tar.xz" "dde-launcher:https://github.com/linuxdeepin/dde-launcher/releases/latest/download/dde-launcher.tar.xz" "dde-control-center:https://github.com/linuxdeepin/dde-control-center/releases/latest/download/dde-control-center.tar.xz" "dde-session-shell:https://github.com/linuxdeepin/dde-session-shell/releases/latest/download/dde-session-shell.tar.xz" "deepin-terminal:https://github.com/linuxdeepin/deepin-terminal/releases/latest/download/deepin-terminal.tar.xz" "deepin-file-manager:https://github.com/linuxdeepin/deepin-file-manager/releases/latest/download/deepin-file-manager.tar.xz" ) for pkg_info in "${deepin_packages[@]}"; do IFS=':' read -r name url <<< "$pkg_info" build_lfs_pkg "$name" "latest" "$url" "SKIP" \ "cmake -B build -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build && cmake --install build" done _configure_deepin ok "Deepin zainstalowane!" } _configure_deepin() { mkdir -p "$PAGAN_ROOT/etc/lightdm" cat > "$PAGAN_ROOT/etc/lightdm/lightdm.conf" <<'EOF' [LightDM] greeter-session=lightdm-deepin-greeter user-session=deepin minimum-vt=7 [Seat:*] greeter-session=lightdm-deepin-greeter user-session=deepin EOF chroot "$PAGAN_ROOT" useradd -m -G wheel,audio,video,cdrom,plugdev -s /bin/bash pagan 2>/dev/null || true echo "pagan:changeme" | chroot "$PAGAN_ROOT" chpasswd 2>/dev/null || true; chroot "$PAGAN_ROOT" passwd -e pagan 2>/dev/null || true } # ========================= INSTALACJA BUDGIE ========================= install_budgie() { step "INSTALACJA BUDGIE DESKTOP" export PATH="$TOOLS_DIR/bin:$PATH" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" # Xorg base build_lfs_pkg "xorg-server" "21.1.13" \ "https://www.x.org/releases/individual/xserver/xorg-server-21.1.13.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-glamor --enable-dri3 --enable-xcsecurity" build_lfs_pkg "xf86-input-libinput" "1.4.0" \ "https://www.x.org/releases/individual/driver/xf86-input-libinput-1.4.0.tar.xz" \ "SKIP" "./configure --prefix=/usr" # GTK+3 build_lfs_pkg "gtk3" "3.24.43" \ "https://download.gnome.org/sources/gtk+/3.24/gtk+-3.24.43.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-x11-backend --enable-wayland-backend" # GNOME stack dependencies for Budgie build_lfs_pkg "gnome-menus" "3.36.0" \ "https://download.gnome.org/sources/gnome-menus/3.36/gnome-menus-3.36.0.tar.xz" \ "SKIP" "./configure --prefix=/usr" build_lfs_pkg "gnome-settings-daemon" "47.2" \ "https://download.gnome.org/sources/gnome-settings-daemon/47/gnome-settings-daemon-47.2.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dsystemd=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-control-center" "47.3" \ "https://download.gnome.org/sources/gnome-control-center/47/gnome-control-center-47.3.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-session" "47.1" \ "https://download.gnome.org/sources/gnome-session/47/gnome-session-47.1.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dsystemd=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "mutter" "47.5" \ "https://download.gnome.org/sources/mutter/47/mutter-47.5.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dtests=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" # Budgie desktop build_lfs_pkg "budgie-desktop" "10.9.2" \ "https://github.com/BuddiesOfBudgie/budgie-desktop/releases/download/v10.9.2/budgie-desktop-10.9.2.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dwith-polkit=disabled && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" # LightDM + slick-greeter build_lfs_pkg "lightdm" "1.32.0" \ "https://github.com/canonical/lightdm/releases/download/1.32.0/lightdm-1.32.0.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var" build_lfs_pkg "slick-greeter" "2.0.8" \ "https://github.com/linuxmint/slick-greeter/archive/refs/tags/2.0.8.tar.gz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" # Aplikacje _install_firefox_binary _install_terminal_apps _configure_budgie ok "Budgie zainstalowane!" } _configure_budgie() { mkdir -p "$PAGAN_ROOT/etc/lightdm" cat > "$PAGAN_ROOT/etc/lightdm/lightdm.conf" <<'EOF' [LightDM] greeter-session=slick-greeter user-session=budgie-desktop minimum-vt=7 [Seat:*] greeter-session=slick-greeter user-session=budgie-desktop EOF mkdir -p "$PAGAN_ROOT/etc/skel" cat > "$PAGAN_ROOT/etc/skel/.xinitrc" <<'EOF' #!/bin/sh exec budgie-desktop EOF chmod +x "$PAGAN_ROOT/etc/skel/.xinitrc" chroot "$PAGAN_ROOT" useradd -m -G wheel,audio,video,cdrom,plugdev -s /bin/bash pagan 2>/dev/null || true echo "pagan:changeme" | chroot "$PAGAN_ROOT" chpasswd 2>/dev/null || true; chroot "$PAGAN_ROOT" passwd -e pagan 2>/dev/null || true } # ========================= INSTALACJA GNOME ========================= install_gnome() { step "INSTALACJA GNOME DESKTOP" export PATH="$TOOLS_DIR/bin:$PATH" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" # Xorg base build_lfs_pkg "xorg-server" "21.1.13" \ "https://www.x.org/releases/individual/xserver/xorg-server-21.1.13.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-glamor --enable-dri3 --enable-xcsecurity" build_lfs_pkg "xf86-input-libinput" "1.4.0" \ "https://www.x.org/releases/individual/driver/xf86-input-libinput-1.4.0.tar.xz" \ "SKIP" "./configure --prefix=/usr" # GTK stack build_lfs_pkg "gtk3" "3.24.43" \ "https://download.gnome.org/sources/gtk+/3.24/gtk+-3.24.43.tar.xz" \ "SKIP" \ "./configure --prefix=/usr --enable-x11-backend --enable-wayland-backend" build_lfs_pkg "gtk4" "4.16.7" \ "https://download.gnome.org/sources/gtk/4.16/gtk-4.16.7.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dx11-backend=true -Dwayland-backend=true && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" # GNOME core build_lfs_pkg "gnome-menus" "3.36.0" \ "https://download.gnome.org/sources/gnome-menus/3.36/gnome-menus-3.36.0.tar.xz" \ "SKIP" "./configure --prefix=/usr" build_lfs_pkg "gnome-settings-daemon" "47.2" \ "https://download.gnome.org/sources/gnome-settings-daemon/47/gnome-settings-daemon-47.2.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-control-center" "47.3" \ "https://download.gnome.org/sources/gnome-control-center/47/gnome-control-center-47.3.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-session" "47.1" \ "https://download.gnome.org/sources/gnome-session/47/gnome-session-47.1.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dsystemd=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "mutter" "47.5" \ "https://download.gnome.org/sources/mutter/47/mutter-47.5.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dtests=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-shell" "47.4" \ "https://download.gnome.org/sources/gnome-shell/47/gnome-shell-47.4.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dtests=false && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "nautilus" "47.2" \ "https://download.gnome.org/sources/nautilus/47/nautilus-47.2.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-terminal" "3.54.2" \ "https://download.gnome.org/sources/gnome-terminal/3.54/gnome-terminal-3.54.2.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "gnome-tweaks" "46.1" \ "https://download.gnome.org/sources/gnome-tweaks/46/gnome-tweaks-46.1.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "adwaita-icon-theme" "47.0" \ "https://download.gnome.org/sources/adwaita-icon-theme/47/adwaita-icon-theme-47.0.tar.xz" \ "SKIP" "./configure --prefix=/usr" # GDM build_lfs_pkg "gdm" "47.0" \ "https://download.gnome.org/sources/gdm/47/gdm-47.0.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr -Dinitial-vt=7 && ninja -C build && DESTDIR=$PAGAN_ROOT ninja -C build install" _install_firefox_binary _install_terminal_apps _configure_gnome ok "GNOME zainstalowane!" } _configure_gnome() { mkdir -p "$PAGAN_ROOT/etc/gdm" cat > "$PAGAN_ROOT/etc/gdm/custom.conf" <<'EOF' [daemon] AutomaticLoginEnable=false TimedLoginEnable=false WaylandEnable=true [security] DisallowTCP=true [xdmcp] Enable=false EOF mkdir -p "$PAGAN_ROOT/etc/skel" cat > "$PAGAN_ROOT/etc/skel/.xinitrc" <<'EOF' #!/bin/sh exec gnome-session EOF chmod +x "$PAGAN_ROOT/etc/skel/.xinitrc" chroot "$PAGAN_ROOT" useradd -m -G wheel,audio,video,cdrom,plugdev -s /bin/bash pagan 2>/dev/null || true echo "pagan:changeme" | chroot "$PAGAN_ROOT" chpasswd 2>/dev/null || true; chroot "$PAGAN_ROOT" passwd -e pagan 2>/dev/null || true } # ========================= WSPÓLNE APLIKACJE ========================= _install_firefox_binary() { local ff_ver="128.0.3" local ff_url="https://ftp.mozilla.org/pub/firefox/releases/${ff_ver}/linux-$(uname -m)/en-US/firefox-${ff_ver}.tar.xz" local ff_arch="$SRC_DIR/firefox-${ff_ver}.tar.xz" info " Instalowanie Firefox ${ff_ver}..." wget -q --timeout=60 -O "$ff_arch" "$ff_url" 2>/dev/null || return 0 mkdir -p "$PAGAN_ROOT/usr/lib/firefox" tar -xf "$ff_arch" -C "$PAGAN_ROOT/usr/lib/firefox" --strip-components=1 2>/dev/null ln -sf /usr/lib/firefox/firefox "$PAGAN_ROOT/usr/bin/firefox" 2>/dev/null || true } _install_terminal_apps() { build_lfs_pkg "xfce4-terminal" "1.1.3" \ "https://archive.xfce.org/src/apps/xfce4-terminal/1.1/xfce4-terminal-1.1.3.tar.bz2" \ "SKIP" "./configure --prefix=/usr" 2>/dev/null || true build_lfs_pkg "nano" "8.1" \ "https://www.nano-editor.org/dist/v8/nano-8.1.tar.xz" \ "SKIP" "./configure --prefix=/usr --enable-utf8" 2>/dev/null || true } # ========================= OSINFO-DB (PAGAN ROLLING) ========================= install_osinfo() { step "INSTALACJA OSINFO-DB (Pagan Linux OS database)" build_lfs_pkg "osinfo-db-tools" "1.12.0" \ "https://releases.pagure.org/libosinfo/osinfo-db-tools-1.12.0.tar.xz" \ "SKIP" \ "meson setup build --prefix=/usr && DESTDIR=$PAGAN_ROOT ninja -C build install" build_lfs_pkg "osinfo-db" "20250606" \ "https://releases.pagure.org/libosinfo/osinfo-db-20250606.tar.xz" \ "SKIP" \ "osinfo-db-import --root $PAGAN_ROOT --system $SRC_DIR/osinfo-db-20250606.tar.xz 2>/dev/null || true" # Pagan Linux Rolling XML mkdir -p "$PAGAN_ROOT/usr/share/osinfo/os/pagan" cat > "$PAGAN_ROOT/usr/share/osinfo/os/pagan/pagan-rolling.xml" <<'OSINFO' pagan-rolling Pagan Linux Rolling Pagan Linux Community linux paganlinux.eu rolling 200000000 1073741824 8589934592 1000000000 2147483648 21474836480 PaganLinux boot/vmlinuz-linux boot/initramfs.img OSINFO ok "osinfo-db + Pagan Rolling XML ✓" } # ========================= CALAMARES INSTALLER ========================= install_calamares() { step "INSTALACJA CALAMARES (Instalator systemu)" export PATH="$TOOLS_DIR/bin:$PATH" export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig" # KPMcore – biblioteka partycjonowania build_lfs_pkg "kpmcore" "24.12.3" \ "https://download.kde.org/stable/release-service/24.12.3/src/kpmcore-24.12.3.tar.xz" \ "SKIP" \ "cmake -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -G Ninja && DESTDIR=\$PAGAN_ROOT ninja -C build install" # Calamares build_lfs_pkg "calamares" "3.3.14" \ "https://github.com/calamares/calamares/releases/download/v3.3.14/calamares-3.3.14.tar.gz" \ "SKIP" \ "cmake -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DWITH_PYTHONQT=OFF -DWITH_KF5KIO=OFF -G Ninja && DESTDIR=\$PAGAN_ROOT ninja -C build install" # Konfiguracja mkdir -p "$PAGAN_ROOT/etc/calamares" mkdir -p "$PAGAN_ROOT/usr/share/calamares/branding/paganlinux" # settings.conf cat > "$PAGAN_ROOT/etc/calamares/settings.conf" <<'CALEOF' --- sequence: - show: [welcome, locale, keyboard, partition, users, summary] - exec: [partition, mount, unpackfs, machineid, fstab, locale, keyboard, localecfg, users, displaymanager, networkcfg, hwclock, services, grubcfg, bootloader, packages, umount] - show: [finished] branding: paganlinux partition: defaultFileSystemType: "ext4" availableFileSystemTypes: ["ext4","xfs","btrfs","f2fs"] enableLuks: true requiredPartitionTableType: "gpt" requiredStorage: 8.0 users: defaultGroups: [lp, video, audio, optical, storage, scanner, power, wheel] setRootPassword: true networkcfg: writeNetworkManager: true grubcfg: preferGrubEfi: true bootloader: installEFIFallback: true services: enabled: [NetworkManager, lightdm, pipewire] disabled: [sshd] welcome: showDonateUrl: false finished: restartNowEnabled: true restartNowCommand: "systemctl reboot" CALEOF # branding.desc cat > "$PAGAN_ROOT/usr/share/calamares/branding/paganlinux/branding.desc" <<'CALEOF' --- componentName: paganlinux version: 1.0 welcomeStyleCalamares: true strings: productName: "Pagan Linux" shortProductName: "Pagan" version: "1.0 Loki" shortVersion: "1.0" versionedName: "Pagan Linux 1.0 Loki" bootloaderEntryName: "Pagan Linux" productUrl: "https://paganlinux.eu" supportUrl: "https://paganlinux.eu/support" images: productLogo: "logo.png" productIcon: "icon.png" productWelcome: "welcome.png" slideshow: "show.qml" slideshowAPI: 2 style: sidebarBackground: "#1a1a2e" sidebarText: "#e0e0e0" sidebarTextSelect: "#58a6ff" CALEOF ok "Calamares Installer + Pagan branding ✓" } # ========================= KONFIGURACJA GRUB ========================= install_pag() { step "INSTALACJA PAG + PAGBUILD (MENEDŻER PAKIETÓW + BUDOWANIE)" # Python dependencies for pag/pagbuild chroot "$PAGAN_ROOT" pip3 install flit-core packaging markupsafe jinja2 setuptools wheel pyyaml --break-system-packages 2>/dev/null || true # ---- pag - natywny menedżer pakietów (pełna wersja) ---- cp "$SCRIPT_DIR/pag" "$PAGAN_ROOT/usr/bin/pag" chmod +x "$PAGAN_ROOT/usr/bin/pag" # ---- pagbuild - builder receptur w chroot ---- cat > "$PAGAN_ROOT/usr/bin/pagbuild" <<'PAGBUILDEOF' #!/bin/bash # PAGBUILD – buduje pakiety z PAGBUILD.yaml w izolacji chroot set -euo pipefail RECIPE="${1:-PAGBUILD.yaml}" OUT="${OUT_DIR:-/var/cache/pagbuild/output}" SRC="${SRC_CACHE:-/var/cache/pagbuild/sources}" WORK="/tmp/pagbuild-$$" ROOTFS="${ROOTFS:-/}" [[ -f "$RECIPE" ]] || { echo "❌ $RECIPE nie istnieje."; exit 1; } eval $(python3 -c " import yaml with open('$RECIPE') as f: d=yaml.safe_load(f) print(f'NAME=\"{d[\"pkgname\"]}\" VER=\"{d[\"pkgver\"]}\" URL=\"{d[\"source\"][0]}\"') ") ARCH=$(basename "$URL") FULL="${NAME}-${VER}" echo "🚀 $FULL" mkdir -p "$SRC" "$OUT" "$WORK/src" "$WORK/dest" [[ -f "$SRC/$ARCH" ]] || curl -sSL "$URL" -o "$SRC/$ARCH" tar -xf "$SRC/$ARCH" -C "$WORK/src" --strip-components=1 2>/dev/null || tar -xf "$SRC/$ARCH" -C "$WORK/src" # Generuj skrypt build+package z receptury python3 -c " import yaml with open('$RECIPE') as f: d=yaml.safe_load(f) script = f'''#!/bin/bash set -eo pipefail export PKGDIR=/tmp/dest cd /tmp/src {d['build']} {d['package']} ''' open('/tmp/pagbuild-script.sh','w').write(script) " chmod +x /tmp/pagbuild-script.sh cp -r "$WORK/src/"* "$ROOTFS/tmp/src/" 2>/dev/null || true cp /tmp/pagbuild-script.sh "$ROOTFS/tmp/build.sh" mount -t proc proc "$ROOTFS/proc" 2>/dev/null || true mount -t sysfs sys "$ROOTFS/sys" 2>/dev/null || true mount --bind /dev "$ROOTFS/dev" 2>/dev/null || true chroot "$ROOTFS" /usr/bin/env -i PATH=/usr/bin:/usr/sbin:/bin:/sbin HOME=/root /tmp/build.sh umount -l "$ROOTFS/dev" "$ROOTFS/sys" "$ROOTFS/proc" 2>/dev/null || true cp -r "$ROOTFS/tmp/dest/"* "$WORK/dest/" 2>/dev/null || true echo "{\"name\":\"$NAME\",\"version\":\"$VER\"}" > "$WORK/dest/metadata.json" PKG="$OUT/${FULL}-1.pkg.tar.xz" tar -cJf "$PKG" -C "$WORK/dest" . echo "✅ $PKG" rm -rf "$WORK" /tmp/pagbuild-script.sh PAGBUILDEOF chmod +x "$PAGAN_ROOT/usr/bin/pagbuild" mkdir -p "$PAGAN_ROOT/var/cache/pagbuild/"{sources,output} ok "PAG + PAGBUILD zainstalowane!" } # ========================= MENEDŻER STEROWNIKÓW ========================= install_driver_manager() { step "INSTALACJA MENEDŻERA STEROWNIKÓW" cat > "$PAGAN_ROOT/usr/bin/pagan-drivers" <<'EOF' #!/bin/bash # pagan-drivers - Menedżer sterowników Pagan Linux GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' detect() { echo "🔍 Wykrywanie sprzętu..." echo -e "\n${YELLOW}GPU:${NC}" lspci | grep -E "VGA|3D|Display" || echo " Brak" echo -e "\n${YELLOW}Sieć:${NC}" lspci | grep -E "Ethernet|Network|Wi-Fi" || echo " Brak" echo -e "\n${YELLOW}Audio:${NC}" lspci | grep -E "Audio|Sound" || echo " Brak" } install_nvidia() { echo "⬇ Pobieranie NVIDIA..." wget -O /tmp/nvidia.run "https://us.download.nvidia.com/XFree86/Linux-x86_64/550.120/NVIDIA-Linux-x86_64-550.120.run" chmod +x /tmp/nvidia.run && /tmp/nvidia.run --silent echo "✅ NVIDIA zainstalowane" } install_amd() { echo "⬇ AMDGPU..." echo " Zainstaluj: xf86-video-amdgpu" echo "✅ AMD gotowe" } install_intel() { echo "⬇ Intel..." echo " Zainstaluj: xf86-video-intel" echo "✅ Intel gotowe" } case "${1:-help}" in detect) detect ;; nvidia) install_nvidia ;; amd) install_amd ;; intel) install_intel ;; auto) detect && echo -e "\n${GREEN}Automatyczne dopasowanie...${NC}" ;; *) echo "Użycie: pagan-drivers {detect|nvidia|amd|intel|auto}" ;; esac EOF chmod +x "$PAGAN_ROOT/usr/bin/pagan-drivers" ok "Menedżer sterowników zainstalowany!" } # ========================= KONFIGURACJA GRUB ========================= configure_grub() { step "KONFIGURACJA GRUB" mkdir -p "$PAGAN_ROOT/boot/grub" cat > "$PAGAN_ROOT/boot/grub/grub.cfg" <<'EOF' # GRUB dla Pagan Linux set default=0 set timeout=5 set root=(hd0,gpt1) menuentry "Pagan Linux" { linux /boot/vmlinuz-linux root=/dev/sda1 rw quiet splash initrd /boot/initramfs.img } menuentry "Pagan Linux (single)" { linux /boot/vmlinuz-linux root=/dev/sda1 rw single initrd /boot/initramfs.img } menuentry "Pagan Linux (fallback)" { linux /boot/vmlinuz-linux root=/dev/sda1 rw noacpi initrd /boot/initramfs.img } EOF ok "GRUB skonfigurowany" } # ========================= BUDOWA INITRAMFS ========================= build_initramfs() { step "BUDOWA INITRAMFS" local initramfs_dir="$PAGAN_ROOT/tmp/initramfs" rm -rf "$initramfs_dir" mkdir -p "$initramfs_dir"/{bin,dev,proc,sys,run,new_root,etc,lib,lib64,usr,sbin} # Skrypt init cat > "$initramfs_dir/init" <<'EOF' #!/bin/sh mount -t proc proc /proc mount -t sysfs sys /sys mount -t devtmpfs dev /dev if [ -f /etc/pagan-release ]; then cat /etc/pagan-release fi ACTIVE_LINK="/.deployments/active" DEPLOYMENT="" if [ -L "$ACTIVE_LINK" ]; then DEPLOYMENT=$(readlink "$ACTIVE_LINK") elif [ -d "/.deployments" ]; then DEPLOYMENT=$(ls -1 /.deployments/ | grep -v active | sort -r | head -1) [ -n "$DEPLOYMENT" ] && DEPLOYMENT="/.deployments/$DEPLOYMENT" fi if [ -n "$DEPLOYMENT" ] && [ -d "$DEPLOYMENT" ]; then echo "Booting from deployment: $DEPLOYMENT" mount --move /proc "$DEPLOYMENT/proc" 2>/dev/null mount --move /sys "$DEPLOYMENT/sys" 2>/dev/null mount --move /dev "$DEPLOYMENT/dev" 2>/dev/null exec switch_root "$DEPLOYMENT" /sbin/init else echo "No deployment found, booting from /" exec switch_root /new_root /sbin/init fi EOF chmod +x "$initramfs_dir/init" # Busybox lub bash local busybox="" for p in "$PAGAN_ROOT/usr/bin/busybox" "$PAGAN_ROOT/bin/busybox" "/usr/bin/busybox"; do [ -f "$p" ] && busybox="$p" && break done if [ -n "$busybox" ]; then cp "$busybox" "$initramfs_dir/bin/busybox" chmod 755 "$initramfs_dir/bin/busybox" for cmd in sh mount umount ls cat echo sleep readlink mkdir switch_root cp rm ln; do ln -sf busybox "$initramfs_dir/bin/$cmd" done else # Kopiuj bash i ldd for tool in bash mount umount ls cat echo sleep readlink mkdir switch_root cp rm ln; do src=$(which "$tool" 2>/dev/null) [ -n "$src" ] && cp "$src" "$initramfs_dir/bin/" done fi # Kopiuj /etc/pagan-release [ -f "$PAGAN_ROOT/etc/pagan-release" ] && cp "$PAGAN_ROOT/etc/pagan-release" "$initramfs_dir/etc/" # Pakowanie pushd "$initramfs_dir" > /dev/null find . | cpio -oH newc | gzip > "$PAGAN_ROOT/boot/initramfs.img" popd > /dev/null rm -rf "$initramfs_dir" ok "Initramfs zbudowany!" } # ========================= TWORZENIE IMG ========================= create_image() { step "TWORZENIE OBRAZU IMG" mkdir -p "$OUTPUT_DIR" local img_file="$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.img" info "Tworzenie IMG (${IMAGE_SIZE}MB)..." dd if=/dev/zero of="$img_file" bs=1M count="$IMAGE_SIZE" status=progress 2>/dev/null parted -s "$img_file" mklabel gpt parted -s "$img_file" mkpart primary ext4 2048s 100% parted -s "$img_file" set 1 boot on local loopdev=$(losetup -f) losetup -P "$loopdev" "$img_file" mkfs.ext4 -F -L "PAGAN_ROOT" "${loopdev}p1" >/dev/null 2>&1 local mount_point="/mnt/pagan-img" mkdir -p "$mount_point" mount "${loopdev}p1" "$mount_point" info "Kopiowanie systemu..." rsync -aAX --delete \ --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","*.img","*.iso"} \ "$PAGAN_ROOT/" "$mount_point/" 2>/dev/null # Instalacja GRUB mount --bind /dev "$mount_point/dev" mount --bind /proc "$mount_point/proc" mount --bind /sys "$mount_point/sys" chroot "$mount_point" grub-install --target=i386-pc "$loopdev" 2>/dev/null || true umount "$mount_point/dev" "$mount_point/proc" "$mount_point/sys" 2>/dev/null umount "$mount_point" 2>/dev/null losetup -d "$loopdev" 2>/dev/null ok "IMG: $img_file ($(du -h "$img_file" 2>/dev/null | cut -f1))" } # ========================= TWORZENIE ISO ========================= create_iso() { step "TWORZENIE OBRAZU ISO" mkdir -p "$OUTPUT_DIR" local iso_file="$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.iso" local iso_root="/tmp/pagan-iso-$$" rm -rf "$iso_root" mkdir -p "$iso_root"/{boot,isolinux,live} # Kopiuj binaria ISOLINUX z hosta (wymagane do bootowania BIOS) for isolinux_bin in \ /usr/lib/syslinux/bios/isolinux.bin \ /usr/share/syslinux/isolinux.bin \ /usr/lib/ISOLINUX/isolinux.bin; do [[ -f "$isolinux_bin" ]] && { cp "$isolinux_bin" "$iso_root/isolinux/"; break; } done for ldlinux in \ /usr/lib/syslinux/bios/ldlinux.c32 \ /usr/share/syslinux/ldlinux.c32; do [[ -f "$ldlinux" ]] && { cp "$ldlinux" "$iso_root/isolinux/"; break; } done if [[ ! -f "$iso_root/isolinux/isolinux.bin" ]]; then warn "isolinux.bin nie znaleziony – ISO bez obsługi BIOS (tylko EFI)" fi cp "$PAGAN_ROOT/boot/vmlinuz-linux" "$iso_root/boot/" 2>/dev/null || true cp "$PAGAN_ROOT/boot/initramfs.img" "$iso_root/boot/" 2>/dev/null || true info "Tworzenie squashfs..." mksquashfs "$PAGAN_ROOT" "$iso_root/live/filesystem.squashfs" \ -comp xz -b 1M -noappend \ -wildcards -e "*.img" "*.iso" "/dev/*" "/proc/*" "/sys/*" "/tmp/*" "/run/*" \ -no-progress 2>/dev/null cat > "$iso_root/isolinux/isolinux.cfg" <<'EOF' DEFAULT pagan TIMEOUT 50 LABEL pagan MENU LABEL ^Pagan Linux Live KERNEL /boot/vmlinuz-linux APPEND initrd=/boot/initramfs.img root=/dev/ram0 rw quiet splash LABEL pagan-fallback MENU LABEL Pagan Linux (fallback) KERNEL /boot/vmlinuz-linux APPEND initrd=/boot/initramfs.img root=/dev/ram0 rw noacpi EOF # Instalator cat > "$iso_root/install-pagan.sh" <<'EOF' #!/bin/bash echo "╔═══════════════════════════════════════════════╗" echo "║ PAGAN LINUX INSTALLER ║" echo "╚═══════════════════════════════════════════════╝" lsblk read -p "Dysk docelowy (np. /dev/sda): " DISK [ -z "$DISK" ] && exit 1 echo "Instalacja na $DISK..." dd if=/dev/zero of="$DISK" bs=1M count=1 parted -s "$DISK" mklabel gpt parted -s "$DISK" mkpart primary ext4 2048s 100% parted -s "$DISK" set 1 boot on mkfs.ext4 -F -L "PAGAN" "${DISK}1" MOUNT="/mnt/pagan-install" mkdir -p "$MOUNT" mount "${DISK}1" "$MOUNT" rsync -aAX /live/ "$MOUNT/" --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*"} mkdir -p "$MOUNT/dev" "$MOUNT/proc" "$MOUNT/sys" mount --bind /dev "$MOUNT/dev" mount --bind /proc "$MOUNT/proc" mount --bind /sys "$MOUNT/sys" chroot "$MOUNT" grub-install "$DISK" chroot "$MOUNT" update-grub 2>/dev/null || true umount "$MOUNT/dev" "$MOUNT/proc" "$MOUNT/sys" umount "$MOUNT" echo "✅ Instalacja zakończona!" EOF chmod +x "$iso_root/install-pagan.sh" # Generuj ISO if command -v xorriso &>/dev/null; then xorriso -as mkisofs -o "$iso_file" \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -V "Pagan Linux ${PAGAN_VERSION}" \ "$iso_root" 2>/dev/null else error "Brak xorriso" fi rm -rf "$iso_root" ok "ISO: $iso_file ($(du -h "$iso_file" 2>/dev/null | cut -f1))" } # ========================= FINALIZACJA ========================= finalize_build() { step "FINALIZACJA BUDOWY" # /etc/pagan-release cat > "$PAGAN_ROOT/etc/pagan-release" < "$PAGAN_ROOT/etc/issue" < "$PAGAN_ROOT/etc/os-release" </dev/null 2>&1; then ok "python3 + sqlite3 działa" else warn "python3 nie ma sqlite3/zlib/tarfile – pag nie będzie działać!" ((fails++)) || true fi else warn "Brak python3 – pag nie będzie działać!" ((fails++)) || true fi # pag – pełna wersja v3 (nie stub) if [[ -f "$PAGAN_ROOT/usr/bin/pag" ]]; then if grep -q "PAG - Pagan Linux Package Manager v3" "$PAGAN_ROOT/usr/bin/pag" 2>/dev/null; then ok "pag – pełna wersja v3" else warn "pag to stub (niepełna wersja) – sprawdź install_pag" ((fails++)) || true fi else warn "Brak /usr/bin/pag" ((fails++)) || true fi # glibc if [[ -f "$PAGAN_ROOT/usr/lib/libc.so.6" ]]; then local glibc_ver glibc_ver=$(chroot "$PAGAN_ROOT" /usr/bin/ldd --version 2>/dev/null | head -1 | grep -o '[0-9.]*' || true) ok "glibc: ${glibc_ver:-?}" else warn "Brak libc.so.6!" ((fails++)) || true fi # Chroot test if chroot "$PAGAN_ROOT" /bin/bash -c "echo OK" >/dev/null 2>&1; then ok "chroot + bash działa" else warn "chroot /bin/bash NIE działa!" ((fails++)) || true fi if [[ $fails -gt 0 ]]; then warn "Weryfikacja: $fails problemów znalezionych (patrz wyżej)" else ok "Weryfikacja: wszystkie sanity checki przeszły ✅" fi return $fails } # ========================= WIRTUALNE SYSTEMY PLIKÓW ========================= mount_virtual_fs() { info "Montowanie wirtualnych systemów plików w $PAGAN_ROOT..." mount --bind /dev "$PAGAN_ROOT/dev" 2>/dev/null || true mount --bind /dev/pts "$PAGAN_ROOT/dev/pts" 2>/dev/null || true mount -t proc proc "$PAGAN_ROOT/proc" 2>/dev/null || true mount -t sysfs sysfs "$PAGAN_ROOT/sys" 2>/dev/null || true mount -t tmpfs tmpfs "$PAGAN_ROOT/run" 2>/dev/null || true } umount_virtual_fs() { info "Odmontowywanie wirtualnych systemów plików..." umount -l "$PAGAN_ROOT/dev/pts" 2>/dev/null || true umount -l "$PAGAN_ROOT/dev" 2>/dev/null || true umount -l "$PAGAN_ROOT/proc" 2>/dev/null || true umount -l "$PAGAN_ROOT/sys" 2>/dev/null || true umount -l "$PAGAN_ROOT/run" 2>/dev/null || true } # ========================= GŁÓWNY PROCES ========================= main() { cd / show_banner local arg FORCE_PKGS="" for arg in "$@"; do case "$arg" in --rebuild|--from-scratch|--clean) REBUILD_FROM_SCRATCH=1 ;; --force-pkg=*) FORCE_PKGS="${arg#*=},${FORCE_PKGS}" ;; esac done # Clean environment from any previous SYSROOT leakage unset PKG_CONFIG_SYSROOT_DIR if [[ $EUID -ne 0 ]]; then error "Wymagane uprawnienia root (sudo)" fi if _is_true "${REBUILD_FROM_SCRATCH:-0}"; then clean_build_state fi # Wybór środowiska if [[ -z "${PAGAN_DE:-}" ]]; then echo "" echo "Wybierz środowisko graficzne:" echo " 1) GNOME (Wayland, pełne, nowoczesne – domyślne)" echo " 2) Deepin (nowoczesne, eleganckie)" echo " 3) Budgie (minimalne, eleganckie)" echo " 4) Xfce (lekkie, stabilne)" echo "" read -p "Wybierz [1-4]: " de_choice case "$de_choice" in 1|"") PAGAN_DE="gnome" ;; 2) PAGAN_DE="deepin" ;; 3) PAGAN_DE="budgie" ;; 4) PAGAN_DE="xfce" ;; *) error "Nieprawidłowy wybór" ;; esac fi # Wybór formatu obrazu BUILD_IMG="${BUILD_IMG:-}" BUILD_ISO="${BUILD_ISO:-}" if [[ -z "$BUILD_IMG" ]] && [[ -z "$BUILD_ISO" ]]; then case "${ARTIFACT_MODE,,}" in img|"") BUILD_IMG=1; BUILD_ISO=0 ;; iso) BUILD_IMG=0; BUILD_ISO=1 ;; both) BUILD_IMG=1; BUILD_ISO=1 ;; ask) echo "" echo "Wybierz format obrazu:" echo " 1) IMG (obraz dysku – gotowy system)" echo " 2) ISO (obraz live/instalacyjny)" echo " 3) Oba (IMG + ISO)" echo "" read -p "Wybierz [1-3]: " img_choice case "$img_choice" in 1|"") BUILD_IMG=1; BUILD_ISO=0 ;; 2) BUILD_IMG=0; BUILD_ISO=1 ;; 3) BUILD_IMG=1; BUILD_ISO=1 ;; *) error "Nieprawidłowy wybór" ;; esac ;; *) error "Nieprawidłowe ARTIFACT_MODE: ${ARTIFACT_MODE}. Użyj: img|iso|both|ask" ;; esac fi check_dependencies check_lfs_patches init_build build_toolchain # Ch. 5 mount_virtual_fs # Montuj /dev /proc /sys przed budową systemu build_final_system # Ch. 6-8 (LFS + systemd + GRUB) build_blfs # BLFS build_kernel # Kernel (w tym moduły WiFi) install_nvidia_drivers # NVIDIA open-gpu-kernel-modules (best-effort) install_pag install_driver_manager case "${PAGAN_DE,,}" in xfce) install_xfce ;; deepin) install_deepin ;; budgie) install_budgie ;; gnome) install_gnome ;; *) warn "Nieznane DE: $PAGAN_DE – używam GNOME (Wayland)"; install_gnome ;; esac install_calamares install_osinfo configure_grub build_initramfs finalize_build verify_rootfs umount_virtual_fs # Odmontuj przed tworzeniem obrazów if [[ "${BUILD_IMG:-1}" -eq 1 ]]; then create_image fi if [[ "${BUILD_ISO:-0}" -eq 1 ]]; then create_iso fi report_artifacts # Podsumowanie step "✅ BUDOWA ZAKOŃCZONA!" echo -e "\n${GREEN}${BOLD}╔═══════════════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}${BOLD}║ ║${NC}" echo -e "${GREEN}${BOLD}║ ✅ PAGAN LINUX ${PAGAN_VERSION} z ${PAGAN_DE^^} ZBUDOWANY! ║${NC}" echo -e "${GREEN}${BOLD}║ ║${NC}" echo -e "${GREEN}${BOLD}║ 📁 System: ${PAGAN_ROOT} ║${NC}" echo -e "${GREEN}${BOLD}║ 🖥️ Środowisko: ${PAGAN_DE^^} ║${NC}" echo -e "${GREEN}${BOLD}║ 🐧 Kernel: ${KERNEL_VERSION} ║${NC}" echo -e "${GREEN}${BOLD}║ 📦 Menedżer: PAG + pagan-drivers ║${NC}" echo -e "${GREEN}${BOLD}║ ║${NC}" if [[ -f "$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.img" ]]; then echo -e "${GREEN}${BOLD}║ 💾 IMG: $OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.img ║${NC}" fi if [[ -f "$OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.iso" ]]; then echo -e "${GREEN}${BOLD}║ 💿 ISO: $OUTPUT_DIR/Pagan-Linux-${PAGAN_VERSION}-${PAGAN_DE}.iso ║${NC}" fi echo -e "${GREEN}${BOLD}║ ║${NC}" echo -e "${GREEN}${BOLD}║ 📋 Log: ${LOG_FILE} ║${NC}" echo -e "${GREEN}${BOLD}║ ║${NC}" echo -e "${GREEN}${BOLD}║ 💡 Następne kroki: ║${NC}" echo -e "${GREEN}${BOLD}║ - Wypal obraz: dd if=... of=/dev/sdX bs=4M status=progress ║${NC}" echo -e "${GREEN}${BOLD}║ - Uruchom system: logowanie pagan / changeme (wymusi zmianę)║${NC}" echo -e "${GREEN}${BOLD}║ - Sterowniki: pagan-drivers auto ║${NC}" echo -e "${GREEN}${BOLD}║ ║${NC}" echo -e "${GREEN}${BOLD}╚═══════════════════════════════════════════════════════════════════╝${NC}" echo "" } # ========================= URUCHOMIENIE ========================= if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi