La suite di test verifica questi punti usando come oracolo il Cargo della toolchain stessa (tests/compat.rs, il corpus QA della specifica). Gli identificatori dei requisiti (COMP-...) si riferiscono alla specifica; dove questa implementazione se ne discosta, Conformità spiega come.
Invariato
| Che cosa | Comportamento |
|---|---|
| Argomenti | passati a Cargo così come sono, tranne un +toolchain iniziale, che QuickRust consuma (COMP-001, COMP-051) |
| Flag e comandi sconosciuti | inoltrati; è Cargo a decidere se sono validi e a risolvere i sottocomandi esterni (COMP-002, COMP-003) |
Alias, selezione dei pacchetti, --manifest-path, profili, target, feature, comportamento del lockfile |
quelli di Cargo (COMP-008) |
| Ambiente | ogni variabile passa a Cargo; QuickRust aggiunge le variabili elencate in Ambiente e non riscrive mai RUSTFLAGS, CARGO_INCREMENTAL (a meno che sia impostata una politica incremental.* e l’utente non l’abbia impostata), né le impostazioni di proxy o di registry dell’utente (COMP-040, COMP-041) |
| Jobserver | CARGO_MAKEFLAGS e i descrittori del jobserver vengono ereditati (COMP-042) |
| Exit status | quello di Cargo, ogni volta che Cargo è stato eseguito; un segnale di terminazione viene rilanciato (COMP-006) |
--message-format=json |
l’output su stdout è ciò che stampa il Cargo delegato; QuickRust lo legge, quando stdout non è un terminale, mentre lo inoltra senza modifiche (COMP-005) |
| Configurazione di Cargo | mai interpretata da QuickRust per l’esecuzione; ne legge un sottoinsieme (chiavi dei profili, build.rustc-wrapper, alias, directory di target) solo per decidere le proprie impostazioni e per l’analisi (COMP-050, COMP-052) |
cargo clean |
il clean di Cargo, sulla directory di target del workspace (COMP-009) |
qrust upstream <args> |
il Cargo della toolchain senza impostazioni della fast mode, senza wrapper, senza rendering e senza record (COMP-013) |
Aggiunto o cambiato
| Che cosa | Comportamento |
|---|---|
| Impostazioni di build | in fast mode, le impostazioni di Fast mode; in modalità compat, nessuna |
| Output sul terminale | in un terminale, è QuickRust a presentare l’output (Output); pipe, -v, -q, --message-format, --color, la modalità compat e output = "cargo" lasciano intatto l’output di Cargo (COMP-007) |
| Toolchain | QuickRust installa e seleziona da sé le toolchain, nell’ordine di rustup (+toolchain, RUSTUP_TOOLCHAIN, file di toolchain, predefinita); rustup non viene mai chiamato e i suoi override per directory non hanno equivalente (COMP-012, COMP-020) |
| Cargo home | ~/.qrust/cargo, non ~/.cargo; ~/.cargo/config.toml viene comunque letto da Cargo per i progetti sotto la home directory, come qualsiasi file di configurazione in una directory genitore |
| Directory di target | ogni workspace compila in ~/.qrust/cache/builds/<name>-<id>/, mai in target/ nel progetto (vedi sotto) |
cargo install, cargo uninstall |
quelli di QuickRust: il resolver di Cargo sceglie la release, QuickRust la compila come qualsiasi build e mette i suoi binari in ~/.qrust/bin (o --root), mai sopra i programmi di QuickRust stesso o quelli di un altro pacchetto senza --force (Comandi) |
RUSTC_WRAPPER |
impostato a qrust-rustc-wrapper per i comandi di build registrati; un wrapper configurato dall’utente gira al suo interno |
CARGO |
impostato al cargo di QuickRust (vedi sotto) |
Catena dei wrapper
Per un comando di build registrato, una compilazione passa attraverso:
qrust-rustc-wrapper -> the user's RUSTC_WRAPPER (or sccache chained by cache.provider) -> RUSTC_WORKSPACE_WRAPPER (applied by Cargo) -> rustc
Un wrapper configurato dall’utente (RUSTC_WRAPPER, CARGO_BUILD_RUSTC_WRAPPER, build.rustc-wrapper) non viene mai rimosso né saltato: se non riesce ad avviarsi, la build fallisce come con il Cargo della toolchain. Solo sccache concatenato tramite cache.provider = "sccache" può essere saltato, con cache.fail = "open".
Invocazioni annidate
Un Cargo avviato all’interno di una sessione QuickRust (da uno script di build, da un sottocomando esterno come Clippy, nextest o cargo llvm-cov, da un xtask, da un test) raggiunge QuickRust:
- tramite
PATH, dove~/.qrust/bin/cargoviene per primo; - tramite
CARGO, che Cargo passa a tutto ciò che avvia. QuickRust esegue un hard link delcargodella toolchain chiamato.qrust-engine, conargv[0]eCARGOimpostati a~/.qrust/bin/cargo, in modo che Cargo passi oltre ilcargodi QuickRust (COMP-030). Su Windows, che non ha unargv[0]separato, l’help di Cargo nomina.qrust-engine.exe.
Un’invocazione annidata è una sessione QuickRust a sé, collegata alla sessione genitore tramite QRUST_SESSION_ID (COMP-031), con la stessa toolchain (RUSTUP_TOOLCHAIN). I suoi eventi di rustc vengono registrati insieme a quelli della sessione genitore. compatibility.nested-cargo = "upstream" (QRUST_NESTED=upstream) passa le invocazioni annidate direttamente al Cargo della toolchain (COMP-032).
Con qrust upstream e con una toolchain collegata, Cargo gira come sé stesso e le build annidate tramite $CARGO raggiungono direttamente quel Cargo; le loro compilazioni vengono comunque osservate quando il comando esterno ha impostato RUSTC_WRAPPER.
Una toolchain collegata il cui cargo è QuickRust stesso viene rifiutata con exit status 2 (COMP-022).
Directory di target
| L’utente ha scelto | Directory di target |
|---|---|
--target-dir DIR |
DIR, usata così com’è |
--config build.target-dir=DIR sulla riga di comando |
DIR, usata così com’è |
CARGO_TARGET_DIR o CARGO_BUILD_TARGET_DIR nell’ambiente |
il suo valore, usato così com’è (a meno che un QuickRust esterno l’abbia impostato per un altro workspace) |
build.target-dir in un file di configurazione di Cargo |
sovrascritta |
| niente | ~/.qrust/cache/builds/<name>-<id>/, passata a Cargo e a ogni strumento sotto di esso tramite CARGO_TARGET_DIR e CARGO_BUILD_BUILD_DIR |
Il workspace è quello che cargo locate-project --workspace nomina per la directory in cui parte il comando (dopo -C e --manifest-path). cargo metadata riporta la directory, e qrust path la stampa. Una directory scelta dall’utente non viene mai gestita né rimossa dalla cache di QuickRust.
Scritture
QuickRust scrive in un repository solo su richiesta (File). Lo stato risiede in ~/.qrust.
Una build non fallisce mai perché QuickRust non è riuscito a registrarla o ad analizzarla: il fallimento è un WARN, e lo stato di Cargo resta valido, a meno che measurement.strict = true.
Differenze tra piattaforme
Vedi Piattaforme.