Note — Checklist Target Tier Policy (Tier 3) annotée pour *-linux-air
Statut : note de planification, NON normative. Jauge l’écart entre notre cible
{x86_64,aarch64}-unknown-linux-airet les exigences Tier 3 de la Target Tier Policy de Rust (RFC 2803 / rustc-dev-guide). À rouvrir à la clôture de la vague 1 (air-sshd), quand la publication amont devient un chantier actif. Prolongeetude-rfc-trait-backend-std-fr.md(l’RFC « backend-trait », prérequis dur) et la checklist de nommage.
Cadre : Tier 3, pas Tier 2
Tier 3 = la cible existe in-tree, compile, sans garantie CI ni binaire rustup. C’est le premier échelon réaliste. Tier 2 (std distribuée via rustup, bâtie dans la CI de Rust) supposerait que leur CI construise notre std — incompatible avec un backend hors-arbre ; objectif très lointain, hors périmètre de cette note.
Légende : ✅ satisfait · ⚠ à trancher / point sensible · 🔸 action mécanique · ❌ blocage.
A. Gouvernance & maintenance
- A1 — Mainteneur·s de cible nommé·s (CCé·s sur les issues ; zéro mainteneur =
refus). ⚠ À formaliser dans
triagebot.toml/platform-support.md: personne physique (BDFL), idéalement un binôme (bus factor). - A2 — Acceptation de la politique (dont : Tier 3 peut casser sans préavis). ✅ Aligné avec notre doctrine (couche 0 instable, « suit le kernel »).
B. Nommage
- B1 — Nom cohérent
arch-vendor-os[-env], sans ambiguïté injustifiée. ⚠ Point le plus discuté :os = airau-dessus du kernel Linux est inhabituel. Rationale dédié :rationale-nommage-linux-air-fr.md(précédentlinux-android). - B2 — Ajout à
platform-support.md. 🔸 Fichier à fournir dans la PR d’ajout.
C. Légal & licences — point critique
- C1 — Code entrant dans rust-lang/rust sous licence Rust (MIT OR Apache-2.0).
❌→⚠ Notre code est MPL-2.0. L’empreinte in-tree doit se limiter à la
spec de cible (petit fichier de config), relicenciable MIT/Apache trivialement ;
le backend PAL reste hors-arbre en MPL via le Track A (
-Z build-std-platform). ⇒ gérable ssi l’empreinte in-tree reste minimale. Raison n°1 pour laquelle le Track A est un prérequis dur, pas un confort. - C2 — Pas de nouvelle dépendance non-permissive pour les autres cibles. ✅
Cible additive, gatée
cfg(target_os="air"). - C3 — Pas de composant propriétaire pour bâtir la cible dans rustc. ✅ 100 % Rust + syscalls Linux ouverts.
D. Support core / alloc / std
- D1 — Implémenter autant que possible de core/alloc/std ; manques documentés. ✅
stdfonctionnellement bouclée sur PAL safe, 2 arches (jalonmigration-std-linux-air). Replisunsupportedrésiduels documentés (chantier complétion PAL). Au-dessus du seuil Tier 3 (qui tolère un std partiel). - D2 —
unsafeconforme (SAFETY…). ✅ Résidus cantonnés à la frontière (doctrine « unsafe couche 0 seulement »).
E. Construction & intégration
- E1 — Spec in-tree (
rustc_target/src/spec), pas un JSON--targetexterne. 🔸 Aujourd’hui : JSON hors-arbre + build-std (rt/). Portage in-tree simple une fois le Track A en place (sinon std ne bâtit pas in-tree pouros="air"). - E2 — Bâtit via le bootstrap standard. 🔸 Dépend d’E1 + Track A.
- E3 — Produit de l’assembleur depuis n’importe quel hôte via un backend rustc. ✅ LLVM, x86_64 et aarch64 prouvés.
F. Non-régression & absence de charge
- F1 — Aucune charge pour les devs Rust non concernés ; code gaté. ✅ Tout derrière
cfg(target_os="air"). - F2 — Ne casse aucune cible Tier 1/2 (ni Tier 3 sans accord). ✅ Ajout additif.
- F3 — Qualité de code, revue habituelle. ✅ Nos standards (100 % couverture, clippy deny, fuzz) dépassent l’attendu.
G. Processus de revue
- G1 — Approbation d’un membre de l’équipe compiler. 🔸 Étape de process de la PR d’ajout ; à préparer avec le rationale B1.
- G2 — Aucune garantie de compat/stabilité (assumé). ✅ Conforme à notre doctrine.
Verdict & séquence
On coche l’essentiel sur le fond (std, qualité, non-régression, absence de propriétaire, arches). 3 items à trancher/agir avant soumission :
- ⚠ C1 — Licence : garantir empreinte in-tree = spec seule (MIT/Apache), backend hors-arbre MPL (⇒ Track A prérequis dur).
- ⚠ B1 — Nommage : voir le rationale dédié.
- ⚠ A1 — Mainteneur : désigner formellement.
Les 🔸 E1/E2/G1 sont mécaniques et débloqués par le Track A.
Chemin réel : (1) finir la vague 1 (air-sshd = démonstrateur), (2) formaliser + socialiser l’RFC backend-trait (Track A) en pré-RFC, (3) soumission Tier 3 quasi-mécanique (Track B). Le vrai goulot est l’RFC amont, pas la cible elle-même.