🔒 Repository is read-only – file editing is disabled.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
#!/bin/bash
# =============================================================================
# fix-xml-parser.sh – naprawa XML::Parser (perl 5.44) w bieżącym rootfs Pagan
# =============================================================================
# Problem: plasma-desktop pada z "You must have XML::Parser installed to run
# /mnt/pagan/usr/bin/intltool-merge". Przyczyna:
# • /bin/sh w rootfs jest martwym symlinkiem (-> bash, a bash jest w /usr/bin),
# przez co chrootowy build XML::Parser z CPAN kończył się: "env: 'sh': No such file"
# • dla perla 5.44 XML::Parser nie został zbudowany (jest tylko stary 5.42 z repo
# = ABI mismatch).
#
# Skrypt: naprawia /bin/sh, buduje XML::Parser w chrocie i weryfikuje intltool-merge.
#
# URUCHOMIENIE:
# sudo ./fix-xml-parser.sh
# a potem wznowij build:
# sudo ./build-pagan.sh
# =============================================================================
set -euo pipefail
R="${PAGAN_ROOT:-/mnt/pagan}"
[ "$(id -u)" = "0" ] || { echo "❌ Uruchom jako root: sudo ./fix-xml-parser.sh"; exit 1; }
# 1) Napraw /bin/sh – wskaż wprost na /usr/bin/bash
echo "=== 1. Naprawa /bin/sh ==="
ln -sfv /usr/bin/bash "$R/bin/sh"
# 1b) libcrypt.so.2 – target perl zbudowany na hoście linkuje libcrypt.so.2 (SONAME 2),
# a libxcrypt w rootfs ma SONAME 1 (libcrypt.so.1.1.0). Wersje symboli XCRYPT_*
# identyczne → symlink wyrównuje obie strony (perl + narzędzia shadow).
echo "=== 1b. Kompatybilność libcrypt (libcrypt.so.2) ==="
[[ -e "$R/usr/lib/libcrypt.so.2" ]] || \
ln -sfv libcrypt.so.1.1.0 "$R/usr/lib/libcrypt.so.2"
# 2) Wirtualne FS dla chroot (best-effort – przy wznowieniu build i tak je zamontuje)
echo "=== 2. Montowanie wirtualnych FS ==="
# /dev bywa nieobecny (init_build go nie tworzył, a bind po przerwaniu builda
# znika) → bez /dev/null MakeMaker perla nie działa ("Unable to find a perl 5",
# make: Permission denied / 127). Zapewniamy /dev z urządzeniami.
if [[ -e "$R/dev/null" ]]; then
echo " ✓ /dev już gotowy (jest /dev/null)"
else
grep -q " $R/dev " /proc/mounts 2>/dev/null && umount -l "$R/dev" 2>/dev/null || true
mkdir -p "$R/dev"
if ! mount --bind /dev "$R/dev" 2>/dev/null; then
mount -t devtmpfs devtmpfs "$R/dev" 2>/dev/null || true
fi
[[ -e "$R/dev/null" ]] && echo " ✓ /dev zamontowany (jest /dev/null)" \
|| echo " ⚠ /dev bez /dev/null – chroot może zawodzić"
fi
mkdir -p "$R/dev/pts"
mount --bind /dev/pts "$R/dev/pts" 2>/dev/null || true
mount -t proc proc "$R/proc" 2>/dev/null || true
mount -t sysfs sysfs "$R/sys" 2>/dev/null || true
mount -t tmpfs tmpfs "$R/run" 2>/dev/null || true
# 2c) NATYWNY binutils (as/ld/ar) – build_final_system go nie buduje, a gcc w
# chrocie nie ma asemblera ("gcc: fatal error: cannot execute 'as'"). Budujemy
# na hoście z DESTDIR do rootfs (glibc hosta == target == 2.44 → bez ryzyka ABI).
echo "=== 2c. Build natywnego binutils (as/ld) ==="
if [ -x "$R/usr/bin/as" ] && [ -x "$R/usr/bin/ld" ]; then
echo " ✓ binutils już w target"
else
BU_ARCH="$R/sources/binutils-2.47.tar.xz"
[ -f "$BU_ARCH" ] || wget -q --timeout=120 -O "$BU_ARCH" \
"https://ftp.gnu.org/gnu/binutils/binutils-2.47.tar.xz"
rm -rf "$R/sources/build-binutils" && mkdir -p "$R/sources/build-binutils"
tar -xf "$BU_ARCH" -C "$R/sources/build-binutils" --strip-components=1
(
cd "$R/sources/build-binutils"
export PATH="/usr/bin:/bin"
export CFLAGS="-std=gnu17 -O2 -Wno-error=implicit-function-declaration -Wno-error=int-conversion -Wno-error=return-type"
export LDFLAGS="-L$R/usr/lib -Wl,-rpath-link,$R/usr/lib"
mkdir -p build && cd build
../configure --prefix=/usr --sysconfdir=/etc \
--enable-libctf --disable-werror --enable-ld=default \
--enable-plugins --enable-relro --enable-threads
make -j"$(nproc)"
make tooldir=/usr install DESTDIR="$R"
) > "$R/sources/binutils-build.log" 2>&1
# LFS: usuń statyczne liby binutils (mają zaszyte ścieżki builda)
rm -f "$R/usr/lib"/libbfd.a "$R/usr/lib"/libbfd.la "$R/usr/lib"/libctf.a \
"$R/usr/lib"/libctf.la "$R/usr/lib"/libctf-nobfd.a "$R/usr/lib"/libctf-nobfd.la \
"$R/usr/lib"/libopcodes.a "$R/usr/lib"/libopcodes.la 2>/dev/null || true
rm -rf "$R/sources/build-binutils"
if [ -x "$R/usr/bin/as" ] && [ -x "$R/usr/bin/ld" ]; then
echo " ✓ binutils zainstalowany: $("$R/usr/bin/as" --version 2>/dev/null | head -1)"
else
echo " ❌ binutils build nieudany (log: $R/sources/binutils-build.log)"
exit 1
fi
fi
# 3) Build XML::Parser (perl 5.44) w chrocie – czyste env, bash -c
echo "=== 3. Build XML::Parser (perl 5.44) ==="
XP="$R/sources/XML-Parser-2.44.tar.gz"
if [ ! -f "$XP" ]; then
echo "Pobieranie XML-Parser-2.44..."
wget -q --timeout=60 -O "$XP" \
"https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.44.tar.gz"
fi
rm -rf "$R/tmp/xml-parser-build" && mkdir -p "$R/tmp/xml-parser-build"
tar -xzf "$XP" -C "$R/tmp/xml-parser-build" --strip-components=1
chroot "$R" env -i PATH=/usr/bin:/bin HOME=/root \
bash -c "cd /tmp/xml-parser-build && PERL_MM_USE_DEFAULT=1 perl Makefile.PL && make && make install" 2>&1 | tail -20
rm -rf "$R/tmp/xml-parser-build"
# 4) Weryfikacja: target perl na HOŚCIE ładuje XML::Parser (tak działa intltool-merge)
echo "=== 4. Weryfikacja ==="
_pver=""
for _d in "$R"/usr/lib/perl5/5.*; do [[ -d "$_d" ]] && _pver="$(basename "$_d")"; done
_parch=""
for _d in "$R/usr/lib/perl5/$_pver"/*/; do [[ -d "$_d/CORE" ]] && _parch="$(basename "$_d")" && break; done
echo "perl: $_pver, arch: $_parch"
if LD_LIBRARY_PATH="$R/usr/lib/perl5/$_pver/$_parch/CORE:/usr/lib:$R/usr/lib" \
PERL5LIB="$R/usr/lib/perl5/$_pver:$R/usr/lib/perl5/site_perl/$_pver:$R/usr/lib/perl5/$_pver/$_parch:$R/usr/lib/perl5/site_perl/$_pver/$_parch" \
"$R/usr/bin/perl" -MXML::Parser -e 'print "XML::Parser ", $XML::Parser::VERSION, " OK\n"' 2>&1; then
echo
else
echo "❌ XML::Parser NIE działa dla perl $_pver – sprawdź log powyżej"
exit 1
fi
# 5) Ostateczny test: intltool-merge (dokładnie tak woła go CMake/plasma-desktop)
echo "=== 5. Test intltool-merge (na hoście) ==="
if LD_LIBRARY_PATH="$R/usr/lib/perl5/$_pver/$_parch/CORE:/usr/lib:$R/usr/lib" \
PERL5LIB="$R/usr/lib/perl5/$_pver:$R/usr/lib/perl5/site_perl/$_pver:$R/usr/lib/perl5/$_pver/$_parch:$R/usr/lib/perl5/site_perl/$_pver/$_parch" \
"$R/usr/bin/intltool-merge" --version; then
echo
echo "✅ intltool-merge działa – plasma-desktop (KAccounts) przejdzie dalej"
else
echo "❌ intltool-merge nadal nie działa – sprawdź powyżej"
exit 1
fi
echo
echo "=== Gotowe. Wznów build: sudo ./build-pagan.sh ==="