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
45 lines
2.2 KiB
Bash
Executable file
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)"
|