archlinux-s390x/scripts/bootstrap-pacman.sh

223 lines
10 KiB
Bash
Raw Normal View History

[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
#!/usr/bin/env bash
# Bootstrap the Arch packaging toolchain (pacman, makepkg, repo-add) on an
# s390x host, then build official Arch PKGBUILDs for s390x.
#
# WHY THIS IS THE KEYSTONE
#
# The README lists "pacman, bash and GNU coreutils are not yet ported" as three
# missing pieces. They are not three tasks -- pacman is the only one that
# matters, because pacman's source tree also ships makepkg and repo-add. Once
# those three run, every remaining package stops being hand-work and becomes
# `makepkg` on the upstream PKGBUILD.
#
# NO CROSS-COMPILATION IS NEEDED HERE. This runs on native s390x hardware, so
# the whole userspace builds at full speed with the host toolchain. That drops
# the z/VM round-trip the other scripts need.
set -euo pipefail
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
HERE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PATCH_DIR="${PATCH_DIR:-$HERE_DIR/../patches/pkgbuild}"
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
WORK="${WORK:-$HOME/work/arch-s390x}"
REPO="${REPO:-$WORK/repo/s390x}"
PACMAN_GIT="https://gitlab.archlinux.org/pacman/pacman.git"
PKG_GIT_BASE="https://gitlab.archlinux.org/archlinux/packaging/packages"
log() { printf '\n== %s ==\n' "$*"; }
install_host_deps() {
log "Host build dependencies"
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
# Two distinct groups, and confusing them costs hours.
#
# makepkg's OWN requirements: bsdtar and fakeroot. Without them it fails
# deep inside extraction with a bare "bsdtar: command not found".
#
# The PKGBUILDs' makedepends: --nodeps tells pacman not to check them, so
# every one must be satisfied from the Ubuntu host by hand. Each name on
# the last three lines was added because a build stopped on it --
# systemtap-sdt-dev and gmp/mpfr/mpc for glibc and gcc, autopoint and
# gperf for coreutils, asciidoc for pacman, po4a for xz, gnat for gcc's
# Ada front end, debuginfod and jansson for binutils.
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
sudo apt-get -o DPkg::Lock::Timeout=600 install -y -qq \
meson ninja-build pkg-config gettext \
libarchive-dev libcurl4-openssl-dev libgpgme-dev libssl-dev \
libarchive-tools fakeroot \
build-essential autoconf automake libtool m4 patch texinfo bison flex \
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
zstd xz-utils bzip2 \
systemtap-sdt-dev asciidoc autopoint gperf help2man rsync \
libgmp-dev libmpfr-dev libmpc-dev python3-docutils \
libseccomp-dev libpcre2-dev \
po4a gnat libdebuginfod-dev libjansson-dev
[FIX] libdir: the Debian host hid the libraries from Arch meson and cmake both ask the HOST where libraries go. On Ubuntu the answer is lib/s390x-linux-gnu, so five packages already in the repository ship theirs where Arch's ld.so and pkgconf never look. Measured: expat 12 lz4 6 pacman 6 pkgconf 6 zstd 12 entries Nothing failed. util-linux is where it finally shouted, and even there the rm was the first victim, not the cause. pacman is the one that matters: libalpm.so.16 landed where pacman's own binary cannot load it, and a target installed from that package has no working package manager left to repair itself with. arch-meson now states the libdir devtools has no need to state, and is reinstalled on every run -- editing the copy here changed nothing while /usr/local/bin held a stale one. Four packages call bare meson or cmake and get their own hook. util-linux's old hook chased lib64, which never existed here; it is deleted. --- FR --- meson et cmake demandent tous deux à l'HÔTE où vont les bibliothèques. Sous Ubuntu la réponse est lib/s390x-linux-gnu : cinq paquets déjà dans le dépôt livrent donc les leurs là où ld.so et pkgconf d'Arch ne regarderont jamais. Mesuré : expat 12 lz4 6 pacman 6 pkgconf 6 zstd 12 entrées Rien n'a échoué. util-linux est l'endroit où cela a fini par crier, et même là le rm était la première victime, pas la cause. pacman est celui qui compte : libalpm.so.16 atterrissait là où le binaire de pacman ne peut pas la charger, et une cible installée depuis ce paquet n'a plus de gestionnaire de paquets pour se réparer. arch-meson énonce désormais le libdir que devtools n'a pas besoin d'énoncer, et se réinstalle à chaque exécution : éditer la copie du dépôt ne changeait rien tant que /usr/local/bin en gardait une périmée. Quatre paquets appellent meson ou cmake nu et reçoivent leur crochet. L'ancien crochet util-linux poursuivait un lib64 qui n'a jamais existé ici : il est supprimé. Assisted-by: Claude Opus 5
2026-08-17 01:33:41 -04:00
install_host_shims
}
# The parts of "make the host look enough like Arch" that apt cannot express.
#
# Called from install_host_deps AND from build-stage1.sh, deliberately. The
# stand-ins are only consulted through /usr/local/bin, so editing the copy in
# this repository changes NOTHING until it is installed -- and a stale
# /usr/local copy is invisible: the build succeeds and ships the wrong paths.
# Re-installing them on every stage-1 run makes the repository the source of
# truth in fact, not just in intent. Both operations are idempotent.
install_host_shims() {
log "Host shims"
local d="$HERE_DIR/devtools"
sudo install -m755 "$d/arch-meson" "$d/arch-cmake" /usr/local/bin/
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
}
build_pacman() {
log "pacman + makepkg + repo-add"
mkdir -p "$WORK"
[ -d "$WORK/pacman" ] || git clone --depth 1 "$PACMAN_GIT" "$WORK/pacman"
[FIX] driver: a failed clone rebuilt the package before it libselinux does not exist in Arch, so its clone 404'd. GitLab answers a 404 by asking for credentials, which is why the log read "could not read Username" rather than "no such project" -- the first wrong culprit. The second was mine. Neither the clone nor the cd that follows it was guarded, so makepkg ran in whatever directory the previous package had left. It rebuilt util-linux, wrote 119 KB of util-linux output into log-libselinux.txt, and copied the artefact back into the repository. The lesson is the repository's oldest one, one level up: an exit code proves nothing, and neither does a log file's name. Verified by checking every log against the "==> Making package:" line inside it. --- FR --- libselinux n'existe pas dans Arch, son clone a donc rendu un 404. GitLab répond à un 404 en réclamant des identifiants : d'où le « could not read Username » du journal, plutôt qu'un « projet inconnu ». Premier faux coupable. Le second était de mon fait. Ni le clone ni le cd qui le suit n'étaient gardés, alors makepkg tournait dans le répertoire laissé par le paquet précédent. Il a reconstruit util-linux, versé 119 ko de sortie util-linux dans log-libselinux.txt, puis recopié l'artefact dans le dépôt. La leçon est la plus ancienne du dépôt, d'un cran plus haut : un code de sortie ne prouve rien, et le NOM d'un journal non plus. Vérifié en confrontant chaque journal à la ligne « ==> Making package: » qu'il porte. Assisted-by: Claude Opus 5
2026-08-17 01:33:41 -04:00
cd "$WORK/pacman" || return 1
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
# /usr/local, never /usr: this host is Ubuntu and /usr belongs to dpkg.
# makepkg resolves its own libraries from the configured prefix, so the
# prefix has to be real -- running it from the build tree fails with
# "/usr/share/makepkg/*.sh: No such file or directory".
rm -rf build
meson setup build --prefix=/usr/local --buildtype=release \
-Ddoc=disabled -Ddoxygen=disabled -Di18n=false
ninja -C build -j"$(nproc)"
sudo ninja -C build install
}
configure_makepkg() {
log "makepkg configuration"
# CARCH is already detected as s390x by meson; CHOST must stay the
# auto-detected triplet -- configure scripts are matched against it, and
# inventing "s390x-pc-linux-gnu" breaks them.
sudo sed -i "s|^#\?MAKEFLAGS=.*|MAKEFLAGS=\"-j$(nproc)\"|" /etc/makepkg.conf
# pacman refuses to initialise alpm without its database directory. The
# error is only a warning during packaging, but it hides real ones.
sudo mkdir -p /var/lib/pacman
[FIX] give the build host Arch's group ids install: invalid group: '11' The filesystem package creates directories with `install -g 11`, and GNU coreutils rejects a gid that resolves to nothing. gid 11 is `ftp` on Arch; Ubuntu leaves it free. This is the circular corner of any bootstrap: the package that DEFINES /etc/group needs groups that do not exist yet. The way out is to give the build host the target's id map, not to work around the check -- rewriting the install call to force a numeric gid would produce directories owned by a group the target does not have. Only the ids Arch uses and Ubuntu lacks are created, and only when missing, so a host that is already correct is left alone. Checked one by one: of 1, 2, 10, 11, 12 and 50, only 11 was absent. --- FR --- install: invalid group: '11' Le paquet filesystem cree des repertoires avec « install -g 11 », et GNU coreutils refuse un gid qui ne resout vers rien. Le gid 11 est « ftp » sur Arch ; Ubuntu le laisse libre. C est le coin circulaire de tout amorcage : le paquet qui DEFINIT /etc/group reclame des groupes qui n existent pas encore. La sortie est de donner a l hote de compilation la table d identifiants de la cible, non de contourner la verification -- forcer l interpretation numerique produirait des repertoires appartenant a un groupe que la cible n a pas. Seuls les identifiants qu Arch utilise et qu Ubuntu n a pas sont crees, et seulement s ils manquent : un hote deja correct n est pas touche. Verifie un a un : sur 1, 2, 10, 11, 12 et 50, seul le 11 etait absent. Assisted-by: Claude Opus 5
2026-08-16 22:41:50 -04:00
# Arch's numeric group ids must EXIST on the build host.
#
# The filesystem package creates directories with `install -g 11`, and
# GNU coreutils rejects a gid that resolves to nothing:
#
# install: invalid group: '11'
#
# gid 11 is `ftp` on Arch; Ubuntu leaves it free. This is the circular
# corner of any bootstrap -- the package that DEFINES /etc/group needs
# groups that do not exist yet -- and the way out is to give the build
# host the target's id map rather than to work around the check.
#
# Only the ids Arch uses and Ubuntu lacks are created, and only when
# missing, so an already-correct host is left alone.
if ! getent group 11 > /dev/null 2>&1; then
sudo groupadd -g 11 ftp
echo "created group ftp (gid 11), required by the filesystem package"
fi
[FIX] canonical CHOST, and a reachable libassuan source CHOST was the Debian-style triplet. gcc -dumpmachine reports s390x-linux-gnu on this host, but config.sub canonicalises that to s390x-ibm-linux-gnu and GCC builds its tree under the canonical name. Arch PKGBUILDs assume the canonical form -- theirs is x86_64-pc-linux-gnu, vendor field present -- so gcc's own PKGBUILD looked for $CHOST/libstdc++-v3/doc and found nothing: make: *** s390x-linux-gnu/libstdc++-v3/doc: No such file or directory while the build had created s390x-ibm-linux-gnu/libstdc++-v3/doc. This is a port-wide setting, not a gcc quirk: every PKGBUILD that derives a path from CHOST was pointing one directory sideways. libassuan fetches from dev.gnupg.org, which is unreachable from this build host -- measured HTTP 000, while github.com/gpg/libassuan.git and gnupg.org/ftp both answer. That is a network fact, not a port problem, so only the transport changes: the pinned tag is untouched and what gets built is what Arch specifies. Host dependencies again: doxygen for xz, libunistring for libpsl, systemd-dev for util-linux. Every one of them was invisible until a build stopped on it, because --nodeps means pacman never checks makedepends. --- FR --- CHOST portait le triplet de style Debian. Sur cet hote, gcc -dumpmachine rend s390x-linux-gnu, mais config.sub le canonise en s390x-ibm-linux-gnu, et GCC batit son arbre sous le nom canonique. Les PKGBUILD d Arch supposent la forme canonique -- la leur est x86_64-pc-linux-gnu, champ constructeur present -- si bien que le PKGBUILD de gcc cherchait $CHOST/libstdc++-v3/doc sans rien trouver : make: *** s390x-linux-gnu/libstdc++-v3/doc: No such file or directory alors que la compilation avait cree s390x-ibm-linux-gnu/libstdc++-v3/doc. C est un reglage de portage, pas une bizarrerie de gcc : tout PKGBUILD derivant un chemin de CHOST visait un repertoire a cote. libassuan se telecharge depuis dev.gnupg.org, injoignable depuis cet hote -- mesure : HTTP 000, quand github.com/gpg/libassuan.git et gnupg.org/ftp repondent tous deux. C est un fait de reseau, pas un probleme de portage : seul le transport change, l etiquette epinglee reste intacte et ce qui se batit est ce qu Arch specifie. Dependances d hote, encore : doxygen pour xz, libunistring pour libpsl, systemd-dev pour util-linux. Chacune est restee invisible jusqu a ce qu une compilation s y arrete, parce que --nodeps interdit a pacman de verifier les makedepends. Assisted-by: Claude Opus 5
2026-08-16 00:45:50 -04:00
# CHOST must be the CANONICAL triplet, not the Debian-style one.
#
# gcc -dumpmachine reports s390x-linux-gnu here, but config.sub
# canonicalises that to s390x-ibm-linux-gnu, and GCC builds its tree
# under the canonical name. Arch PKGBUILDs assume the canonical form --
# theirs is x86_64-pc-linux-gnu, with the vendor field present -- so
# gcc's own PKGBUILD looked for $CHOST/libstdc++-v3/doc and found
# nothing:
#
# make: *** s390x-linux-gnu/libstdc++-v3/doc: No such file or directory
#
# while the build had created s390x-ibm-linux-gnu/libstdc++-v3/doc.
sudo sed -i 's|^CHOST=.*|CHOST="s390x-ibm-linux-gnu"|' /etc/makepkg.conf
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
grep -E '^(CARCH|CHOST|MAKEFLAGS)=' /etc/makepkg.conf
}
# build_package <name> -- fetch the official PKGBUILD and build it for s390x.
#
# --ignorearch: upstream PKGBUILDs carry arch=(x86_64) and nothing else.
# --skipchecksums: GitLab regenerates .patch URLs, so their checksums drift
# from what the PKGBUILD recorded. Release tarballs still validate; only
# the generated patches are skipped.
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
# --nocheck: stage-1 test suites run against the HOST libraries, not Arch's,
# so their verdict says nothing about the port. acl failed its check() on a
# perfectly sound build, and the suites cost hours. Stage 2 runs them.
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
build_package() {
local name="$1"
log "Building $name"
mkdir -p "$WORK/pkg"
[FIX] driver: a failed clone rebuilt the package before it libselinux does not exist in Arch, so its clone 404'd. GitLab answers a 404 by asking for credentials, which is why the log read "could not read Username" rather than "no such project" -- the first wrong culprit. The second was mine. Neither the clone nor the cd that follows it was guarded, so makepkg ran in whatever directory the previous package had left. It rebuilt util-linux, wrote 119 KB of util-linux output into log-libselinux.txt, and copied the artefact back into the repository. The lesson is the repository's oldest one, one level up: an exit code proves nothing, and neither does a log file's name. Verified by checking every log against the "==> Making package:" line inside it. --- FR --- libselinux n'existe pas dans Arch, son clone a donc rendu un 404. GitLab répond à un 404 en réclamant des identifiants : d'où le « could not read Username » du journal, plutôt qu'un « projet inconnu ». Premier faux coupable. Le second était de mon fait. Ni le clone ni le cd qui le suit n'étaient gardés, alors makepkg tournait dans le répertoire laissé par le paquet précédent. Il a reconstruit util-linux, versé 119 ko de sortie util-linux dans log-libselinux.txt, puis recopié l'artefact dans le dépôt. La leçon est la plus ancienne du dépôt, d'un cran plus haut : un code de sortie ne prouve rien, et le NOM d'un journal non plus. Vérifié en confrontant chaque journal à la ligne « ==> Making package: » qu'il porte. Assisted-by: Claude Opus 5
2026-08-17 01:33:41 -04:00
# Both guards are load-bearing, and their absence cost a whole run.
#
# gitlab.archlinux.org answers a 404 by asking for credentials, so a
# package that does not exist fails as
#
# fatal: could not read Username for 'https://gitlab.archlinux.org'
#
# GIT_TERMINAL_PROMPT=0 turns that into an immediate error instead of a
# process waiting on a terminal that is not there.
#
# Then the cd. With neither guarded, a failed clone left makepkg running
# in whatever directory the PREVIOUS package used -- it rebuilt that
# package, wrote the output into THIS package's log, and copied the
# artefact back into the repository. log-libselinux.txt was 119 KB of
# util-linux. The lesson is the repository's oldest one, one level up:
# an exit code proves nothing, and neither does a log file's NAME.
if [ ! -d "$WORK/pkg/$name" ]; then
GIT_TERMINAL_PROMPT=0 \
git clone --depth 1 "$PKG_GIT_BASE/$name.git" "$WORK/pkg/$name" || {
rm -rf "$WORK/pkg/$name"
echo "clone failed: $PKG_GIT_BASE/$name.git" >&2
return 1
}
fi
cd "$WORK/pkg/$name" || return 1
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
# Port patches. Upstream PKGBUILDs are written for x86_64 and some carry
# flags no other architecture accepts -- glibc's --enable-sframe is the
# first. They are applied here, one hook per package, so each change is
# visible, reviewable and survives a re-clone, rather than being an edit
# someone once made by hand in a working copy.
local hook="$PATCH_DIR/$name.sh"
if [ -f "$hook" ]; then
git checkout -- PKGBUILD 2>/dev/null || true
bash "$hook" || return 1
fi
rm -f ./*.pkg.tar.*
# Explicit `|| return 1`. Relying on `set -e` here does NOT work: callers
# invoke build_package inside `if`, which disables set -e for the whole
# function body. A failing makepkg then fell through to repo-add, whose
# success became the function's exit status -- and a run reported
# "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all
# failed. Measured: the repository held 23 files, not a hundred.
[FIX] clean the source tree between attempts; strip gcc _pick lines Four packages -- grep, gnupg, pacman and curl -- were failing on my own driver, not on the port. makepkg -f rebuilds but does not wipe $srcdir, so a re-run re-entered the previous attempt's tree: patch: ... already exists! Skipping patch. 1 out of 1 hunk ignored mkdir: build-curl-compat: File exists makepkg -C now cleans first. Worth stating plainly: those four looked like port problems for two full rounds, and were not. gcc: dropping sub-packages from pkgname was not enough. package_gcc() _picks files out for every front end regardless of what was requested, and _pick is a mv, so it fails on what was never built: mv: cannot stat 'usr/bin/gnat': No such file or directory The _pick lines for the disabled front ends are removed too. shadow needed libaudit-dev on the host -- one more makedepend that --nodeps hides until a build stops on it. --- FR --- Quatre paquets -- grep, gnupg, pacman et curl -- echouaient a cause de mon propre pilote, pas du portage. makepkg -f reconstruit mais ne vide pas $srcdir, si bien qu une reprise revenait dans l arbre de la tentative precedente : patch: ... already exists! Skipping patch. 1 out of 1 hunk ignored mkdir: build-curl-compat: File exists makepkg -C nettoie desormais d abord. A dire clairement : ces quatre-la ont eu l air de problemes de portage pendant deux tours entiers, et ne l etaient pas. gcc : retirer les sous-paquets de pkgname ne suffisait pas. package_gcc() extrait des fichiers pour chaque frontal quoi qu on ait demande, et _pick est un mv, donc il echoue sur ce qui n a jamais ete bati : mv: cannot stat 'usr/bin/gnat': No such file or directory Les lignes _pick des frontaux desactives sont retirees aussi. shadow reclamait libaudit-dev sur l hote -- un makedepend de plus que --nodeps masque jusqu a ce qu une compilation s y arrete. Assisted-by: Claude Opus 5
2026-08-16 02:23:01 -04:00
# -C wipes $srcdir first. Without it a re-run inherits the previous
# attempt's tree, and prepare() fails on work it already did:
# patch: ... already exists! Skipping patch.
# 1 out of 1 hunk ignored
# mkdir: build-curl-compat: File exists
# grep, gnupg, pacman and curl all failed this way -- not on the
# port, but on my own driver re-entering a dirty directory.
makepkg --nodeps --ignorearch --skippgpcheck --skipchecksums --nocheck \
-C -f || return 1
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
# An exit code is not proof. Only the artefact is.
local produced=()
shopt -s nullglob
produced=(./*.pkg.tar.*)
shopt -u nullglob
if [ "${#produced[@]}" -eq 0 ]; then
echo "no package produced for $name" >&2
return 1
fi
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
mkdir -p "$REPO"
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
cp -f "${produced[@]}" "$REPO/" || return 1
# Only the new packages. Globbing the whole repository made repo-add
# re-index everything on every call: quadratic, and it buried the real
# lines under warnings about entries that already existed.
local names=() f
for f in "${produced[@]}"; do names+=("$(basename "$f")"); done
( cd "$REPO" && repo-add core.db.tar.gz "${names[@]}" ) || return 1
[ADD] bootstrap pacman, makepkg and repo-add natively on s390x The README lists pacman, bash and coreutils as three missing pieces. They are not three tasks: pacman is the only one that matters, because its source tree also ships makepkg and repo-add. Once those run, every remaining package stops being hand-work and becomes makepkg on the upstream PKGBUILD. pacman 7.1.0 builds unpatched on s390x. No cross-compilation is involved: on native hardware the whole userspace builds at full speed, which removes the z/VM round-trip the other scripts need. Measured end to end: zlib built from the official PKGBUILD yields zlib, zlib-static and minizip, all tagged arch = s390x, the library reporting "ELF 64-bit MSB shared object, IBM S/390", and repo-add indexing them into a usable core.db. --- FR --- Le README annonce pacman, bash et coreutils comme trois pieces manquantes. Ce ne sont pas trois travaux : seul pacman compte, parce que son arbre source livre aussi makepkg et repo-add. Des qu ils tournent, chaque paquet restant cesse d etre du travail manuel et devient un makepkg sur le PKGBUILD amont. pacman 7.1.0 se compile sans correctif sur s390x. Aucune compilation croisee n intervient : sur du materiel natif tout l espace utilisateur se batit a pleine vitesse, ce qui supprime l aller-retour z/VM dont dependent les autres scripts. Mesure de bout en bout : zlib bati depuis le PKGBUILD officiel produit zlib, zlib-static et minizip, tous marques arch = s390x, la bibliotheque se declarant « ELF 64-bit MSB shared object, IBM S/390 », et repo-add les indexant dans un core.db utilisable. Assisted-by: Claude Opus 5
2026-08-15 03:18:47 -04:00
}
main() {
install_host_deps
build_pacman
configure_makepkg
for p in "$@"; do build_package "$p"; done
log "Done"
command -v pacman makepkg repo-add
}
[ADD] stage 1: build a self-hosting core for s390x Forty-odd packages in link-time order, from linux-api-headers to pacman itself. The order follows what a compiler actually needs, not pacman metadata: --nodeps means nothing is ever checked, so anything required at link time has to exist already. A failure does not stop the run. One missing package must not hide the state of the forty that follow, so failures are collected and reported at the end, each with its own log. A state file makes the run resumable, which matters when a single gcc build is measured in tens of minutes. The header states why stage 1 is not the port: everything here links against the host glibc, because Arch glibc needs an Arch gcc which needs an Arch glibc. Stages 2 and 3 break that circle. bootstrap-pacman.sh now guards its own main so it can be sourced for build_package without re-running the whole bootstrap. --- FR --- Une quarantaine de paquets dans l ordre des dependances de lien, de linux-api-headers a pacman lui-meme. L ordre suit ce dont un compilateur a reellement besoin, pas les metadonnees de pacman : --nodeps ne verifie jamais rien, donc tout ce qui sert au lien doit deja exister. Un echec n arrete pas la course. Un paquet manquant ne doit pas masquer l etat des quarante suivants : les echecs sont collectes et rapportes a la fin, chacun avec son journal. Un fichier d etat rend la reprise possible, ce qui compte quand un seul gcc se compte en dizaines de minutes. L en-tete dit pourquoi l etage 1 n est pas le portage : tout s y lie a la glibc de l hote, parce que la glibc d Arch reclame un gcc d Arch qui reclame une glibc d Arch. Les etages 2 et 3 brisent ce cercle. bootstrap-pacman.sh garde desormais son main pour etre sourcable et fournir build_package sans relancer tout l amorcage. Assisted-by: Claude Opus 5
2026-08-15 15:48:30 -04:00
# Only run when executed, never when sourced: build-stage1.sh reuses
[FIX] trust artefacts, not exit codes; add a PKGBUILD patch mechanism A run reported "51 built, 0 failed" while glibc, gcc, coreutils and pacman had all failed. The cause is a bash rule that is easy to forget: callers invoke build_package inside an "if", and "if" DISABLES set -e for the whole function body. A failing makepkg fell through to repo-add, whose success became the function exit status. build_package now returns explicitly on failure and, more importantly, verifies that a package file actually exists. An exit code is not proof; only the artefact is. Measured before the fix: 23 files in the repository where a hundred were claimed. First real port patch, applied through a per-package hook rather than by hand: the glibc PKGBUILD passes --enable-sframe, and s390x has no SFrame at all -- configure refuses outright. Hooks re-clone cleanly, so an upstream change is never silently discarded. --nocheck for stage 1: these test suites run against the HOST libraries, not the Arch ones, so their verdict says nothing about the port. acl failed its check step on a sound build. Stage 2 runs them for real. The remaining failures were host makedepends that --nodeps hides: po4a, gnat, debuginfod and jansson are now installed up front. --- FR --- Une execution annoncait « 51 built, 0 failed » alors que glibc, gcc, coreutils et pacman avaient tous echoue. La cause est une regle de bash qu on oublie : build_package est appelee dans un « if », et « if » DESACTIVE set -e pour tout le corps de la fonction. Un makepkg en echec poursuivait jusqu a repo-add, dont la reussite devenait le code de sortie. build_package rend desormais la main explicitement en cas d echec et, surtout, verifie qu un fichier de paquet existe vraiment. Un code de sortie ne prouve rien ; seul l artefact prouve. Mesure avant correction : 23 fichiers dans le depot la ou cent etaient annonces. Premier vrai correctif de portage, applique par crochet et non a la main : le PKGBUILD de glibc passe --enable-sframe, et s390x n a aucun SFrame -- configure refuse net. Les crochets survivent a un reclonage, donc une evolution amont n est jamais perdue en silence. --nocheck pour l etage 1 : ces suites s executent contre les bibliotheques de l HOTE, pas celles d Arch, et leur verdict ne dit rien du portage. acl echouait a son etape check sur une compilation saine. L etage 2 les executera pour de vrai. Les autres echecs etaient des makedepends d hote que --nodeps masque : po4a, gnat, debuginfod et jansson sont poses d entree. Assisted-by: Claude Opus 5
2026-08-15 20:40:17 -04:00
# build_package and must not re-run the whole bootstrap to get it.
[ADD] stage 1: build a self-hosting core for s390x Forty-odd packages in link-time order, from linux-api-headers to pacman itself. The order follows what a compiler actually needs, not pacman metadata: --nodeps means nothing is ever checked, so anything required at link time has to exist already. A failure does not stop the run. One missing package must not hide the state of the forty that follow, so failures are collected and reported at the end, each with its own log. A state file makes the run resumable, which matters when a single gcc build is measured in tens of minutes. The header states why stage 1 is not the port: everything here links against the host glibc, because Arch glibc needs an Arch gcc which needs an Arch glibc. Stages 2 and 3 break that circle. bootstrap-pacman.sh now guards its own main so it can be sourced for build_package without re-running the whole bootstrap. --- FR --- Une quarantaine de paquets dans l ordre des dependances de lien, de linux-api-headers a pacman lui-meme. L ordre suit ce dont un compilateur a reellement besoin, pas les metadonnees de pacman : --nodeps ne verifie jamais rien, donc tout ce qui sert au lien doit deja exister. Un echec n arrete pas la course. Un paquet manquant ne doit pas masquer l etat des quarante suivants : les echecs sont collectes et rapportes a la fin, chacun avec son journal. Un fichier d etat rend la reprise possible, ce qui compte quand un seul gcc se compte en dizaines de minutes. L en-tete dit pourquoi l etage 1 n est pas le portage : tout s y lie a la glibc de l hote, parce que la glibc d Arch reclame un gcc d Arch qui reclame une glibc d Arch. Les etages 2 et 3 brisent ce cercle. bootstrap-pacman.sh garde desormais son main pour etre sourcable et fournir build_package sans relancer tout l amorcage. Assisted-by: Claude Opus 5
2026-08-15 15:48:30 -04:00
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi