archlinux-s390x/patches/pkgbuild/cmake.sh
Mathieu Benoit 75cff944a8 [FIX] binutils records a usr/lib64 path, and cmake deletes html it did not make
pacman refused the rebuilt binutils:

  binutils: <root>/usr/lib64 exists in filesystem (owned by filesystem)
  binutils: <root>/usr/lib64/libiberty.a exists in filesystem

--libdir=/usr/lib was not enough. libiberty installs into
$(libdir)$(MULTIOSSUBDIR), and gcc reports ../lib64 for
-print-multi-os-directory on s390x. In the installed system that resolves
through the symlink filesystem now provides, so the file lands in /usr/lib --
but pkgdir has no symlink, so make creates a real pkg/usr/lib64/ and makepkg
records the literal path. The two fixes are not alternatives: the symlink is what
keeps meson and cmake choosing lib, and this moves the one file that still writes
through the multi-os subdirectory.

cmake is the eleventh instance of removing a documentation build and leaving its
cleanup: with Sphinx off there is no html, and the PKGBUILD deletes _sources from
it. rm -rf rather than deleted -- on a machine with Sphinx it is real.

The binutils hook also assumed package_binutils(). binutils is not a split
package; its own assertion caught that.

--- FR ---

pacman a refusé le binutils reconstruit :

  binutils: <root>/usr/lib64 exists in filesystem (owned by filesystem)
  binutils: <root>/usr/lib64/libiberty.a exists in filesystem

--libdir=/usr/lib ne suffisait pas. libiberty s'installe dans
$(libdir)$(MULTIOSSUBDIR), et gcc annonce ../lib64 pour
-print-multi-os-directory sur s390x. Dans le système installé cela se résout par
le lien que filesystem fournit désormais, donc le fichier atterrit dans
/usr/lib — mais pkgdir n'a pas de lien : make crée un vrai pkg/usr/lib64/ et
makepkg enregistre le chemin littéral. Les deux correctifs ne sont pas des
alternatives : le lien est ce qui fait choisir lib à meson et cmake, et celui-ci
déplace le seul fichier qui écrive encore par le sous-répertoire multi-os.

cmake est la onzième occurrence du retrait d'une documentation sans son nettoyage :
sans Sphinx il n'y a pas de html, et le PKGBUILD en supprime _sources. rm -rf
plutôt que supprimé — sur une machine dotée de Sphinx, il est réel.

Le hook binutils supposait aussi package_binutils(). binutils n'est pas un paquet
scindé ; sa propre assertion l'a arrêté.

Assisted-by: Claude Opus 5
2026-08-23 22:05:26 -04:00

135 lines
6.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# cmake: --qt-gui, on a machine with no display and no Qt.
#
# CMake Error at Source/QtDialog/CMakeLists.txt:33 (message):
# Error when bootstrapping CMake:
#
# cmake-gui is a Qt application. Arch lists qt6-base in makedepends and builds
# it; this port has no Qt and will not grow one to give a bootstrap a dialog
# box. Same reasoning as pinentry's Qt front end, and the cost is the same
# thing: a graphical program nothing here can display.
#
# WHY cmake IS IN STAGE 1 AT ALL, since it is worth being clear that this is
# not scope creep: four PKGBUILDs call cmake directly, and stage 2 rebuilds
# every package inside a chroot that has to contain the build systems. cmake
# is a tool the REBUILD needs, not a dependency of anything in the repository
# -- which is why the dependency resolver never asked for it.
#
# --sphinx-man and --sphinx-html stay: sphinx-build is installed, and the man
# pages are worth having.
#
# The makedepends entry goes with the flag. Nothing checks it under --nodeps,
# but a package declaring a build dependency it does not use is the same
# untruth as gcc-libs declaring libhwasan -- and leaving it would tell the
# next reader that Qt was needed here.
set -euo pipefail
python3 - <<'ZZPY'
import io
s = io.open("PKGBUILD", encoding="utf-8").read()
old = " --qt-gui \\\n"
assert s.count(old) == 1, "cmake: expected exactly one --qt-gui"
s = s.replace(old, "", 1)
old = " qt6-base)"
assert s.count(old) == 1, "cmake: makedepends tail not in the expected form"
s = s.replace(old, " )", 1)
io.open("PKGBUILD", "w", encoding="utf-8").write(s)
ZZPY
grep -q -- '--qt-gui' PKGBUILD && { echo "cmake: --qt-gui survived" >&2; exit 1; }
sed -n '/^makedepends=(/,/)/p' PKGBUILD | grep -q 'qt6-base' && {
echo "cmake: qt6-base still in makedepends" >&2; exit 1; }
grep -q -- '--sphinx-man' PKGBUILD || {
echo "cmake: man pages lost with the GUI" >&2; exit 1; }
echo "cmake: --qt-gui dropped (no Qt, no display)"
# emacs, for one lisp file, at the very last line of package().
#
# PKGBUILD: line 64: emacs: command not found
#
# The build compiled everything, generated the sphinx documentation, installed
# the whole tree, and then died on
#
# emacs -batch -f batch-byte-compile .../site-lisp/cmake-mode.el
#
# make install already put cmake-mode.el in place; this only produces the
# byte-compiled .elc beside it. Emacs loads the .el perfectly well without it,
# a little slower on first load. Installing emacs -- forty megabytes and its
# own dependency tree -- to pre-compile one editor mode for a bootstrap that
# has no editor is not a trade worth making.
#
# THE SHAPE IS WORTH NOTING because it is the third time: pam's PDF removal,
# e2fsprogs' fuse2fs removal, and now this. A failure on the LAST line of
# package(), after a completely successful build, always looks like something
# broke badly. It never is -- it is a tool the host does not have, doing
# something optional.
set -euo pipefail
python3 - <<'ZZPY'
import io
s = io.open("PKGBUILD", encoding="utf-8").read()
old = ' emacs -batch -f batch-byte-compile "${pkgdir}"/usr/share/emacs/site-lisp/cmake-mode.el\n'
assert s.count(old) == 1, "cmake: the emacs byte-compile line is not in the expected form"
s = s.replace(old, "", 1)
old = "makedepends=(emacs\n"
assert s.count(old) == 1, "cmake: makedepends does not start with emacs"
s = s.replace(old, "makedepends=(\n", 1)
io.open("PKGBUILD", "w", encoding="utf-8").write(s)
ZZPY
grep -q 'emacs -batch' PKGBUILD && { echo "cmake: the emacs step survived" >&2; exit 1; }
sed -n '/^makedepends=(/,/)/p' PKGBUILD | grep -qw emacs && {
echo "cmake: emacs still in makedepends" >&2; exit 1; }
grep -q 'cmake-mode' PKGBUILD && {
echo "cmake: a cmake-mode reference remains -- check it is harmless" >&2; }
echo "cmake: emacs byte-compilation dropped (the .el is installed regardless)"
# --- no Sphinx documentation ---------------------------------------------------
#
# CMake Error at Utilities/Sphinx/CMakeLists.txt:52 (message):
#
# cmake builds its own manual and man pages with Sphinx, requested by
# --sphinx-man and --sphinx-html in the bootstrap arguments. python-sphinx is not
# in this port: it is a large Python documentation stack, and cmake is wanted here
# as a build tool.
#
# BOTH FLAGS, and they are bootstrap arguments rather than -D options -- cmake
# configures itself with its own script before it can run itself. Dropping only
# one leaves the other pulling Sphinx in, and the error is identical, which is how
# a half-fix looks like no fix.
set -euo pipefail
python3 - <<'ZZPY'
import io, re
lines = io.open("PKGBUILD", encoding="utf-8").read().split("\n")
hit = [i for i, l in enumerate(lines) if re.match(r"^[ \t]*--sphinx-(man|html)[ \t]*\\\\?$", l)]
assert len(hit) == 2, "cmake: expected two --sphinx flags, got %d" % len(hit)
# Backwards: deleting shifts everything after it.
for i in reversed(hit):
del lines[i]
io.open("PKGBUILD", "w", encoding="utf-8").write("\n".join(lines))
ZZPY
grep -qE "^[[:space:]]*--sphinx-" PKGBUILD && {
echo "cmake: a --sphinx flag survived" >&2; exit 1; }
echo "cmake: Sphinx manual and man pages dropped"
# --- and the html it no longer generates --------------------------------------
#
# rm: cannot remove '<pkgdir>/usr/share/doc/cmake/html/_sources': No such file
#
# ELEVENTH time in this port. With Sphinx off, cmake generates no html, and the
# PKGBUILD deletes _sources from it -- Sphinx leaves the reStructuredText inputs
# beside the rendered pages and they are not wanted in a package.
#
# rm -rf rather than deleted: on a machine with Sphinx the directory is real and
# still has to go.
python3 - <<'ZZPY'
import io, re
lines = io.open("PKGBUILD", encoding="utf-8").read().split("\n")
hit = [i for i, l in enumerate(lines) if "_sources" in l and l.lstrip().startswith("rm ")]
assert len(hit) == 1, "cmake: expected one _sources removal, got %d" % len(hit)
i = hit[0]
lines[i] = lines[i].replace("rm -r ", "rm -rf ", 1)
io.open("PKGBUILD", "w", encoding="utf-8").write("\n".join(lines))
ZZPY
grep -qE "^[[:space:]]*rm -rf .*_sources" PKGBUILD || {
echo "cmake: the _sources removal was not made tolerant" >&2; exit 1; }
echo "cmake: _sources cleanup tolerates its absence"