elois

Cross-compiler Dunitrust pour arm

Il y a deux Méthodes différentes pour cross-compiler Dunistrust pour arm :

Table des matières

  1. Méthode 1 : Cross-compiler proprement pour armv6 via docker
  2. Méthode 2 : Cross-compiler manuellement pour armv7

La 1ère méthode a l'inconvénient de ne pas bénéficier des optimisations de l'architecture armv7. Elle est toutefois plus propre, c'est la méthode que j'adopterai pour les livrables officiels.

La 2ème méthode à l'inconvénient de compiler Dunitrust sans OpenSSL, le noeud duniter qui en résulte ne pourra donc cas conatcter des endpoints qui exigent une couche TLS.

Méthode 1 : Cross-compiler proprement pour armv6 via docker

Tout d'abord installez docker, pour cela suivez la documentation officielle :

Ensuite cloner le dépot Dunitrust puis placez vous a sa racine :

git clone https://git.duniter.org/nodes/rust/duniter-rs.git
cd duniter-rs

Enfin lancez l'image docker qui se chargera de compiler Dunistrust pour armv6 :

sudo docker run -it --rm -v $(pwd):/source dlecan/rust-crosscompiler-arm:stable

A noter que cette image docker permet de compiler n'importe quel programme rust, elle n'est pas spécifique a Duniter.
Vous pouvez retrouver les sources de cette image et le manuel expliquant les différentes options sur le dépot github : https://github.com/dlecan/rust-crosscompiler-arm

Une fois la compilation terminée, votre binaire final est le fichier durs qui se trouve dans target/arm-unknown-linux-gnueabihf/release.
C'est un "binaire tout en un" vous pouvez le copier n'importe ou sur votre raspberry pi puis vous n'avez plus qu'a l'éxécuter dans un terminal.

Méthode 2 : Cross-compiler manuellement pour armv7

Fonctionne sur ubuntu 16.04. Vous devez avoir rust d'installé sur votre machine, si tel n'est pas le cas installez Rust en une seule ligne de commande :

curl https://sh.rustup.rs -sSf | sh

Une fois que vous avez Rust, ajoutez la toolchain arm :

rustup target add armv7-unknown-linux-gnueabihf

Installez les paquets debian suivants :

sudo apt-get install gcc-4.7-multilib-arm-linux-gnueabihf crossbuild-essential-armhf

Indiquez a cargo quel compilateur il doit utiliser lorsqu'il compilera avec la toolchain arm, pour cela créez le fichier ~/.cargo/config et collez y le contenu suivant :

[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc-4.7"

Rendez vous a la racine du dépot de Dunistrust puis compilez avec la toolchain arm :

cd duniter-rs
cargo build --target=armv7-unknown-linux-gnueabihf --no-default-features --release

Si votre terminal vous dit que la commande cargo n'existe pas, c'est que vous devez ajouter le chemin ~/.cargo/bin à votre variable d'environnement PATH :

export PATH="$HOME/.cargo/bin:$PATH"

Explication des options de la commande de compilation :

Votre binaire final est le fichier durs qui se trouve dans target/armv7-unknown-linux-gnueabihf/release. C'est un "binaire tout en un" vous pouvez le copier n'importe ou sur votre raspberry pi puis vous n'avez plus qu'a l'éxécuter dans un terminal.