Bonjour,
Si vous suivez ce blog, vous savez que je suis dĂ©veloppeur C++/Qt et que je contribue beaucoup Ă Rolisteam (www.rolisteam.org). Câest un logiciel libre pour faire du jeu de rĂŽle. Il vise un public assez large. Il est donc multi-plateforme. Il fonctionne sous GNU/Linux, windows et Mac Os. Je suis un linuxien convaincu mais je dĂ©veloppe sur les autres systĂšmes pour Rolisteam.
Lâaspect dĂ©veloppement nâest pas vraiment un problĂšme, grĂące Ă Qt. Cela marche grosso modo bien. La chose devient plus pĂ©rilleuse quand il sâagit de distribuer le logiciel.
Dans mon activitĂ© professionnelle, jâai constatĂ©, quâil est assez rare quâun dĂ©veloppeur connaisse les solutions pour distribuer facilement un logiciel. Je vais essayer ici dâexpliquer comment faire. Du moins, comment je fais dans rolisteam et si vous avez dâautres astuces. NâhĂ©sitez pas Ă en faire part dans les commentaires.
Prédicat de base:
Vous avez un logiciel Ă©crit en C++/Qt, il est gĂ©rĂ© par un fichier .pro. Certains systĂšmes de build propose des systĂšmes identiques, voir plus puissant mais plus complexe (e.g: cmake). Je me contente dâĂ©voquer les outils Qt.
Pour GNU/Linux :
Pour ma part, jâai optĂ© pour une distribution source et la crĂ©ation de package Ubuntu. GrĂące Ă Launchpad, il est possible de crĂ©er un dĂ©pĂŽt pour son projet et de soumettre des versions. Il faut lâadmettre, câest trĂšs pratique. Il existe probablement des services pour faire cela pour dâautres distributions.
Des contributeurs ont créé des package pour d’autres distributions (fedoraâŠ). Pour arch-linux, j’ai crĂ©e un script de compilation (Ă tester).
Lâensemble des outils utilisĂ©es ne sont pas des outils Qt. Cela n’est donc pas le propos de cet article. Je me suis mis de cĂŽtĂ© la tĂąche de jeter un coup dâĆil Ă appimage. Cela pourrait ĂȘtre une solution intĂ©ressante.
Pour Windows:
Trouver tous les éléments
Une application a des dĂ©pendances. Sous windows, il est courant dâinstaller lâexĂ©cutable et ses dĂ©pendances dans un mĂȘme dossier. Il est parfois difficile dâidentifier les dĂ©pendances. Rassurez-vous un outil magique a Ă©tĂ© créée. Il sâagit de “windeployqt.exe“. Câest un outil distribuĂ© avec Qt. Son but est de copier toutes les dĂ©pendances Qt dâun binaire dans un dossier.
windeployqt /chemin/vers/mon/executable.exe
Commande Windeployqt
Cette commande va lire le binaire et va copier lâensemble des dĂ©pendances identifiĂ©s Ă cĂŽtĂ© du binaire.
Par soucis de clarté, je préfÚre utiliser un répertoire propre et distinct du répertoire de compilation.
windeployqt --dir /chemin/vers/un/dossier/propre /chemin/vers/mon/application.exe
Dossier séparé
Lâajout du lâargument –dir permet de dĂ©finir ce «dossier de destination».
Une autre difficultĂ© entre en jeu quand votre application utilise du QML. En effet, il convient de rajouter un argument Ă la commande afin de permettre Ă lâoutil dâaller lire votre code QML pour trouver ses dĂ©pendances.
windeployqt --qmldir /chemin/vers/le/dossier/des/qml --dir /dossier/propre application.exe
Distributer du QML
Et aprĂšs ?
Une fois cette Ă©tape terminĂ©e, vous aurez dans votre dossier de destination lâensemble des dĂ©pendances Qt (et QML) de votre projets.
Je vous mets un exemple pour un logiciel utilisant Qt5 et un peu de QML le tout fut compilé avec Visual Studio.
âââ accessible/
âââ audio/
âââ bearer/
âââ designer/
âââ Enginio.dll
âââ iconengines/
âââ icudt52.dll
âââ icuin52.dll
âââ icuuc52.dll
âââ imageformats
âââ mediaservice
âââ msvcp120.dll
âââ msvcr120.dll
âââ platforms/
â âââ qwindows.dll
âââ playlistformats/
âââ position/
âââ printsupport/
âââ qml1tooling/
âââ qmltooling/
âââ Qt5Core.dll
âââ Qt5Declarative.dll
âââ Qt5Gui.dll
âââ Qt5Network.dll
âââ Qt5OpenGL.dll
âââ Qt5Qml.dll
âââ Qt5Quick.dll
âââ Qt5WebKit.dll
âââ Qt5Widgets.dll
âââ Qt5Xml.dll
âââ Qt5XmlPatterns.dll
âââ sensorgestures/
âââ sensors/
âââ sqldrivers/
âââ unins000.dat
âââ unins000.exe
Si votre projet utilise dâautres bibliothĂšques (zlib âŠ), il convient de rajouter les .dll correspondantes dans le dossier. La derniĂšre Ă©tape est dâinclure le .exe de votre application.
En double-clickant sur le .exe, il devrait se lancer. Si ce nâest pas le cas, une dll est probablement manquante.
Cette procédure est à faire aprÚs un changement de version de Qt. Il faut vous assurer que les dll embarquées soient de la bonne version.
A ce stade, il ne reste quâĂ mettre en place lâoutil de publication de votre application.
Publication
Pour cette étape, il y a principalement deux méthodes:
La mĂ©thode de lâarchive Zip, il suffit dâarchiver le dossier de destination dans une archive .zip. Ce fichier peut ĂȘtre extrait sur nâimporte quel windows, et cela fonctionnera. Il faudra crĂ©er Ă la main les raccourcis et il nây pas dâautre moyen pour dĂ©s-installer le logiciel que de supprimer le dossier extrait Ă la main.
Lâautre mĂ©thode est dâutiliser un outil qui va crĂ©er un installeur. Les plus connus sont Inno setup et NSIS.
Jâutilise pour ma part: InstallForge (http://installforge.net), il est graphique et simple.
Quâimporte lâoutil choisi, il faudra lui dire dâinstaller tous les fichiers de votre dossier de destination (en respectant la hiĂ©rarchie des fichiers) chez vos utilisateurs. Ces outils permettent de crĂ©er automatiquement des scripts de dĂ©sinstallation, ils crĂ©ent Ă©galement les raccourcis sur le bureau et la barre de dĂ©marrage. Ils permettent aussi dâafficher du contenu Ă lâutilisateur (licence, logo du logiciel) et cela lui permet de prendre des dĂ©cisions, au cours de lâinstallation (si besoin).
Pour finir, aprĂšs cette Ă©tape, vous aurez un installeur soit en mode .zip, soit un .exe. Il ne reste plus quâĂ mettre cet installeur accessible Ă vos utilisateurs et câest bon.
Pensez Ă le tester quand mĂȘme avant de faire des annonces publiques. On sait jamais !
Pour Mac OS:
Pour MacOs, il existe un outil similaire qui sâappelle: macqtdeploy.
Il utilise les mĂȘmes paramĂštres que la version windows, la seule diffĂ©rence rĂ©side dans lâutilisation dâun .app (en lieu et place du .exe).
macdeploy application.app -qmldir=/User/dossier/vers/code/qml
sur MacOs X
Bien sĂ»r, cela peut ĂȘtre intĂ©grer dans QtCreator comme Ă©tape de dĂ©ployement.
Sur MacOs, il est possible de demander Ă Qt de compiler une application dans un bundle (câest dâailleurs la solution par dĂ©faut). Un bundle est un dossier se terminant par «.app». Dans lâenvironnement graphique de MacOs, un double click lance le logiciel quâil contient. Il est Ă©galement possible, dâexplorer le contenu du bundle en ligne de commande (cela se comporte comme un dossier) ou par un click droit: «afficher le contenu du packet» en graphique.
Dans tous les cas, lâutilisation de la commande va venir placer lâensemble des dĂ©pendances Qt dans le bundle. Pour ĂȘtre prĂ©cis, les bibliothĂšques sont placĂ©es dans le dossier Contents/Frameworks du bundle. Les modules QML sont dans Resources/qml.
A lâinstar de windows, il faut mettre Ă©galement dâĂ©ventuelles autres bibliothĂšques dans le bundle. Câest une Ă©tape un peu technique. Pour rolisteam, jâutilise zlib, voilĂ le programme bash qui me permet de faire lâajout et de bien dĂ©finir les chemins.
#!/bin/sh
############################################
# Rolisteam
# Script to deploy libz into rolisteam.
#
###########################################
echo 'Display dependancies'
otool -L rolisteam.app/Contents/MacOS/rolisteam
echo 'Create directory'
mkdir rolisteam.app/Contents/Frameworks/libz.framework/
echo 'Copy lib binary'
cp /usr/lib/libz.1.dylib rolisteam.app/Contents/Frameworks/libz.framework/
echo 'Rewrite path to the lib'
install_name_tool -change /usr/lib/libz.1.dylib @executable_path/../Frameworks/libz.framework/libz.1.dylib rolisteam.app/Contents/MacOS/rolisteam
Ajouter une dépendances à un bundle
En gros, il y a la copie du fichier en lui mĂȘme puis, la modification de lâexĂ©cutable pour lui dire dâaller chercher zlib dans le bundle et non sur mon poste. Cette Ă©tape est trĂšs importante car sinon, votre bundle ne sera pas portable sur une autre machine.
Et aprĂšs ?
Le fichier .app complet suffit pour ĂȘtre installĂ© sur une autre machine. Cependant, il est de coutume de distribuer un logiciel par un dmg. Cela permet de le compresser pour faciliter sa distribution et surtout MacOs permet de rendre graphique l’installation par un dmg.
Pour rĂ©aliser cela, jâutilise un petit utilitaire: node-appdmg. Il suffit dâun petit fichier de configuration en json pour dĂ©finir les paramĂštres.
{
"title": "Rolisteam - Mac Os X",
"icon": "rolisteam.icns",
"background": "1500-rolisteam.png",
"icon-size": 80,
"contents": [
{ "x": 448, "y": 344, "type": "link", "path": "/Applications" },
{ "x": 192, "y": 344, "type": "file", "path": "rolisteam.app" }
]
}
Configuration node-appdmg pour rolisteam
Vous lancez lâutilitaire avec le fichier de configuration et le nom de votre dmg pour obtenir votre dmg tout beau, tout propre.
node-appdmg dmg.json monapplication.dmg
Il ne reste quâĂ distribuer votre dmg.
Conclusion
Nous venons de voir les solutions et les outils mis en place pour rolisteam.
Si vous avez des questions sur les outils, ou si vous voulez en proposer dâautres, les commentaires sont lĂ pour ça.