Until now the honest description of this port was: it worked once, on one machine. Every PKGBUILD comes from a `git clone --depth 1` of gitlab.archlinux.org, and the 63 hooks assert exact strings -- deliberately, and several have caught their own mistakes that way. But it means the port is written against a moving target: someone starting over today gets what Arch has today, not what these hooks were written against. What closes that is not the 18 GB of build output -- regenerable packages, a chroot wiped on every run, state files derived from the repository by design. It is one commit per checkout: 155 lines. build_package now pins a fresh clone to the locked commit, and says so when a package is NOT in the lock, because that is how a lock quietly stops covering what it claims to. RELAIS.md joins the repository, written without the build machine's alias, address or account -- a successor needs the shape of the access, not its coordinates. check-private.sh keeps it that way, and .env.example loses its literal account name. Three of its patterns had to go on their first runs: they flagged a systemd unit template, upstream maintainer headers, the localhost lines of a generated /etc/hosts, and its own explanatory comment. A check that fails on correct files is one somebody stops running. --- FR --- Jusqu'ici la description honnête de ce portage était : il a fonctionné une fois, sur une machine. Chaque PKGBUILD vient d'un `git clone --depth 1` de gitlab.archlinux.org, et les 63 hooks affirment des chaînes exactes — à dessein, et plusieurs y ont attrapé leurs propres erreurs. Mais le portage est donc écrit contre une cible mouvante : qui recommence aujourd'hui obtient l'Arch du jour. Ce qui comble ce trou n'est pas les 18 Go de production — paquets régénérables, chroot effacé à chaque passage, registres dérivés du dépôt par conception. C'est un commit par arbre : 155 lignes. build_package épingle un nouveau clone sur le commit verrouillé, et le DIT quand un paquet n'y figure pas, car c'est ainsi qu'un verrou cesse discrètement de couvrir ce qu'il prétend. RELAIS.md entre dans le dépôt, écrit sans l'alias, l'adresse ni le compte de la machine — un successeur a besoin de la forme de l'accès, pas de ses coordonnées. check-private.sh l'y maintient, et .env.example perd son nom de compte littéral. Trois de ses motifs ont dû partir dès les premiers passages : ils signalaient un gabarit d'unité systemd, des en-têtes de mainteneurs amont, les lignes localhost d'un /etc/hosts généré, et son propre commentaire explicatif. Un contrôle qui échoue sur des fichiers justes est un contrôle qu'on cesse de lancer. Assisted-by: Claude Opus 5
127 lines
6.2 KiB
Markdown
127 lines
6.2 KiB
Markdown
# Arch Linux sur s390x — état du portage
|
|
|
|
Objectif : **ERPLibre tourne sur Arch Linux s390x.** Terminé quand ERPLibre
|
|
fonctionne, pas quand les paquets compilent.
|
|
|
|
## Où est quoi
|
|
|
|
| | |
|
|
|---|---|
|
|
| Machine | la VM de developpement s390x, Ubuntu, joignable par un rebond ssh |
|
|
| Dépôt du portage | `~/git/archlinux-s390x` — **72 commits, aucun distant** |
|
|
| Espace de travail | `~/work/arch-s390x` |
|
|
| Dépôt étage 1 | `~/work/arch-s390x/repo/s390x` |
|
|
| Dépôt étage 2 | `~/work/arch-s390x/repo2/s390x` |
|
|
| Chroot étage 2 | `~/work/arch-s390x/rootfs-stage2` |
|
|
| Registres | `stage1.state`, `stage2.state` |
|
|
|
|
**Ne pas toucher** : `/var/lib/libvirt` (VM d'autres travaux). Le `/tmp` de
|
|
cette machine est partagé **et** en tmpfs — utiliser un sous-répertoire à soi.
|
|
|
|
## Comment on lance
|
|
|
|
```bash
|
|
cd ~/git/archlinux-s390x
|
|
bash scripts/build-stage1.sh # toute la liste
|
|
bash scripts/build-stage1.sh gperf rsync # à la demande, écrase le registre
|
|
EL_NOCHECK=1 bash scripts/build-stage2.sh --all
|
|
bash scripts/build-stage2.sh libxml2 # un paquet
|
|
bash scripts/test-chroot.sh # RESOLVE / ARTEFACT / SONAME / RUN
|
|
```
|
|
|
|
Toujours en arrière-plan, la sortie dans un fichier :
|
|
|
|
```bash
|
|
setsid nohup bash scripts/build-stage2.sh --all > ~/work/arch-s390x/out.txt 2>&1 < /dev/null &
|
|
```
|
|
|
|
`EL_STALL_MIN` (défaut 45) tue une construction muette ; `EL_NOCHECK=1` saute
|
|
les suites de tests, à réserver à la première passe.
|
|
|
|
## Où on en est
|
|
|
|
- **Étage 1 : 180 paquets**, `RESOLVE ok` — la fermeture du chroot résout à
|
|
**148 paquets** avec `--nodeps` éteint. `ARTEFACT ok`, `RUN ok`.
|
|
- **Étage 2** : `glibc`, `texinfo`, `libxml2`, `linux-api-headers`, `pkgconf` et
|
|
~75 autres reconstruits dans le chroot. Passe complète en cours.
|
|
- Test de fumée du chroot : **11 ok, 0 échec, 0 dérive connue**.
|
|
- **Étage 3 : pas commencé.** Auto-hébergement quand l'étage 3 reproduit
|
|
l'étage 2.
|
|
- **ERPLibre : pas commencé.** 18 paquets et leur fermeture, puis ERPLibre.
|
|
|
|
## Les décisions à connaître
|
|
|
|
**Base processeur : z13, tune z16.** Arch ne nomme aucune base s390x, donc GCC
|
|
retombait sur `arch5` = z900, l'an 2000, et tout paquet à intrinsèques
|
|
vectoriels échouait. Posée à deux endroits qui répondent à deux questions :
|
|
`makepkg.conf` du chroot (comment on compile) et `--with-arch` de gcc (ce que
|
|
suppose le compilateur livré). z13 est ce qu'Ubuntu s390x exige déjà.
|
|
|
|
**`filesystem` livre les liens lib64 sur s390x.** Arch ne les crée que pour
|
|
x86_64 ; sans eux, la chaîne s390x crée un **vrai** `/usr/lib64`, ce qui
|
|
retourne le libdir par défaut de meson et casse tout pkg-config.
|
|
|
|
**Documentation : elle cède.** L'`arch-meson` du chroot est enveloppé avec
|
|
`--auto-features auto`. Neuf outils de documentation manquent et chacun coûte un
|
|
moteur de langage entier (doxygen → LLVM, asciidoctor → Ruby, a2x → Python).
|
|
À restaurer à l'étage 3.
|
|
|
|
**L'étage 2 est reprenable.** Le chroot est reconstruit à chaque passage, donc sa
|
|
production y est réinstallée au démarrage — mais **seulement ce que
|
|
`stage2.state` déclare encore de confiance**. Retirer un nom du registre est la
|
|
façon de dire « ne restaure pas cet artefact ».
|
|
|
|
## Les trois formes d'échec
|
|
|
|
1. **Contamination** — un chemin de l'hôte dans un paquet (multiarch Debian,
|
|
`/usr/local`, `usr/lib64`). Le test ARTEFACT les compte.
|
|
2. **Trou de fermeture** — l'étage 1 bâtit sous `--nodeps`, donc un paquet peut
|
|
se construire et rester ininstallable. `help2man` a bloqué une passe entière
|
|
ainsi. Le test RESOLVE est là pour ça.
|
|
3. **L'hôte est en retard** — libxslt exige libxml2 ≥ 2.15.1, Ubuntu livre
|
|
2.14.5. Ni contamination ni manque : la mauvaise machine. Ces paquets se
|
|
bâtissent **par** l'étage 2, pas dans l'étage 1, et sont hissés dans
|
|
`STAGE2_FIRST`. Une passe d'étage 1 doit les déclarer en échec.
|
|
|
|
## Pièges qui ont coûté du temps
|
|
|
|
- **Un garde qui vérifie une chose voisine de ce qu'il veut dire** — cinq fois.
|
|
`test -L` qui échoue ne dit pas « vrai répertoire » : il échoue aussi sur un
|
|
chemin absent. Un `grep -A1 --enable-languages=ada` vérifiait une ancre qu'une
|
|
section antérieure du même hook avait supprimée.
|
|
- **La première erreur d'un journal n'est pas la cause.** makepkg poursuit après
|
|
un `.BUILDINFO` manqué : cinq échecs ont été attribués à gpgme alors que la
|
|
ligne fatale, plus bas, était toujours la même.
|
|
- **`\s` en Python englobe les retours de ligne.** Une indentation capturée
|
|
contenait un saut de ligne et a inséré un drapeau dans le vide. Travailler sur
|
|
les **lignes**, pas sur les décalages.
|
|
- **Un échec ssh n'est pas la preuve qu'un travail distant est fini.** Le lien du
|
|
rebond tombe. Faire imprimer la réponse par la commande distante et la faire
|
|
sortir en 0, exiger plusieurs absences consécutives, ne jamais conclure depuis
|
|
un hôte injoignable.
|
|
- **Ne jamais `sed -i` un script qu'un bash est en train de lire.** Un fichier
|
|
de guetteur par lancement.
|
|
- **Cinq endroits pour retirer un composant** : tableau `pkgname`, bloc de
|
|
construction, lignes `_pick`, cibles make explicites, et le silencieux — le
|
|
tableau `depends` d'un **autre** sous-paquet, plus les `depends+=` dans
|
|
`package()`.
|
|
|
|
## Commits
|
|
|
|
Identité git : reprendre celle des commits existants (`git log -1 --format='%an <%ae>'`),
|
|
passée en `-c user.name=... -c user.email=...`. `TZ='America/Montreal'`, message écrit dans un fichier puis `git commit -F`.
|
|
Sujet `[TYPE] portée : sujet`, 72 caractères au plus. Corps bilingue : anglais,
|
|
`--- FR ---`, français, ~10 lignes par langue. Trailer
|
|
`Assisted-by: Claude Opus 5`. **Jamais** d'IA dans `Co-authored-by:`.
|
|
Lister les fichiers explicitement — **jamais `git add -A`**.
|
|
|
|
## Ce qui reste
|
|
|
|
1. Finir la passe d'étage 2 ; les échecs restants sont à classer par la
|
|
**dernière** erreur de chaque journal.
|
|
2. Rebâtir `pacman` à l'étage 2 : celui de l'étage 1 réclame `libgpgme.so.11`
|
|
(hôte 1.x) quand notre gpgme livre `.45`. Inoffensif pendant la
|
|
construction, fatal sur la cible.
|
|
3. Passe d'étage 2 **avec** les suites de tests, sans `EL_NOCHECK`.
|
|
4. Étage 3, puis comparaison étage 3 / étage 2.
|
|
5. Les 18 paquets d'ERPLibre et leur fermeture. Puis ERPLibre.
|