Blog des Gens Compliqués

Cross-compilation en Rust

21/08/2024 12:48:25+02:00|Par DkVZ
3 minutes de lecture (facile)

Ah ouais elle va être bien cette brève, on voit que je suis hyper inspiré ces derniers temps.

De Linux vers Windows

Imaginons que je souhaite compiler pour Windows depuis ma machine Linux, ou vers un "Linux générique" de sorte à ce qu'on ne se retrouve pas avec un binaire qui ne fonctionne que sur ma version hyper spécifique et chelou de Manjaro.

Ben en fait c'est pas si compliqué. C'est plus compliqué qu'en Go ceci dit.

Par exemple, pour construire pour Windows depuis Linux, on installe d'abord la cible qui va bien avec rustup:

rustup target add x86_64-pc-windows-gnu

Ensuite on compile:

cargo build --release --target x86_64-pc-windows-gnu

Et là vous devriez chopper une vielle erreur du style linker `x86_64-w64-mingw32-gcc` not found.

Moi j'ai juste dû installer Mingw via le paquet de ma distrib qui s'appelle mingw-w64 et c'était reglé.

De Linux vers Linux générique

La cible s'appelle x86_64-unknown-linux-musl et permet de compiler en évitant de lier dynamiquement des librairies, ce qui pourrait générer un binaire qui ne fonctionne pas sur certaines (entendre la plupart) des distributions et leurs différentes versions.

A noter que ça ne fonctionne pas toujours parce que certaines CAISSES semblent utiliser des liens dynamiques qui ne peuvent pas être évités. Si ça vous arrive, il faudra malheureusement trouver une crate alternative.

On installe donc la cible:
rustup target add x86_64-unknown-linux-musl

Et normalement on peut de suite compiler et ça fonctionne:

cargo build --release --target x86_64-unknown-linux-musl

De Windows vers Linux

Pour compiler de Windows à Linux, j'utilise le compilateur GNU comme mentionné dans cet article et n'ai pas testé le compilateur par défaut qui est celui de Visual Studio.

Je suppose aussi que vous avez installé Rust avec rustup en installation locale, c'est-à-dire dans le répertoire de votre utilisateur en cours.

La première étape consiste à installer la cible "Linux inconnu":

rustup target add x86_64-unknown-linux-musl

Et là ça ne suffit pas pour pouvoir compiler. Il va falloir se rendre dans le répertoire C:\Users\<VOTRE_USER>\.cargo et créer un fichier "config.toml" avec ceci dedans:

[target.x86_64-unknown-linux-musl]
linker = "rust-lld"

Notepad ouvert avec le texte mentionné plus haut dans le bon répertoire

Si on essaye de compiler maintenant il y aura tout de même une erreur de dll introuvable. Pour la résoudre il est nécessaire d'ajouter un répertoire spécifique de rustup au PATH.

Le moyen "interface graphique" d'éditer la variable d'environnement PATH consiste à cliquer droit sur "Ce PC" (j'espère que vous voyez de quoi je parle lul) puis ouvrir les propriétés, il devrait y avoir un lien quelque part vers les propriétés avancées du système. Ou un truc du genre.

Dans cette fenêtre, l'onglet "Avancé" présente un bouton "Variables d'environnement".

Il s'agit ensuite d'éditer la variable PATH enregistrée pour votre utilisateur, et poser ce chemin après le chemin vers .cargo\bin (important):

C:\Users\<VOTRE_USER>\.rustup\toolchains\stable-x86_64-pc-windows-gnu\bin

Le bouton Variables d'Environnement en surbrillance avec la fenêtre qu'il ouvre et la nouvelle valeur ajoutée

Le nom exact de votre toolchain pourrait être différent si vous avez choisi un autre canal que le "stable" lors de l'installation.

Reste à cliquer OK, et tester en ouvrant une nouvelle invite de commande (les invites déjà ouvertes auront encore l'ancien PATH).

Vous devriez désormais être en mesure de compiler pour Linux:

cargo build --release --target "x86_64-unknown-linux-musl"

Et pour les autres architectures?

Je vous dis bonne chance.

Commentaires

Il faut JavaScript activé pour écrire des commentaires ici

Ajouter un commentaire

Votre commentaire a été ajouté
(enfin, je pense)