Introduction à Rust
Le langage de programmation Rust
est conçu pour être un langage sûr, concurrent et pratique.
Ce paquet est mis à jour sur un cycle de publication de six
semaines. Comme c'est un gros paquet long à construire et qu'il
n'est actuellement utilisé que par quelques paquets dans le livre,
les éditeurs de BLFS pensent qu'il ne devrait être mis à jour que
lorsque cela est nécessaire (soit pour corriger des problèmes, soit
pour permettre à une nouvelle version d'un paquet d'être
construite).
Comme avec tous les langages de programmation, rustc (le
compilateur rust) requiert un binaire à partir duquel s'amorcer. Il
téléchargera un binaire stage0 au début de la construction, donc
vous ne pouvez pas le compiler sans connexion internet.
Note
Bien que BLFS installe généralement ses logiciels dans
/usr
, lorsque vous mettez à jour
vers une nouvelle version de rust les anciennes bibliothèques de
/usr/lib/rustlib
resteront
présentes, avec divers condensats dans leur nom, mais seront
inutiles et gaspilleront de l'espace disque. Les éditeurs
recommandent de placer ces fichiers dans le répertoire
/opt
. En particulier, si vous avez
une raison pour reconstruire avec une configuration différente
(p. ex. pour utiliser le LLVM interne après avoir construit avec
un LLVM partagé, peut-être pour compiler des crates pour des
architectures non prises en charge par le LLVM de BLFS) il est
possible que l'installation laisse un programme cargo cassé. Dans une telle
situation, vous pouvez soit supprimer l'installation existante
avant, soit utiliser un préfixe différent, comme
/opt/rust-1.76.0-build2.
Si vous préférez, vous pouvez évidemment changer le préfixe en
/usr
.
Le système de construction rustbuild actuel utilisera tous les
processeurs, bien qu'il ne passe pas bien à l'échelle et utilise
souvent un seul cœur en attendant la compilation d'une
bibliothèque. Cependant, il peut presque être limité à un nombre de
cœurs donné en combinant l'option --jobs
<N>
(p. ex. « --jobs 4 » pour limiter à 4
processeurs) à chaque invocation de python3 x.py et en utilisant la variable
d'environnement CARGO_BUILD_JOBS=<N>
. Pour l'instant cela
n'est pas efficace lors du lancement de certains tests de rustc.
La version actuelle du crate rust num_cpus reconnais maintenant que
les cgroups peuvent être utilisés pour restreindre les processeurs
qui peuvent être utilisés. Donc si votre machine manque de DRAM
(par exemple s'il a moins de 2 Go de DRAM par cœur) cela peut
être une alternative à mettre des CPU hors-ligne. Consultez
la section intitulée « Utiliser les groups de contrôle Linux
pour limiter l'utilisation des ressources » pour apprendre
à utiliser un cgroup.
Pour l'instant Rust ne donne
aucune garantie de stabilité de son ABI.
Note
Rustc construit par défaut pour TOUTES les architectures
supportées, avec une copie embarquée de LLVM. Dans BLFS la
construction n'est utile que pour l'architecture X86. Si vous
voulez développer des crates rust, cette construction peut ne pas
vous satisfaire.
Les temps de construction de cette version lorsqu'elle est
répétée sur la même machine sont souvent assez cohérents, mais
comme avec toutes les compilations qui utilisent rustc il peut y avoir quelques
exceptions très lentes.
This package is known to build and work properly using an LFS 12.1
platform.
Informations sur le paquet
-
Téléchargement (HTTP) : https://static.rust-lang.org/dist/rustc-1.76.0-src.tar.xz
-
Téléchargement (FTP) :
-
Somme de contrôle MD5 : 14a8ac688b461a3127090cad513aee05
-
Taille du téléchargement : 155 Mo
-
Estimation de l'espace disque requis : 8,9 Go
(298 Mo installé) plus 6,4 Go si vous lancez les
tests
-
Estimation du temps de construction : 6,7 SBU (en
comptant le temps de téléchargement, plus 6,2 SBU pour
les tests, dans les deux cas avec parallélisme = 8)
Téléchargements supplémentaires
Dépendances de Rust
Requises
CMake-3.28.3 et cURL-8.6.0
Note
An Internet connection is needed for building this package.
Recommandées
libssh2-1.11.0 et LLVM-17.0.6 (construit avec
-DLLVM_LINK_LLVM_DYLIB=ON pour que rust puisse se lier au LLVM du
système au lieu de compiler la version intégrée)
Note
Si une dépendance recommandée n'est pas installée, une copie
embarquée dans l'archive des sources de Rustc sera construite et
utilisée.
Facultatives
GDB-14.1
(utilisé par la suite de tests s'il est présent), git-2.44.0 (requis par la
suite de tests), cranelift,
jemalloc,
libgccjit (consultez les explications des commandes de GCC-13.2.0) et
libgit2
Notes des auteurs : https://wiki.linuxfromscratch.org/blfs/wiki/rust
Installation de Rust
Note
Actuellement le compilateur rust produit des instructions SSE2
pour les systèmes x86 32 bits, ce qui casse le code généré
sur les systèmes 32 bits sans processeur capable d'utiliser
SSE2. Tous les modèles de processeur x86 vendus après 2004
devraient avoir SSE2. Exécutez lscpu | grep sse2 pour tester.
Si la sortie affiche quelque chose, votre CPU prend en charge
SSE2 et c'est bon. Sinon vous devrez essayer de construire ce
paquet sur un système compatible
SSE2 avec la correction suivante appliquée :
sed 's@pentium4@pentiumpro@' -i \
compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs
Puis copiez le dossier /opt/rustc-1.76.0
qui en résulte vers le
système sans SSE2. Mais ce changement est toujours en cours de
revue en amont et n'est pas testé par les rédacteurs de BLFS.
Pour installer dans le répertoire /opt
, supprimez le lien symbolique /opt/rustc
s'il existe et créez un nouveau
répertoire (c.-à-d. avec un nom différent si vous essayez une
construction différente de la même version). En tant qu'utilisateur
root
:
mkdir -pv /opt/rustc-1.76.0 &&
ln -svfn rustc-1.76.0 /opt/rustc
Note
Si vous avez installé plusieurs versions de Rust dans /opt
, pour changer de version, vous n'aurez
besoin que de changer le lien symbolique /opt/rustc
puis de lancer ldconfig.
Si vous lancez la suite de tests, appliquez un correctif pour
éviter que le système de construction de reconstruise inutilement
le compilateur :
patch -Np1 -i ../rustc-1.76.0-testsuite_fix-1.patch
Créez un fichier config.toml
correct
qui configurera la construction.
cat << EOF > config.toml
# see config.toml.example for more possible options
# See the 8.4 book for an old example using shipped LLVM
# e.g. if not installing clang, or using a version before 13.0
# Tell x.py the editors have reviewed the content of this file
# and updated it to follow the major changes of the building system,
# so x.py will not warn us to do such a review.
change-id = 118703
[llvm]
# by default, rust will build for a myriad of architectures
targets = "X86"
# When using system llvm prefer shared libraries
link-shared = true
[build]
# omit docs to save time and space (default is to build them)
docs = false
# install extended tools: cargo, clippy, etc
extended = true
# Do not query new versions of dependencies online.
locked-deps = true
# Specify which extended tools (those from the default install).
tools = ["cargo", "clippy", "rustdoc", "rustfmt"]
# Use the source code shipped in the tarball for the dependencies.
# The combination of this and the "locked-deps" entry avoids downloading
# many crates from Internet, and makes the Rustc build more stable.
vendor = true
[install]
prefix = "/opt/rustc-1.76.0"
docdir = "share/doc/rustc-1.76.0"
[rust]
channel = "stable"
description = "for BLFS 12.1"
# BLFS used to not install the FileCheck executable from llvm,
# so disabled codegen tests. The assembly tests rely on FileCheck
# and cannot easily be disabled, so those will anyway fail if
# FileCheck has not been installed.
#codegen-tests = false
# Enable the same optimizations as the official upstream build.
lto = "thin"
codegen-units = 1
[target.x86_64-unknown-linux-gnu]
# NB the output of llvm-config (i.e. help options) may be
# dumped to the screen when config.toml is parsed.
llvm-config = "/usr/bin/llvm-config"
[target.i686-unknown-linux-gnu]
# NB the output of llvm-config (i.e. help options) may be
# dumped to the screen when config.toml is parsed.
llvm-config = "/usr/bin/llvm-config"
EOF
Note
Les commandes python3
x.py peuvent afficher un message d'avertissement
qui se plaint de la sorte : « no codegen-backends config matched the requested
path to build a codegen backend
». De
plus, la « suggestion » fournie (add backend to codegen-backends in
config.toml
) ne l'empêchera pas. Cet avertissement est un
bogue et il
devrait être ignoré.
Compilez Rust en exécutant les
commandes suivantes :
{ [ ! -e /usr/include/libssh2.h ] ||
export LIBSSH2_SYS_USE_PKG_CONFIG=1; } &&
python3 x.py build
Note
La suite de tests générera des messages dans le journal systemd à propos de capture d'opcodes
invalides, et d'erreurs de segmentation. En soit il n'y a rien à
craindre, ce n'est qu'une manière pour le test de se faire
arrêter.
Pour lancer les tests (de nouveau avec tous les CPU disponibles),
exécutez :
SSL_CERT_DIR=/etc/ssl/certs \
python3 x.py test --verbose --no-fail-fast | tee rustc-testlog
Deux tests, tests/ui/issues/issue-21763.rs
et tests/debuginfo/regression-bad-location-list-67992.rs
sont connus pour échouer.
Si FileCeck de
LLVM n'a pas été installé, les 47
tests de la suite « assembly » échoueront.
Comme avec toutes les grosses suites de tests, d'autres tests
peuvent échouer sur certaines machines : s'il y a peu d'échecs
supplémentaires, cherchez les lignes commençant par
« failures: » dans le journal et regardez les lignes
au-dessus, surtout les lignes « stderr: ». Toute mention
de SIGSEGV ou signal 11 dans un test échoué peut s'avérer
problématique.
Si vous avez un autre test
qui rapporte un numéro de problème vous devriez rechercher ce
problème. Par exemple lorsque rustc >= 1.41.1 était construit
avec une version de sysllvm avant 10.0 le test pour le problème
69225 échouait https://github.com/rust-lang/rust/issues/69225
et cela devrait être vu comme un problème critique (ils ont publié
1.41.1 à cause de ça). La plupart des autres problèmes ne seront
pas critiques.
Donc, vous devriez déterminer le nombre d'échecs.
Le nombre de tests réussis et échoués peut être trouvé en
exécutant :
grep '^test result:' rustc-testlog |
awk '{sum1 += $4; sum2 += $6} END { print sum1 " passed; " sum2 " failed" }'
Les autres champs disponibles sont $8 pour ceux qui ont été ignorés
(c.-à-d. passés), $10 pour les tests « mesurés » et $12
pour ceux qui ont été « filtrés » mais ces deux derniers
sont probablement à 0.
Maintenant, en tant qu'utilisateur root
, installez le paquet :
Note
Si sudo ou
su est invoqué pour
passer à l'utilisateur root
,
assurez-vous que LIBSSH2_SYS_USE_PKG_CONFIG
est correctement passée
ou la commande suivante pourrait complètement reconstruire le
paquet. Pour sudo,
utilisez l'option >--preserve-env=LIBSSH2_SYS_USE_PKG_CONFIG
.
Pour su, n'utilisez
pas les options
-
ni --login
.
python3 x.py install
Le système de construction essaye d'installer certains fichiers
deux fois, et à la deuxième tentative il renomme le fichier
installé à la tentative précédente avec le suffixe .old
. En tant qu'utilisateur root
, supprimez ces fichiers :
find /opt/rustc-1.76.0 -name "*.old" -delete
Toujours en tant qu'utilisateur root
, créez un lien symbolique pour le fichier
de complétion Zsh au bon
endroit :
install -vdm755 /usr/share/zsh/site-functions &&
ln -sfv /opt/rustc/share/zsh/site-functions/_cargo \
/usr/share/zsh/site-functions
Enfin, supprimez la variable LIBSSH2_SYS_USE_PKG_CONFIG
:
unset LIBSSH2_SYS_USE_PKG_CONFIG
Explication des commandes
ln -svfn rustc-1.76.0
/opt/rustc : si ce n'est pas la première fois
que vous utilisez le lien symbolique /opt/rustc
, le réécrit en forçant et utilise le
drapeau « -n » pour éviter d'avoir des résultats bizarre
avec p. ex. ls -l.
targets = "X86"
: cela évite de
construire tous les compilateurs croisés disponibles (Aarch64,
MIPS, PowerPC, SystemZ, etc). Malheureusement, rust insiste pour
installer leurs fichiers sources sous /opt/rustc/lib/src
.
extended = true
: cela installe
plusieurs outils (spécifiés par l'entrée tools
) à côté de rustc.
tools = ["cargo", "clippy", "rustdoc",
"rustfmt"]
: ne construit que les outils du profil
« default » dans la commande binaire rustup qui sont recommandées pour
la plupart des utilisateurs. Les autres outils sont probablement
inutiles à moins d'utiliser d'anciens analyseurs de code ou
d'éditer la bibliothèque standard.
channel = "stable"
: cela
s'assure que seules les fonctionnalités stables peuvent être
utilisée, la valeur par défaut dans config.toml
est d'utiliser les fonctionnalités de
développement, qui ne sont pas appropriées pour une version
publique.
[target.x86_64-unknown-linux-gnu]
: la
syntaxe de config.toml
requiert une
entrée llvm-config
pour chaque cible
pour laquelle system-llvm doit être utilisé. Modifiez la cible en
[target.i686-unknown-linux-gnu]
si
vous construisez sur x86 32 bits. La section complète peut
être omise si vous souhaitez construire avec la version de llvm
incluse ou que vous n'avez pas clang, mais la construction qui en
résultera sera plus grande et prendra plus de temps.
export
LIBSSH2_SYS_USE_PKG_CONFIG=1 : permet à
cargo de se lier à la
libssh2 du système.
SSL_CERT_DIR=/etc/ssl/certs
:
contourne un problème qui cause des échecs des tests avec la
structure du magasin de certificats d'autorités de certification
utilisée par make-ca-1.13.
--verbose
: ce
paramètre peut parfois fournir plus d'informations sur un test qui
échoue.
--no-fail-fast
: ce
paramètre s'assure que la suite de tests ne s'arrêtera pas après la
première erreur.