archlinux-s390x/patches/pkgbuild/e2fsprogs.sh
Mathieu Benoit cb13d98b2b [FIX] four hooks the closure's second round needed
e2fsprogs builds fuse2fs, deletes it, and repackages it. Without fuse3 on the
host it was never compiled, so the delete aborted package() after a clean
build -- and its sub-package declares fuse3, which this port does not ship, so
even a success would have been uninstallable. Three reasons, one direction.

libsasl said `libpq-fe.h: No such file or directory` about a file that is
there, in /usr/include/postgresql. mysql.h is in /usr/include/mariadb, the
same shape one step behind it. Two headers that exist on paths configure does
not try is a queue, and this port already wrote down what a queue means: a
single missing library is a host dependency, a queue of them is a feature to
disable. Arch declares depends=(glibc) for libsasl and says why -- the SQL
plugins are dlopened, never linked.

python-audit and python-capng go the way python-brotli went, but the reason is
stated differently on purpose. Cost was the argument then; measured now,
python costs three packages rather than a subtree, so that argument no longer
holds. The ABI does: both are cp313 wheels and Arch ships 3.14.

--- FR ---

e2fsprogs bâtit fuse2fs, le supprime, puis le rempaquette. Sans fuse3 sur
l'hôte il n'a jamais été compilé : la suppression interrompait donc package()
après une compilation propre — et son sous-paquet déclare fuse3, que ce
portage ne livre pas, si bien qu'une réussite aurait été ininstallable. Trois
raisons, une seule direction.

libsasl annonçait « libpq-fe.h: No such file or directory » à propos d'un
fichier présent, sous /usr/include/postgresql. mysql.h est sous
/usr/include/mariadb, même forme un cran derrière. Deux en-têtes qui existent
sur des chemins que configure n'essaie pas font une file d'attente, et ce
dépôt a déjà consigné ce qu'une file signifie : une bibliothèque manquante est
une dépendance hôte, une file en est une fonctionnalité à désactiver. Arch
déclare depends=(glibc) pour libsasl et explique pourquoi — les greffons SQL
sont chargés dynamiquement, jamais liés.

python-audit et python-capng suivent python-brotli, mais le motif est énoncé
autrement à dessein. C'était le coût alors ; mesuré maintenant, python coûte
trois paquets et non un sous-arbre, cet argument ne tient donc plus. L'ABI,
si : les deux sont des roues cp313 quand Arch livre la 3.14.

Assisted-by: Claude Opus 5
2026-08-19 06:24:11 -04:00

45 lines
2.2 KiB
Bash
Executable file

#!/usr/bin/env bash
# e2fsprogs: fuse2fs is built, deleted, and repackaged -- and none of that
# happens without fuse3 on the host.
#
# rm: cannot remove '<pkgdir>/usr/bin/fuse2fs': No such file or directory
#
# package_e2fsprogs() removes fuse2fs so that package_fuse2fs() can ship it
# separately. The host has no fuse3, so misc/fuse2fs was never compiled, the
# path never existed, and the rm aborted package() AFTER a clean build -- the
# same shape as pam's PDF glob and util-linux's static libraries.
#
# THE PART WORTH CHECKING RATHER THAN PATCHING BLINDLY: making the rm tolerant
# is not enough on its own. fuse2fs is a SUB-PACKAGE, declared in pkgname, and
# package_fuse2fs() installs from misc/fuse2fs -- so it would fail next, on
# the same absent file. And its depends=('fuse3' 'e2fsprogs') names fuse3,
# which this port does not build, so even a successful package would be
# uninstallable. Three reasons pointing the same way.
#
# e2fsprogs is in stage 1 for libcom_err.so and libss.so, which krb5 needs
# after --with-system-ss was dropped. A FUSE mount helper is not part of that.
#
# Deferred, not architectural: build fuse3, add it to the closure, and both
# the sub-package and the rm come back on their own. TODO.md records it.
set -euo pipefail
python3 - <<'PY'
import io
s = io.open("PKGBUILD", encoding="utf-8").read()
old = "pkgname=('e2fsprogs' 'fuse2fs')"
assert s.count(old) == 1, "e2fsprogs: pkgname line not in the expected form"
s = s.replace(old, "pkgname=('e2fsprogs')", 1)
# The rm keeps its -f rather than being deleted: with fuse3 present the files
# WOULD exist and must still be removed from the main package.
old = ' rm "${pkgdir}"/usr/{bin/fuse2fs,share/man/man1/fuse2fs.1}\n'
assert s.count(old) == 1, "e2fsprogs: fuse2fs removal not in the expected form"
s = s.replace(old, ' rm -f "${pkgdir}"/usr/{bin/fuse2fs,share/man/man1/fuse2fs.1}\n', 1)
io.open("PKGBUILD", "w", encoding="utf-8").write(s)
PY
grep -q "^pkgname=('e2fsprogs')$" PKGBUILD || {
echo "e2fsprogs: fuse2fs not dropped from pkgname" >&2; exit 1; }
grep -qF 'rm -f "${pkgdir}"/usr/{bin/fuse2fs' PKGBUILD || {
echo "e2fsprogs: fuse2fs removal not made tolerant" >&2; exit 1; }
echo "e2fsprogs: fuse2fs dropped (no fuse3 on the host, none in the closure)"