Commit c26fe792 authored by Éloïs's avatar Éloïs

tuto : installer son env rust

parent 8138c804
......@@ -4,7 +4,7 @@ Date: 2018-05-04
Slug: installer-son-environnement-rust
Authors: elois
Dans ce tutoriel nous allons voir comment installer un enviromment [Rust](https://www.rust-lang.org) complet.
Dans ce tutoriel nous allons voir comment installer un environnement [Rust](https://www.rust-lang.org) complet.
Cela vous servira pour vos propres projets Rust, ou pour contribuer a Duniter-rs, ou pour faire du binding NodeJS-Rust.
## Installation de la toolchain stable
......@@ -17,25 +17,25 @@ Ajoutez ~/.cargo/bin a votre variable d'environnement PATH :
export PATH="$HOME/.cargo/bin:$PATH"
Je vous recommande vivement d'ajouter cette ligne dans le fichier de configuration de votre terminal pour ne pas avoir a la recopier a chaque fois, si vous ne savez pas de quoi je parle alors vous utilisez très probablement le shelle par défaut (bash) et le fichier auquel vous devez ajouter cette ligne est `~/.bashrc`
Je vous recommande vivement d'ajouter cette ligne dans le fichier de configuration de votre terminal pour ne pas avoir a la recopier a chaque fois, si vous ne savez pas de quoi je parle alors vous utilisez très probablement le shell par défaut (bash) et le fichier auquel vous devez ajouter cette ligne est `~/.bashrc`
Vous aurez aussi besoin d'un environnement de développement intégré, je vous recommande vscode car il supporte a la fois NodeJs et Rust :)
Vous trouverez les instructions d'installation de vscode pour votre système sur internet.
# Fmt et clippy
Je vous recommance vivement d'installer la toolchain nightly de Rust pour pouvoir bénéficier des indispensables formateur et linter :
Je vous recommande vivement d'installer la toolchain nightly de Rust pour pouvoir bénéficier des indispensables formateur et linter :
rustup install nightly
cargo +nightly install rustfmt-nightly
cargo +nightly install clippy
Cargo est l'équivalent de npm pour Rust, il vas chercher toutes les dépendances des crates que vous installez. Oui en Rust on ne parle pas de modules mais de crates. Une crates désigne a la fois un module ou une librairie.
Cette dernière étape peut etre longue car cargo vas télécharger les sources de fmt et clippy et les compiler localement, or la compilation en Rust est très longue !
Cette dernière étape peut être longue car cargo vas télécharger les sources de fmt et clippy et les compiler localement, or la compilation en Rust est très longue !
## Vscode
Rust étant un language tès récent, il n'a pas d'Environnement de Développement Intégré (IDE) dédié.
Rust étant un langage très récent, il n'a pas d'Environnement de Développement Intégré (IDE) dédié.
Heureusement, plusieurs IDE existants intègrent Rust via des plugins, nous vous recommandons vscode.
https://code.visualstudio.com/docs/setup/linux#_debian-and-ubuntu-based-distributions
......@@ -47,18 +47,18 @@ Rust (rls)
# RLS et LLDB
Il reste encore a installer RLS (Rust Language Server) et LLDB (déboggeur), le 1er permet de compiler votre code a la volée pour sousligner en rouge les erreurs directement dans l'editeur de vscode, le second est un déboggeur.
Il reste encore a installer RLS (Rust Language Server) et LLDB (debugger), le 1er permet de compiler votre code a la volée pour souligner en rouge les erreurs directement dans l’éditeur de vscode, le second est un débogueur.
Instructions d'installation de LLDB : https://github.com/vadimcn/vscode-lldb/wiki/Installing-on-Linux
Ensuite relancez vscode (après avoir installer les plugins indiquez si dessus), il devrait vous proposer spontannément d'installer RLS, dites oui.
Ensuite relancez vscode (après avoir installer les plugins indiquez si dessus), il devrait vous proposer spontanément d'installer RLS, dites oui.
Si cela échoue pour RLS, vous devrez l'installer manuellement avec la commande suivante :
rustup component add rls-preview rust-analysis rust-src
# Paquets supplémentaires pour compiler duniter-rs
Bien que cela soit de plus en plus rare, certaines crates rust dépendent encore de bibliothèques C/C++ et celles-ci doivent etre installer sur votre ordinateur lors de la compilation. Sous Debian et dérivés, vous devez avoir `pkg-config` d'installé car le compilateur rust s'en sert pour trouver les bibliothèques C/C++ installés sur votre système.
Bien que cela soit de plus en plus rare, certaines crates rust dépendent encore de bibliothèques C/C++ et celles-ci doivent être installer sur votre ordinateur lors de la compilation. Sous Debian et dérivés, vous devez avoir `pkg-config` d'installé car le compilateur rust s'en sert pour trouver les bibliothèques C/C++ installés sur votre système.
sudo apt-get install pkg-config
......@@ -71,7 +71,68 @@ Dans le cas de Duniter-rs vous aurez besoin de la bibliothèque openssl pour dé
mkdir hello-world
cd hello-world
cargo init --bin
cargo build
cargo run
(en cours de rédaction...)
L'option `--bin` indique que vous souhaitez créer un binaire, par défaut c'est une bibliothèque qui sera créée.
Vous devriez avoir le contenu suivant dans le dossier hello-world :
$ tree
.
├── Cargo.toml
├── src
│ └── main.rs
C'est le contenu minimal de tout projets binaire, le code source ce trouve dans `main.rs`.
Tout projets Rust (binaire ou bibliothèque) doit contenir un fichier nommé Cargo.toml a la racine du projet, c'est on quelque sorte l'équivalent du `package.json` de NodeJs.
Le fichier `main.rs` contient déjà par défaut un code permettant de réaliser le traditionnel "Hello, world!" :
fn main() {
println!("Hello, world!");
}
Cette syntaxe doit vous rappeler furieusement le C/C++ pour ceux qui connaissent, et c'est bien normal car Rust est conçu pour être l'un des successeurs potentiel du C++. On peut toutefois déjà noter trois différences majeures avec le C/C++ :
1. La fonction main() de prend aucun paramètre en entrée. Les arguments cli sont capturés d'une autre façon via une utilisation de la bibliothèque standard.
2. println! n'est pas une fonction, c'est une macro. En Rust toutes les macros sont de la forme `macro_name!(params)`, c'est donc au `!` qu'on les reconnaît. Alors pourquoi une macro juste pour printer une chaîne de caractères ? Et bien parce que en Rust toute fonction doit avoir a un nombre fini de paramètres et chaque paramètre doit avoir un type explicitement défini. Pour outrepasser cette limite on utilise une macro qui vas créer la fonction souhaitée lors de la compilation.
3. La fonction main() ne retourne aucune valeur, lorsque votre programme se termine, Rust envoi par défaut le code EXIT_SUCCESS a l'OS. Pour interrompre votre programme en envoyant un autre code de sortie, il existe des macro comme par exemple `panic!(err_message)`
Avant de modifier le code, assurez vous déjà que le code par éfaut compile correctement :
$ cargo build
Compiling hello-world v0.1.0 (file:///home/elois/dev/hello-world)
Finished dev [unoptimized + debuginfo] target(s) in 0.91 secs
Si vous obtenez bien un `Finished dev [unoptimized + debuginfo] target(s) in x.xx secs`, félicitations vous venez de compiler votre premier programme Rust :)
Si vous obtenez une erreur c'est que votre environnement Rust n'est pas correctement installé, dans ce cas je vous invite a tout désinstaller et a reprendre ce tutoriel de zéro.
> Chez moi ça compile, Comment j’exécute mon programme maintenant ?
Comme ça :
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello-world`
Hello, world!
Comme indiqué, cargo run exécute votre binaire qui se trouve en réalité dans `target/debug/`
Il existe plusieurs profils de compilation, et vous pouvez même créer les vôtres, deux profils pré-configurer sont a connaître absolument :
1. le profil `debug` : c'est le profil par défaut, le compilateur n'effectue aucune optimisation et intègre au binaire les points d'entrée permettant a un débogueur de fonctionner.
2. Le profil `release` : Le compilateur effectue le maximum d'optimisation possibles et n'intègre aucun point d'entrée pour le débogueur.
Rust est réputé pour être ultra-rapide, c'est en grande partie grâce aux optimisations poussés effectués lors d'une compilation en profil `release`, mais réaliser ces optimisations demande du temps, la compilation en mode `release` est donc bien plus longue qu'en mode `debug`.
pour compiler en mode `release` :
cargo build --release
Votre binaire final se trouve alors dans `target/release/`.
Pour aller plus loin, je vous invite a lire l'excellent tutoriel de Guillaume Gomez : https://blog.guillaume-gomez.fr/Rust
Et si vous savez lire l'anglais, la référence des références que vous devez absolument lire c'est évidemment le sacro-sain [Rust Book](https://doc.rust-lang.org/book/).
Le Rust Book par vraiment de zéro et se lit très facilement même avec un faible niveau en anglais.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment