Steel est la couche de configuration declarative du build. Il lit, valide et resout un workspace (packages, profils, toolchains, targets), puis genere un artefact stable (steel.log / steelconfig.mff). Vitte consomme cet artefact pour appliquer les regles de build et executer les etapes de compilation de facon deterministe.
steel.log / steelconfig.mff) pour audit et CI.print, graph, why) pour diagnostiquer.-D KEY=VALUE sans modifier le fichier.Un steelconf décrit explicitement le workspace, les profils, les targets et la toolchain. Pas de regles ad-hoc : la structure reste lisible, composable et stable.
!muf 4
[workspace]
.set name "demo"
.set root "."
.set target_dir "target"
.set profile "debug"
..
[profile debug]
.set opt 0
.set debug 1
..
[profile release]
.set opt 2
.set debug 0
..
[target x86_64-apple-darwin]
.set os "macos"
.set arch "x86_64"
..
[tool gcc]
.exec "gcc"
..
[tool ar]
.exec "ar"
..
Commandes (details dans doc/manifest.md, liste rapide: doc/manifest.md#liste-rapide-commandes, flags: doc/manifest.md#flags-frequents):
steel (equivalent de steel build steelconf)build steelconfrundoctorcachegraphfmtversion/helpsteel (comme steel build steelconf) n accepte aucun flag: tout est dans steelconf.Exemples:
steel run
Steel fournit un editeur terminal integre pour steelconf : steecleditor.
Lancer:
steel editor
steel editor path/to/steelconf
Fonctions principales:
Raccourcis utiles:
Ctrl+S save, Ctrl+O open, Ctrl+Q quitCtrl+F search, F3 next match, Ctrl+L go to lineCtrl+P find file, F2 recent filesCtrl+R steel run, Ctrl+Shift+E jump run errorCtrl+Shift+G glob preview, Ctrl+Shift+I insert snippetLe backend OCaml est exposé via SteelLib. Exemple d’import:
use SteelLib::ocaml::{OcamlArgs, OcamlDriver, OcamlSpec};
doc/manifest.md#liste-rapide-commandesdoc/manifest.md#flags-frequentsdoc/manifest.md#cli-completeSteel vise une uniformisation totale du build : meme modele, memes commandes et memes sorties logiques, quel que soit le langage (Vitte, C/C++, C#, Rust, …) et l’environnement (machines anciennes ou recentes, OS/arch heterogenes).
steel.log et consommee ensuite de maniere deterministe.print, -why, -graph) pour outiller CI, IDE et scripts.L’objectif est de pouvoir orchestrer des projets mono-langage comme des projets mixtes, sur des environnements modernes comme plus anciens, sans divergence de modele ni de workflow.
Le pipeline est scinde en deux phases : Configuration puis Construction.
Configuration — build steel
steel.log (artefact canonique)Au cœur du pipeline, Steel calcule automatiquement ce qui doit être reconstruit.
Lors de la phase de configuration, steel / Steel peut générer un fichier .mff (configuration gelée) destiné à une compilation globale. Cette configuration est ensuite utilisée pour produire des artefacts binaires Vitte :
Steel build main.muff
Le build génère les sorties dans un répertoire d’artefacts par dossier (par convention ./.steel/ ou ./.muff/ selon la configuration), tant qu’aucune erreur n’est détectée pendant la compilation.
Le buildfile reste générique : Steel est capable d’orchestrer des projets Vitte et des projets mixtes via des tools déclaratifs (par exemple pour C/C++/C#/Rust), tant que les toolchains et les étapes (compile/link/archive/package) sont décrites de manière explicite.
┌─────────────────────────────────────────────────────────────┐
│ PHASE CONFIGURATION │
│ (build steel) │
└─────────────────────────────────────────────────────────────┘
1. CHARGEMENT
├── steelconf (workspace + packages + profils)
├── Toolchains (compilateurs, linkers, outils)
└── Targets (spécifications de build)
2. VALIDATION
├── Syntaxe des fichiers
├── Références (packages, targets, profils existants)
├── Compatibilités (OS/arch, versions, dépendances)
└── Contraintes (chemins, permissions, etc.)
3. RÉSOLUTION
├── Application des profils et héritage
├── Résolution des overrides
├── Interpolation des variables
├── Calcul des empreintes toolchain (fingerprints)
└── Résolution des dépendances transitives
4. ÉMISSION
└── steel.log (configuration gelée et normalisée)
┌─────────────────────────────────────────────────────────────┐
│ PHASE CONSTRUCTION │
│ (build vitte) │
└─────────────────────────────────────────────────────────────┘
Vitte lit steel.log et :
├── Construit le DAG des étapes
├── Résout les dépendances de fichiers
├── Exécute l'ordre topologique
└── Gère l'incrémental et le cache
Workspace (conteneur global)
Package (unité compilable)
Profile (ensemble d’options)
Target (objectif de build)
Toolchain (ensemble d’outils)
Steel (Déclaratif)
Vitte (Exécutif)
steel.log (Contrat)
Vitte orchestre la phase construction à partir de la configuration gelée :
inputs → outputs)steelconfsteelconf contient une configuration normalisée et explicite (plus d’implicite côté build). Exemples de champs attendus :
! muf4),steel run[<plan>] [flags] [-- <args>]
steel run steelconfig : exécute le plan par défaut (ex: default).steel run steelconfig -all : construit tous les outputs exportables (ou tout le workspace selon policy).-debug : force le profil debug.-release : force le profil release.-clean : purge cache + artefacts (garde-fou conseillé : --yes).-j <n> : parallélisme du scheduler (ex: -j 16).-watch : mode dev (rebuild incrémental sur événements FS).-why <artifact|ref> : explique la chaîne de dépendances + la cause d’invalidation.-graph[=text|dot|json] : dump du DAG (format selon implémentation).-D KEY=VALUE : overrides de variables (répétable).Exemples :
steel build steelconf
steel fmt steelconf
steel doctor steelconf
steel graph
steel ninja
steel cache
steel toolchain
steel editor
steel editor-setup
steel help
steel version
check : valide la configuration sans exécuter la construction.
--profile <name>, --target <name>, --emit <path>resolve : résout et génère steel.log (équivalent fonctionnel à build steel côté configuration).
--emit <path>, --profile <name>, --target <name>Exemples :
check
check --profile debug
resolve --emit ./steel.log
print <scope> : affiche une vue résolue (format texte/JSON selon implémentation).
workspace, packages, targets, profiles, toolchains, vars, plans, exportsgraph [--format <text|dot|json>] : export du graphe (sans build).why <artifact|ref> : diagnostic « pourquoi ça rebuild ? » (alias possible de build steel -why).Exemples :
print workspace
print targets
graph --format dot
why vittec_driver::vittec
Steel expose une commande de décompilation orientée audit : elle permet de relire un artefact de configuration gelée .mff (ou un buildfile .muff) et de reconstituer une vue complète du projet : architecture, graphe, inputs/outputs, outils utilisés et paramètres.
decompile <project.mff> : affiche l’architecture du build (DAG), la liste des fichiers, les ports, les toolchains et l’ensemble des valeurs résolues.decompile <main.muff> : affiche la configuration et les règles telles qu’elles seront gelées (vue normalisée), sans exécuter la construction.Exemples :
steel decompile projet.mff
steel decompile src/module/main.muff
steel decompile projet.mff --format json
steel decompile projet.mff --graph dot
Un fichier .mff enregistre la configuration normalisée et la trace de compilation (inputs, globs développés, règles, outils, arguments, empreintes). Il garantit une configuration uniforme sur toutes les machines.
Un buildfile .muff (ou un ensemble de main.muff) peut également être décompilé sur n’importe quelle machine pour retrouver :
Limite : la reconstruction effective des binaires dépend de la disponibilité et de la compatibilité des toolchains (langages compilés, versions, targets). Steel fournit la description complète ; la machine doit disposer des compilateurs/outils compatibles pour reproduire les artefacts.
fmt [<file>] : formate un fichier Steel.clean : purge cache + artefacts (alias possible de build steel -clean).cache <cmd> : gestion du store/cache.
cache stats : statistiques.cache gc : nettoyage.doctor : diagnostic environnement (outils, droits, chemins, sandbox).Exemples :
fmt
clean
cache stats
cache gc
doctor
help [<cmd>] : aide globale ou par sous-commande.version : version de Steel.-v / --verbose : sortie détaillée.-q / --quiet : sortie réduite.Objectif : exécuter les commandes
build steel ...de façon identique sur toutes les plateformes. Les étapes ci-dessous installent uniquement les utilitaires de base et supposent questeeletvittesont disponibles dans le projet (ou dans lePATH).
sudo apt update
sudo apt install -y git ca-certificates curl
# build
build steel
build steel -all
build steel -debug
sudo dnf install -y git ca-certificates curl
build steel
build steel -release -j 16
sudo pacman -S --needed git ca-certificates curl
build steel -all
brew install git
build steel
build steel -watch
# Prérequis (au choix)
# winget install --id Git.Git -e
# winget install --id OpenJS.NodeJS.LTS -e # si ton projet en a besoin
# Exécution
build steel
build steel -all
build steel -why app.exe
Notes Windows :
build n’est pas une commande globale, exécuter depuis la racine du projet via ./steel (si présent) ou ajouter le binaire au PATH.--color never et --json pour l’outillage.sudo pkg install -y git ca_root_nss
build steel
build steel -graph=dot
doas pkg_add git
build steel
# pkgin (si configuré)
# sudo pkgin install git ca-certificates
build steel
pfexec pkg install developer/versioning/git
build steel
build steel -release
Conseils cross-OS :
./dist, ./.steel/cache) pour limiter les divergences.steel est un script, vérifier le bit exécutable (chmod +x steel) et utiliser des fins de lignes LF.steel print ... --json, steel graph --format ..., steel why ....Le format MUF est versionné. La version actuelle est v4.1.
!muf 4[tag name?] ... ...op arg1 arg2 ...;; ...assets/grammar/steel.ebnfExemple MUF v4.1 (blocs + ..) :
!muf 4
[workspace]
.set name "vitte"
.set root "."
..
[package hello]
.set kind "bin"
.set version "0.1.0"
.set src_dir "src"
..
[profile debug]
.set opt 0
.set debug 1
..
[default]
.set target "hello"
..
steel.log (apercu)mff 1
[host]
os "linux"
arch "x86_64"
..
profile "debug"
[target]
name "syntax_smoke"
kind "test"
..
[paths]
root "/path/to/repo"
dist "dist"
..
MUFFIN_FILE : chemin du fichier Steel.MUFFIN_PROFILE : profil par défaut.MUFFIN_EMIT : chemin par défaut de steel.log.MUFFIN_OFFLINE : active le mode offline.VITTE_BUILD : chemin explicite vers le driver build.PATH : s’assurer que steel et vitte sont accessibles (ou utiliser ./steel depuis la racine).steel ou steelconf : configuration principale.*.vitte : sources du projet.steel.log : configuration gelée et normalisée (artefact canonique) + trace outillable (graph, inputs, outils, empreintes), consommée par Vitte.*.muf : buildfiles (si le projet segmente la configuration par dossier/workspace).*.muff : configurations segmentées par répertoire (optionnel, générées ou maintenues selon le mode).steel/main.muff : point d’ancrage de configuration/build (nom configurable, optionnel).*.vo (Vitte compilation), *.va (Vitte librairie statique), *.o / *.obj (C/C++ objets), *.a / *.lib (archives statiques), *.so / *.dylib / *.dll (librairies partagées), *.exe (exécutables Windows).Voir COPYING.
Steel est le compilateur de configuration du build Vitte.
steelconf.steelconf.mub (Universal Binary Config), identique d’une machine à l’autre.steelconf.mub pour exécuter le build (DAG, cache, incrémental) de manière déterministe.L’objectif : un modèle unique, un workflow unique, un artefact unique.
Le build a besoin d’une configuration gelée (plus d’implicites) :
inputs → outputs).steelconf.mub est cette barrière contractuelle entre :
1) Configurer (freeze)
build steel
steelconfsteelconf.mub2) Construire (build)
build vitte
steelconf.mubbuild steel [flags]
Flags usuels :
-debug / -release-j <n> : parallélisme-D KEY=VALUE : override sans modifier steelconf-why <ref> : diagnostic d’invalidation-graph[=text|dot|json] : export graphe-watch : mode devsteel print <scope>
steel graph [--format <text|dot|json>]
steel why <ref>
steelconf (aperçu)Le fichier est orienté blocs, lisible, et conçu pour être résolu puis gelé.
!muf 4
[workspace]
.set name "vitte"
.set root "."
..
[profile debug]
.set opt 0
.set debug 1
..
[profile release]
.set opt 3
.set debug 0
..
[toolchain host]
.set cc "clang"
.set ar "llvm-ar"
.set ld "clang"
..
[target host]
.set profile "release"
;; étapes déclaratives (exemple minimal)
.set step_compile "tool=cc;inputs=src/**/*.c;outputs=build/**/*.o"
.set step_link "tool=ld;inputs=build/**/*.o;outputs=out/bin/vittec"
..
[default]
.set target "host"
..
steelconf : source de configuration (unique, à la racine).steelconf.mub : binaire universel de configuration gelée (artefact canonique).*.vo, *.va, exécutables, etc.steelconf.mub est conçu pour être portable (endianness/versions gérées par en-tête + schéma).--json/--dot, mais Vitte ne dépend que de steelconf.mub.Voir COPYING.
Steel est la configuration déclarative du build Vitte.
steelconf.target/ créé à la racine (artefacts + configuration résolue).target/ et exécute le build de manière déterministe.Le workflow est volontairement en 2 phases :
1) Configurer (freeze)
build steel
steelconftarget/2) Construire (build)
build vitte
target/target/Par défaut, Steel crée (ou met à jour) une arborescence standard :
target/
steel/
config.mub
graph.json
fingerprints.json
build/
<triple>/
<profile>/
obj/
gen/
out/
<triple>/
<profile>/
bin/
lib/
cache/
cas/
meta/
Notes :
target/steel/config.mub : binaire universel de configuration résolue (portable, versionné).target/steel/graph.json : export outillable du DAG (CI/IDE).target/steel/fingerprints.json : empreintes toolchain/policy pour l’invalidation.build steel [flags]
Flags usuels :
-debug / -release-j <n> : parallélisme-D KEY=VALUE : override sans modifier steelconf-why <ref> : diagnostic d’invalidation-graph[=text|dot|json] : export graphe-watch : mode devsteel print <scope>
steel graph [--format <text|dot|json>]
steel why <ref>
steelconf (aperçu)!muf 4
[workspace]
.set name "vitte"
.set root "."
.set target_dir "target"
..
[profile debug]
.set opt 0
.set debug 1
..
[profile release]
.set opt 3
.set debug 0
..
[toolchain host]
.set cc "clang"
.set ar "llvm-ar"
.set ld "clang"
..
[target host]
.set profile "release"
.set step_compile "tool=cc;inputs=src/**/*.c;outputs=target/build/${TRIPLE}/${PROFILE}/obj/**/*.o"
.set step_link "tool=ld;inputs=target/build/${TRIPLE}/${PROFILE}/obj/**/*.o;outputs=target/out/${TRIPLE}/${PROFILE}/bin/vittec"
..
[default]
.set target "host"
..
steelconf : source de configuration (unique).target/ : racine canonique de toutes les sorties (config résolue + build + cache + outputs).Voir COPYING.
Steel est la couche de configuration déclarative du build Vitte.
steelconf.target/ créé à la racine (config résolue + build + cache + outputs).target/steel/config.mub (binaire universel de configuration résolue).target/steel/config.mub et exécute le build de manière déterministe.1) Configurer (freeze)
build steel
steelconftarget/steel/config.mub2) Construire (build)
build vitte
target/steel/config.mubtarget/target/
steel/
config.mub
graph.json
fingerprints.json
build/
<triple>/
<profile>/
obj/
gen/
out/
<triple>/
<profile>/
bin/
lib/
cache/
cas/
meta/
Notes :
config.mub : binaire universel (portable + versionné).graph.json : export outillable du DAG (CI/IDE).fingerprints.json : empreintes toolchain/policy pour l’invalidation.build steel [flags]
Flags usuels :
-debug / -release-j <n> : parallélisme-D KEY=VALUE : override sans modifier steelconf-why <ref> : diagnostic d’invalidation-graph[=text|dot|json] : export graphe-watch : mode devsteel print <scope>
steel graph [--format <text|dot|json>]
steel why <ref>
steelconf (aperçu)!muf 4
[workspace]
.set name "vitte"
.set root "."
.set target_dir "target"
..
[profile debug]
.set opt 0
.set debug 1
..
[profile release]
.set opt 3
.set debug 0
..
[toolchain host]
.set cc "clang"
.set ar "llvm-ar"
.set ld "clang"
..
[target host]
.set profile "release"
.set step_compile "tool=cc;inputs=src/**/*.c;outputs=target/build/${TRIPLE}/${PROFILE}/obj/**/*.o"
.set step_link "tool=ld;inputs=target/build/${TRIPLE}/${PROFILE}/obj/**/*.o;outputs=target/out/${TRIPLE}/${PROFILE}/bin/vittec"
..
[default]
.set target "host"
..
steelconf : source de configuration (unique).target/ : racine canonique de toutes les sorties.target/steel/config.mub : contrat universel consommé par Vitte.Voir COPYING.