archlinux-s390x/patches/pkgbuild/readline.sh

46 lines
2.4 KiB
Bash
Raw Normal View History

[FIX] stage 2: x86_64 compiler flags, and a .pc naming nothing Two failures three packages apart, both from the same place: our pacman package ships Arch's configuration verbatim, and Arch's is for x86_64. libxml2/meson.build:1:0: ERROR: Unable to detect linker for compiler `cc ... -march=x86-64 -mtune=generic ...` configure_chroot fixed CARCH, CHOST, MAKEFLAGS and OPTIONS and left CFLAGS alone. They are emptied rather than translated, because that is what stage 1 used -- the host's makepkg.conf has no CFLAGS line at all -- and 179 working packages are the evidence. s390x tuning is a deliberate later choice. Emptied by APPENDING, not commenting. The first attempt put a # in front of each assignment, and CFLAGS spans several lines: commenting the first left the continuations active and the quote unbalanced, so makepkg would not start. Then readline. Its .pc says `Requires.private: termcap` and this repository ships tinfo.pc; nothing provides termcap.pc. Nothing failed at build time -- a .pc is data, and pkg-config only follows Requires.private when a consumer asks. The first consumer to ask was libxml2, in the chroot, one stage and three packages from the cause. --- FR --- Deux échecs à trois paquets d'écart, de la même origine : notre paquet pacman livre la configuration d'Arch telle quelle, et celle d'Arch vise x86_64. libxml2/meson.build:1:0: ERROR: Unable to detect linker for compiler `cc ... -march=x86-64 -mtune=generic ...` configure_chroot corrigeait CARCH, CHOST, MAKEFLAGS et OPTIONS, et laissait CFLAGS. Ils sont vidés plutôt que traduits, car c'est ce qu'a utilisé l'étage 1 — le makepkg.conf de l'hôte n'a aucune ligne CFLAGS — et 179 paquets fonctionnels en sont la preuve. Le réglage pour s390x est un choix ultérieur délibéré. Vidés par AJOUT, non par commentaire. La première tentative mettait un # devant chaque affectation, et CFLAGS s'étend sur plusieurs lignes : commenter la première laissait les continuations actives et le guillemet déséquilibré, si bien que makepkg ne démarrait plus. Puis readline. Son .pc dit « Requires.private: termcap » alors que ce dépôt livre tinfo.pc ; personne ne fournit termcap.pc. Rien n'échouait à la compilation — un .pc est une donnée, et pkg-config ne suit Requires.private que si un consommateur le demande. Le premier à demander fut libxml2, dans le chroot, à une étape et trois paquets de la cause. Assisted-by: Claude Opus 5
2026-08-19 20:19:37 -04:00
#!/usr/bin/env bash
# readline: its .pc file requires a module nothing in the repository provides.
#
# Package 'termcap', required by 'readline', not found
#
# readline's configure writes `Requires.private: termcap` into readline.pc,
# because that is the historical name of the terminal library it links. Our
# ncurses package ships tinfo.pc and ncurses.pc -- there is no termcap.pc, and
# nothing else in the repository supplies one.
#
# Nothing fails at build time. The .pc is data, and pkg-config only follows
# Requires.private when a CONSUMER asks. The first consumer to ask was libxml2,
# inside the stage-2 chroot, and it stopped at meson configure -- three
# packages and one stage away from the cause.
#
# tinfo is the right name: it is what ncurses actually installs the terminfo
# routines into (`--with-termlib`), and readline links -lncurses which pulls it.
# This is the same substitution the host needed for history.pc, made for the
# same reason, in the other direction: there the file was missing and had to be
# generated, here it exists and names the wrong dependency.
#
# The package's .pc is patched in package(), after make install writes it, so
# nothing in the build sees a different file than what ships.
set -euo pipefail
python3 - <<'ZZPY'
import io, re
s = io.open("PKGBUILD", encoding="utf-8").read()
# AFTER make install, not at the top of package(). The first version anchored
# on `package() {` and ran the sed before the file existed:
# sed: can't read .../usr/lib/pkgconfig/readline.pc: No such file or directory
m = re.search(r'^ make -C \$pkgname-\$_basever DESTDIR="\$pkgdir" install\n', s, re.M)
assert m, "readline: the install line in package() is not in the expected form"
fix = """ # readline.pc says `Requires.private: termcap`; this repository ships
# tinfo.pc, not termcap.pc, so any consumer asking pkg-config about readline
# fails on a module nobody provides.
sed -i 's/^Requires.private: termcap$/Requires.private: tinfo/' \\
"$pkgdir"/usr/lib/pkgconfig/readline.pc
grep -q '^Requires.private: tinfo$' "$pkgdir"/usr/lib/pkgconfig/readline.pc
"""
s = s[:m.end()] + fix + s[m.end():]
io.open("PKGBUILD", "w", encoding="utf-8").write(s)
ZZPY
grep -q 'Requires.private: tinfo' PKGBUILD || {
echo "readline: the .pc substitution was not inserted" >&2; exit 1; }
echo "readline: readline.pc now requires tinfo (termcap.pc does not exist here)"