Utiliser Rust avec Buildroot (binaires pré-compilés)

Rust est un langage de programmation moderne, compilé, orienté vers la sécurité, le contrôle des accès mémoire et les accès concurrents. Ces performances sont comparables au C++.

Les fonctionnalités de Rust en font un bon candidat pour l'écriture de programmes pour des systèmes embarqués.

Dans cet article, nous construirons un système pour QEMU ARM Vexpress en utilisant Buildroot, puis nous ajouterons le support pour Rust en installant la chaîne de compilation pré-compilée dans l'environement Buildroot. Enfin, nous écrirons un programme de test en Rust, qui sera compilé puis exécuté sur le système généré.

Construction de l'Image Système

Premièrement, récupérez le code source de Buildroot et initialisez la configuration:

# Clonage du dépôt de Buildroot
git clone https://git.buildroot.net/buildroot
cd buildroot
# Configuration pour le système désiré
make O=$HOME/build/demo-rust/qemu/arm qemu_arm_vexpress_defconfig

Ensuite, modifiez la configuration:

make O=$HOME/build/demo-rust/qemu/arm menuconfig

Allez dans le menu "Toolchain" et sélectionnez "glibc" à la place de "uclibc" en tant que bibliothèque C. Sélectionnez aussi le support du C++. Sauvegardez votre configuration et sortez, puis démarrez la construction:

make O=$HOME/build/demo-rust/qemu/arm

Installation de la Chaîne de Compilation Rust Pré-compilée

Téléchargez les fichiers binaires du compilateur Rust pour la machine hôte (PC x86_64) et la bibliothèque standard compilée pour la cible "arm-unknown-linux-gnueabihf" (compatible avec la machine ARM Vexpress).

push dl
wget https://static.rust-lang.org/dist/rust-1.7.0-x86_64-unknown-linux-gnu.tar.gz
wget https://static.rust-lang.org/dist/rust-std-1.7.0-arm-unknown-linux-gnueabihf.tar.gz
popd

Préparez l'installation:

# Extraction des fichiers binaires du compilateur
mkdir -p $HOME/build/demo-rust/qemu/arm/build/host-rust-1.7.0
tar -xzf dl/rust-1.7.0-x86_64-unknown-linux-gnu.tar.gz \
    -C $HOME/build/demo-rust/qemu/arm/build/host-rust-1.7.0 \
    --strip-components=1
# Extraction de la version ARM de la bibliothèque standard
mkdir -p $HOME/build/demo-rust/qemu/arm/build/host-rust-std-1.7.0
tar -xzf dl/rust-std-1.7.0-arm-unknown-linux-gnueabihf.tar.gz \
    -C $HOME/build/demo-rust/qemu/arm/build/host-rust-std-1.7.0 \
    --strip-components=1

Ensuite, installez le compilateur:

pushd $HOME/build/demo-rust/qemu/arm/build/host-rust-1.7.0
./install.sh --prefix=$HOME/build/demo-rust/qemu/arm/host/usr \
             --disable-ldconfig
popd

Enfin, installez la bibliothèque standard:

pushd $HOME/build/demo-rust/qemu/arm/build/host-rust-std-1.7.0
./install.sh --prefix=$HOME/build/demo-rust/qemu/arm/host/usr \
             --disable-ldconfig
popd

Construction d'un Programme de Test

Il est temps de tester le compilateur. Créez un fichier source Rust pour le programme "Hello World":

mkdir -p $HOME/src/hello-rust
cat <<EOF > $HOME/src/hello-rust/main.rs
fn main() {
    println!("Hello World!");
}
EOF

Pour construire le programme de test hello-rust, exécutez:

export PATH=$PATH:$HOME/build/demo-rust/qemu/arm/host/usr/bin
$HOME/build/demo-rust/qemu/arm/host/usr/bin/rustc \
    --target=arm-unknown-linux-gnueabihf \
    -C linker=arm-buildroot-linux-gnueabihf-gcc \
    -o $HOME/build/demo-rust/qemu/arm/target/usr/bin/hello-rust \
    $HOME/src/hello-rust/main.rs

Notez que le triplet utilisé avec l'option --target est le même que celui de la bibliothèque standard téléchargée, mais est différent de celui de l'éditeur de lien utilisé.

Exécution du Programme de Test sur le Système

Reconstruisez l'image système:

make O=$HOME/build/demo-rust/qemu/arm

Maintenant, vous pouvez démarrer votre système avec QEMU:

qemu-system-arm \
    -M vexpress-a9 \
    -m 256 \
    -kernel $HOME/build/demo-rust/qemu/arm/images/zImage \
    -dtb $HOME/build/demo-rust/qemu/arm/images/vexpress-v2p-ca9.dtb \
    -drive file=$HOME/build/demo-rust/qemu/arm/images/rootfs.ext2,if=sd,format=raw \
    -append "console=ttyAMA0,115200 root=/dev/mmcblk0" \
    -serial stdio \
    -net nic,model=lan9118 \
    -net user

Connectez-vous en tant que "root" (pas de mot de passe) et exécutez le programme de test:

Welcome to Buildroot
buildroot login: root
# hello-rust
Hello World!

Félicitations! Vous venez d'exécuter votre premier programme en Rust sur un système Linux embarqué (emulé). N'hésitez pas à adapter l'exemple pour exécuter le programme sur un véritable système ARM, tel que le Raspberry Pi.