Note — Rationale de nommage de la cible *-unknown-linux-air
Statut : note de planification, NON normative. Argumentaire destiné à la soumission Target Tier 3 (item B1 de la checklist) : justifier le nom de cible et le choix
target_os = "air". C’est le point que les reviewers de l’équipe compiler sonderont en premier. Prolonge ADR-088 et ADR-050.
Noms proposés
x86_64-unknown-linux-airaarch64-unknown-linux-air
(les variantes *-linux-air-musl sont des cibles de transition/compat et non l’objet
de la soumission Tier 3, qui porte sur le PAL safe natif.)
Forme : arch - vendor - sys - env, soit x86_64 / unknown / linux / air.
La forme du triple est délibérément familière — elle calque x86_64-unknown-linux-gnu
et x86_64-unknown-linux-musl : dernier champ = le runtime/ABI userland au-dessus du
kernel Linux (gnu = glibc, musl = musl, air = le PAL safe d’Air).
La question centrale : target_os = "air", pas target_env = "air"
Un reviewer objectera : « la forme dit env (linux-air, comme linux-gnu) ; pourquoi
alors exposer target_os = "air" et non target_env = "air" en gardant
target_os = "linux" ? »
Réponse — c’est le cœur du design (ADR-088). Les variantes d’environnement de Linux
(gnu, musl) partagent toutes target_os = "linux" et target_family = "unix",
ce qui présuppose une libc C et la sémantique POSIX (errno in-band, unix-family std).
Air rejette cette présupposition par construction : aucune libc C, un PAL safe
sur nos Managers couche 1, une ABI propre. Or :
- La sélection du backend
std::sysunix est piloté partarget_family = "unix"/target_os = "linux". Resteros = linuxforcerait le backend unix (libc) — l’exact opposé de ce qu’Air fournit. - Il n’existe pas de mécanisme pour dire « Linux, mais hors
unix-family, sans libc » via un simpletarget_env. La seule façon d’obtenir un backend distinct, non-unix est untarget_osdistinct — d’oùos = "air".
Autrement dit : le triple garde la forme d’un env Linux (lisibilité, familiarité), mais la sémantique cfg est celle d’un OS distinct, parce que c’est le seul point de bascule qui donne à Air son propre backend sans traîner l’hypothèse libc.
Précédent : *-linux-android
Le précédent direct est Android : triple aarch64-linux-android, tournant sur le
kernel Linux, et pourtant exposé comme target_os = "android" (backend std dédié,
distinct du bras gnu/musl). Rust a déjà entériné qu’« un target_os ≠ le kernel » :
os désigne la plateforme/ABI userland, pas le noyau. Air suit exactement ce motif — la
différence étant qu’Android reste unix-family (bionic = libc), tandis qu’Air est le cas
nouveau : un target_os sur kernel Linux délibérément hors unix-family.
| Cible | Kernel | target_os | unix-family | Runtime userland |
|---|---|---|---|---|
x86_64-unknown-linux-gnu | Linux | linux | oui | glibc |
x86_64-unknown-linux-musl | Linux | linux | oui | musl |
aarch64-linux-android | Linux | android | oui | bionic |
x86_64-unknown-linux-air | Linux | air | non | PAL Rust safe (couche 1) |
Objections anticipées & réponses
- «
airest vague / marketing. »airest l’identité publique du projet (Air Desktop), concise, sans collision avec untarget_osexistant, et cohérente avec la famille de cratesair-*. On peut documenter que « air » nomme le PAL (Platform Abstraction Layer) safe, pas une marque. - « Pourquoi pas un
target_osgénérique (rust,safe,none) ? »none= pas d’OS (bare-metal) — faux, on a un kernel Linux et un userland riche. Un nom générique masquerait qu’on est spécifiquement sur Linux (io_uring, Landlock, seccomp, clone3… — nos choix assumés, ADR-004).airporte cette spécificité. - « Maintenance du bras
os = airdans ~15 dispatchscfg_select!. » C’est précisément ce que résout l’RFC backend-trait (Track A) : un point d’extension unique + backend hors-arbre. Le nommage et l’RFC sont complémentaires. - «
vendor = unknown? » Conventionnel (cf.*-unknown-linux-gnu). Aucun vendor spécifique ne s’applique.
Conclusion
{arch}-unknown-linux-air + target_os = "air" est cohérent avec les conventions Rust
(forme calquée sur linux-gnu/linux-musl), précédé par linux-android (os ≠ kernel),
et justifié par la seule contrainte technique dure : obtenir un backend std::sys
non-unix, sans libc, ce qu’un target_env ne permet pas. Le seul aspect réellement
nouveau — un target_os sur kernel Linux hors unix-family — est assumé et
documenté ; c’est la raison d’être d’Air.