128 lines
6.2 KiB
Markdown
128 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.
|