Voir le flux RSS

tails

[Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible

Noter ce billet
par , 23/05/2020 à 13h02 (120 Affichages)
Il peut paraître difficile de créer une application Rust avec Gtk qui soit entièrement autonome sous Windows. En me basant sur la méthode d'installation de GTK sur le site officiel, et sur ce ticket Github, je vais ici essayer de répondre simplement à la problématique.

Prérequis

Pas de prérequis particulier au niveau du langage, le but ici étant juste d'essayer d'empaqueter un programme minimal et fonctionnel.
Toutefois, si vous le souhaitez, vous pouvez regarder l'introduction minimaliste que j'ai rédigée sur Rust+Gtk+Relm.

Programmes à installer

  1. Msys2: utilitaire permettant notamment la compilation de programmes un peu comme sous Linux. La toolchain Gnu de Rust, qui sera utilisée, est basée sur Mingw. N'oubliez pas de vérifier l'architecture cible du binaire (i686, x86_64). Vérifiez également que le chemin C:\msys64\mingw64\bin (à adapter selon votre architecture et votre dossier d'installation de msys) figure dans les premiers résultats de votre environement PATH,
  2. Rustup : l'ensemble des outils de compilation pour Rust. Attention d'installer la version GNU, et non la version MSVC. Il faut donc choisir de personnaliser l'installation et demander la version x86_64-pc-windows-gnu (architecture 64 bit) ou i686-pc-windows-gnu (architecture 32 bit). Sinon il est encore possible d'ajouter la toolchain correspondante et de la déclarer comme version par défaut : je vous laisse essayer de vous renseigner pour ce cas précis,
  3. Git : pour pouvoir cloner le projet testé dans ce billet. Un terminal Bash est aussi fourni avec ce projet: nous l'utiliserons différentes tâches.


Installation des paquets de msys2 et Gtk

Une fois Msys installé, il faut dans un 1er temps installer les paquets systèmes:
Une fois cela finit, il faut fermer le terminal, le relancer et exécuter de nouveau la commande. Recommencer le processus jusqu'à ce qu'il n'y ait plus de mise à jour à installer.

Puis installer Gtk:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
pacman -S mingw-w64-x86_64-gtk3
Eventuellement, Glade:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
pacman -S mingw-w64-x86_64-glade
pour les projets qui pourraient en avoir besoin.

Et enfin, les outils tels que gcc, necessaires pour la compilation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
pacman -S mingw-w64-x86_64-toolchain base-devel

Il faut fixer la variable système globallement, et non pas pour votre propre compte, GTK_LIB_DIR au dossier (à adapter) C:\msys64\mingw64\lib.

Compilation du projet

Veuillez cloner le projet suivant (une calculatrice vraiment minimale) avec le terminal git bash, dans le dossier de votre choix
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
cd <dossier_de_choix>
git clone https://github.com/loloof64/SimpleCalculator.git
cd SimpleCalculator
Veuillez compiler le projet en mode release, toujours dans le terminal git bash (ne serait-ce que parce que la commande cargo est directement reconnue) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
cargo build --release
Si tout se passe bien, le programme simple-calc.exe se trouve dans le sous-dossier target/release.

Veuillez noter que, pour éviter que le programme ouvre un terminal lors du lancement, l'attribut #![windows_subsystem = "windows"] a été ajouté au début du fichier source main.rs.

Nous pouvons donc lister l'ensemble des dll nécessaires pour le programme (j'ai filtré le résultat pour n'inclure que celles de mingw64):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 ldd target/release/simple-calc.exe | grep mingw64
        libcairo-2.dll => /c/msys64/mingw64/bin/libcairo-2.dll (0x68dc0000)
        libgdk_pixbuf-2.0-0.dll => /c/msys64/mingw64/bin/libgdk_pixbuf-2.0-0.dll (0x6f740000)
        libgio-2.0-0.dll => /c/msys64/mingw64/bin/libgio-2.0-0.dll (0x613c0000)
        libgdk-3-0.dll => /c/msys64/mingw64/bin/libgdk-3-0.dll (0x6c1c0000)
        libgobject-2.0-0.dll => /c/msys64/mingw64/bin/libgobject-2.0-0.dll (0x67f00000)
        libglib-2.0-0.dll => /c/msys64/mingw64/bin/libglib-2.0-0.dll (0x649c0000)
        libgtk-3-0.dll => /c/msys64/mingw64/bin/libgtk-3-0.dll (0x67700000)
        libpango-1.0-0.dll => /c/msys64/mingw64/bin/libpango-1.0-0.dll (0x6d240000)
        libgmodule-2.0-0.dll => /c/msys64/mingw64/bin/libgmodule-2.0-0.dll (0x66c40000)
        libintl-8.dll => /mingw64/bin/libintl-8.dll (0x61cc0000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x1a0000)
        libcairo-gobject-2.dll => /c/msys64/mingw64/bin/libcairo-gobject-2.dll (0x6cf40000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x1a0000)
        libfontconfig-1.dll => /c/msys64/mingw64/bin/libfontconfig-1.dll (0x64f80000)
        libpixman-1-0.dll => /c/msys64/mingw64/bin/libpixman-1-0.dll (0x63500000)
        libfreetype-6.dll => /c/msys64/mingw64/bin/libfreetype-6.dll (0x6aac0000)
        libpng16-16.dll => /c/msys64/mingw64/bin/libpng16-16.dll (0x68b40000)
        zlib1.dll => /mingw64/bin/zlib1.dll (0x62e80000)
        libepoxy-0.dll => /c/msys64/mingw64/bin/libepoxy-0.dll (0x6d880000)
        libfribidi-0.dll => /c/msys64/mingw64/bin/libfribidi-0.dll (0x66600000)
        libpangocairo-1.0-0.dll => /c/msys64/mingw64/bin/libpangocairo-1.0-0.dll (0x65880000)
        libpangowin32-1.0-0.dll => /c/msys64/mingw64/bin/libpangowin32-1.0-0.dll (0x676c0000)
        libffi-7.dll => /c/msys64/mingw64/bin/libffi-7.dll (0x71040000)
        libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
        libpcre-1.dll => /mingw64/bin/libpcre-1.dll (0x69140000)
        libthai-0.dll => /c/msys64/mingw64/bin/libthai-0.dll (0x66880000)
        libatk-1.0-0.dll => /c/msys64/mingw64/bin/libatk-1.0-0.dll (0x6bd40000)
        libharfbuzz-0.dll => /c/msys64/mingw64/bin/libharfbuzz-0.dll (0x6f840000)
        libiconv-2.dll => /mingw64/bin/libiconv-2.dll (0x66000000)
        libexpat-1.dll => /mingw64/bin/libexpat-1.dll (0x68f40000)
        libbz2-1.dll => /mingw64/bin/libbz2-1.dll (0x626c0000)
        libbrotlidec.dll => /c/msys64/mingw64/bin/libbrotlidec.dll (0x6e440000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x1a0000)
        libpangoft2-1.0-0.dll => /c/msys64/mingw64/bin/libpangoft2-1.0-0.dll (0x6e7c0000)
        libdatrie-1.dll => /c/msys64/mingw64/bin/libdatrie-1.dll (0x68ac0000)
        libgraphite2.dll => /c/msys64/mingw64/bin/libgraphite2.dll (0x70540000)
        libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
        libbrotlicommon.dll => /c/msys64/mingw64/bin/libbrotlicommon.dll (0x6d4c0000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x1a0000)

Construction de l'archive avec les ressources nécessaires

Tout d'abord, veuillez récupérer et décompresser les dernières versions des icônes Adwiata et Hicolor. Les icônes Adwaita sont déjà incluses, par contre il faudra compiler les icônes hicolor.

Pour ce faire, avec le terminal msys, allez dans le dossier où vous avez décompressé l'archive hicolor. Et exécutez les commandes suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
./autogen.sh
make .MAKE
Soit $MSYS le dossier où est installé Msys2 (Par défaut C:\msys64 pour les installation 64 bits). Aussi pensez à adapter le dossier $MSYS/mingw64 en fonction de votre architecture.

Nous allons archiver l'application et ses dépendances:
  • Il faudra copier le contenu de $MSYS/mingw64/share/glib-2.0/schemas dans le dossier share/glib-2.0/schemas/ du dossier de préparation de l'archive
  • l'exécutable bien sûr
  • les dll listées par la commande ldd utilisée plus tôt dans le billet,
  • le sous-dossier icône Adwaita de l'archive Adwaita que vous avez récupéré et le dossier hicolor compilé (il se trouve dans $MSYS/mingw64/share/icons) dans le dossier share/icons/ du dossier de préparation de l'archive


Vous pouvez donc compresser le fichier, qui devrait normalement contenir toutes les dépendances.


Conclusion

Voilà, j'espère que cela a aussi fonctionné de votre côté .

Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Viadeo Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Twitter Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Google Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Facebook Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Digg Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Delicious Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog MySpace Envoyer le billet « [Rust][Windows][Gtk][Relm] Déploiement d'application Gtk+Relm sous Windows : une approche possible » dans le blog Yahoo

Mis à jour 24/05/2020 à 12h30 par tails (Première version prête)

Tags: gtk, relm, rust, windows
Catégories
Rust

Commentaires