This commit is contained in:
2026-09-12 08:56:27 +02:00
parent 426aa92d0d
commit 18306bdc8c
116 changed files with 11080 additions and 0 deletions

View File

@@ -0,0 +1,140 @@
# 39. Features, `module.saselmod` et compilation conditionnelle
## 39.1 Features — V1 REQUIS — FIGÉES EN PRINCIPE
Une feature est une capacité optionnelle déclarée par un package.
Elle peut notamment :
```text
activer une dépendance optionnelle
activer un module
sélectionner une capacité/backend fonctionnel de library
contraindre d'autres features
```
Une feature ne représente jamais une plateforme/architecture à la place du modèle de target.
## 39.2 Contraintes de features — V1 REQUIS — FIGÉES EN PRINCIPE
V1 doit pouvoir exprimer au minimum :
```text
requires
conflicts
one-of
at-least-one
```
`all-of` est redondant avec plusieurs `requires` et n'est pas requis comme primitive distincte.
`provides`/`replaces` ne sont pas introduits sans besoin concret démontré.
Les groupes et contraintes globales appartiennent au manifest du package.
## 39.3 Dépendances optionnelles — V1 REQUIS — FIGÉES EN PRINCIPE
Une feature peut activer une dépendance déjà déclarée comme optionnelle dans le manifest. La dépendance garde une définition unique ; la feature ne duplique pas sa source, version ou son mapping.
Les features demandées à une dépendance doivent être déclarables dans l'entrée de dépendance correspondante.
La suppression/renommage d'une feature publique d'un package peut constituer une rupture de compatibilité SemVer.
## 39.4 `module.saselmod` — V1 REQUIS — FIGÉ EN PRINCIPE
`module.saselmod` reste totalement optionnel.
S'il existe, sa première déclaration après éventuel en-tête/documentation est obligatoirement :
```text
namespace ...;
```
et doit correspondre au chemin du module relativement au `source_root`.
Il ne contient ni exports, ni réexports, ni dépendances de package, ni configuration générale de build.
Il peut porter des propriétés réellement module-wide, notamment :
```text
doc ...
deprecated ...
forbid unsafe
requires feature ...
requires capability ...
requires target ...
```
La syntaxe finale de ces directives reste à figer.
## 39.5 Héritage des politiques de module — V1 REQUIS — FIGÉ EN PRINCIPE
Les contraintes/politiques structurelles telles que :
```text
forbid unsafe
requires feature
requires capability
requires target
```
sont héritées par les sous-modules, sauf règle future explicitement plus restrictive.
`doc` n'est pas hérité.
`deprecated` ne constitue pas une copie automatique du texte de dépréciation dans tous les sous-modules ; l'utilisation d'un chemin passant par un module déprécié doit néanmoins pouvoir produire le diagnostic approprié.
## 39.6 `compile if` — V1 REQUIS — SQUELETTE FIGÉ, SYNTAXE À FINALISER
Saselang V1 conserve une compilation conditionnelle structurelle intégrée au parser/AST.
Ce n'est jamais un préprocesseur textuel.
Le `compile if` :
```text
ne produit jamais de valeur ;
ne peut jamais être utilisé comme expression ;
ne peut dépendre que d'informations déterminables à la compilation.
```
En V1 il peut sélectionner :
```text
des déclarations top-level complètes ;
des blocs d'implémentation dans le corps d'une callable.
```
Il ne doit pas servir à modifier conditionnellement les champs/membres structurels internes d'un type déjà déclaré.
Le bloc non sélectionné est éliminé avant HIR/Sase IR. Il doit néanmoins être suffisamment lexé/parsé pour rester syntaxiquement valide.
La syntaxe exacte (`compile if (...)`, forme de `else`, etc.) reste à finaliser.
## 39.7 Environnement de compilation — V1 REQUIS — SQUELETTE FIGÉ
Le compilateur/Core doit pouvoir exposer dans les contextes de compilation conditionnelle des informations déterministes telles que :
```text
language version
compiler version
Core/SDK version
package identity/version
features actives
dépendances résolues
profile
artifact
target family
platform
architecture
ABI
endianness
pointer width
capabilities
```
Les informations doivent être typées lorsque possible.
Le code applicatif normal n'obtient pas pour autant un accès arbitraire au filesystem, au réseau ou aux variables d'environnement pendant l'évaluation de `compile if`.
Les chemins workspace/package/build sont réservés aux outils de build lorsqu'ils sont réellement nécessaires et ne deviennent pas une dépendance sémantique portable du programme.