Utiliser Cargo avec Buildroot (construction complète)

Cargo est le gestionnaire de paquets officiel pour Rust. Il téléchargera les dépendances d'un projet Rust et compilera le tout. L'ajout du support de Cargo dans Buildroot permettra à l'utilisateur final de compiler facilement des programmes pour un système embarqué.

Nous supposons qu'un environement basé sur Buildroot a déjà été mis en place comme cela a précédemment été décrit.

Construction de Cargo

Récupérez le code source de la dernière version (0.9.0) et décompressez le:

git clone --recursive https://github.com/rust-lang/cargo \
    -b 0.9.0 \
    $HOME/build/demo-rust/qemu/arm/build/host-cargo-0.9.0

Cargo dépend de OpenSSL et de CMake (et de Python, mais un interpréteur Python est supposé être déjà installé sur la machine de développement):

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

Il dépend aussi de la version hôte de libssh2, qui n'est malheureusement pas disponible sous Buildroot. Cependant il est simple de l'ajouter:

echo '$(eval $(host-autotools-package))' >> package/libssh2/libssh2.mk
make O=$HOME/build/demo-rust/qemu/arm host-libssh2

Configurez et lancez la construction:

export PATH=$HOME/build/demo-rust/qemu/arm/host/usr/bin:$PATH
export PKG_CONFIG=$HOME/build/demo-rust/qemu/arm/host/usr/bin/pkgconf
export LIBRARY_PATH=$HOME/build/demo-rust/qemu/arm/host/usr/lib
pushd $HOME/build/demo-rust/qemu/arm/build/host-cargo-0.9.0
./configure --prefix=$HOME/build/demo-rust/qemu/arm/host/usr \
            --localstatedir=$HOME/build/demo-rust/qemu/arm/host/var/lib \
            --sysconfdir=$HOME/build/demo-rust/qemu/arm/host/etc
make
make install
popd

Notez que Cargo se construit à partir d'une autre version de lui-même, comme on peut le voir dans le journal de construction:

[...]
curl -o target/dl/cargo-nightly-x86_64-unknown-linux-gnu.tar.gz \
     https://static.rust-lang.org/cargo-dist/2016-01-31/cargo-nightly-x86_64-unknown-linux-gnu.tar.gz
[...]

Test de Cargo

Il est temps de tester Cargo. Créez un nouveau projet (ou "crate") pour le programme "Hello World":

mkdir -p $HOME/src
pushd $HOME/src
cargo new --bin hello-rust

Afin de d'effectuer une compilation croisée d'un projet, quelques paramètres doivent figurer dans le fichier de configuration de Cargo. Créez le fichier ainsi:

mkdir .cargo
cat <<EOF > .cargo/config
[target.arm-buildroot-linux-gnueabihf]
linker = "arm-buildroot-linux-gnueabihf-gcc"
EOF

Cargo est configuré pour utiliser l'éditeur de liens de la chaîne de compilation générée par Buildroot, lorsque la cible choisie est "arm-buildroot-linux-gnueabihf".

Indiquez au compilateur Rust l'endroit où trouver les spéficiations de la cible:

export RUST_TARGET_PATH=$HOME/build/demo-rust/qemu/arm/host/etc/rustc

Maintenant, lancez la construction du projet:

cargo build \
      --target=arm-buildroot-linux-gnueabihf \
      --release

Une fois la construction finie, vérifiez que le fichier exécutable généré correspond bien à une architecture ARM:

$ file -b target/arm-buildroot-linux-gnueabihf/release/hello-rust
ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 4.5.0, not stripped

Enfin, copiez le fichier binaire dans le système de fichier de la cible:

cp -a target/arm-buildroot-linux-gnueabihf/release/hello-rust \
   $HOME/build/demo-rust/qemu/arm/target/usr/bin

Pour plus de détails sur Cargo et la création de projets, veuillez vous référer à la documentation de Cargo.