Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Retour d'experience de portage Mac d'un vieux développeur Windows

Bonjour

Je suis un vieux développeur Windows et je vais essayer de vous décrire mon expérience du portage de mon application (Zeecrowd) sous Mac.
Veuillez m'excuser d'avance si certaines explications sont imprécises mais j'ai surement survolé certains concepts :8

Tout d'abord un petit Troll ne fait pas de mal :


J'ai acheté un Mac Book Pro et j'ai cherché désespérément les touches pour les caractères : {}, |, [] ....
Mais bon c'est vrai que pour faire de la bureautique et de l'imagerie ces caractères ne sont pas vraiment utiles ... ]:D

Première étape : download de la version


Qt 5.3.2 s'installe sans soucis. Seul bémol : elle est livrée avec une version des sources compilés en 64 bits ...
Allez on prend notre courage à deux mains et on porte notre code c++ compatible en 64 bits ...

Création du kit de compilation QtCreator avec le compilateur Clang 64 bits. Je passe la phase d'ajout de "#ifdef WIN32" pour exclure notre code spécifique.
Et là miracle tout marche bien et QtCreator nous génère un joli binaire "Zeecrowd.app" (binaire c'est ce que je croyais ... on verra plus loin)

Je clique dessus (après avoir largement râlé sur "Finder" , allez encore un petit troll :P ) et deuxième miracle l'application fonctionne parfaitement.
Je rappel j'ai une architecture Qt/Qml avec l'utilisation de WebKit.
Je dirai même que l'experience sur Mac est plus agréable que sur Windows à l'utilisation de l'application, plus de fluidité .
Cela viens surement du fait que la version MacOs est compilée avec OpenGl et celle Windows avec Angle .. peut être ....
Le rendu de la caméra est plus joli mais là ca viens surement du materiel.

Ah, quand même un bug mais nous sommes seul coupable : Mac c'est de linux et nous avons de temps en temps utilisé des paths avec \ et non pas / .

Bref jusqu'ici : Bravo Qt :lol:

Deuxième étape : Test sur un poste de non développeur


Je copie le fichier "Zeecrowd.app" sur un autre poste et je lance : Plantage !!!! :(
Mais suis-je bête ... J'utilise comme sur windows une version Qt en librairie dynamique .. donc il faut aussi livrer Qt;

Je reviens sur mon Mac développeur et le but de l'exercise est de faire tourner l'application en ayant renommé le répertoire d'installation de Qt.
Donc j'épure quelques forums et là première découverte. Qt n'a pas généré un binaire mais un "Bundle" (enfin je crois).
"Zeecrowd.app" n'est pas un binaire mais un repertoire qui contient ... d'autres repertoires et sous le repertoire MacOS se trouve le binaire.

Quelques posts nous expliquent les joies du déploiement à la main des frameworks Qt sous MAC avec les outils "otool" et "install_name_tool".
Comme je suis un peu feignant sur les bords je découvre l'utilitaire "macdeployqt" fournit avec le package Qt que j'ai installé.

Troisième étape "installation des frameworks Qt" :

macdeployqt Zeecrowd.app

Je regarde dans le repertoire Zeecrowd.app et là sous le repertoire Frameworks il y a bien les frameworks Qt.
Un petit coup de "otool -L" sur mon binaire (le vrai cette fois ci) indique bien qu'il utilise bien les frameworks installés dans mon repertoire "Zeecrowd.app".

Je relance l'application ... Plantage !!!! Les fichiers Qml de QtQuick sont introuvables :mad:

Quatrième étape "installation de QtQuick" :


"macdeployqt" possède une option "-qml" qui permet d'installer tout ce qui est nécessaire à votre application en lui fournissant un répertoire contenant tout vos fichiers Qml.
Comme notre application charge à chaud des applications Qml tierces on décide de créer un fichier Qml avec les "#import" de tout les packages QtQuick fournit par Qt et de le mettre dans un répertoire à part "QmlMacDeploy".

macdeployqt Zeecrowd.app -qmldir=QmlMacDeploy

Si on regarde ensuite dans le repertoire "Zeecrowd.app" : on voit bien que dans le repertoire "Resources" se trouve le répertoire "qml".
On relance l'application : Ca marche :cool:
Par acquis de conscience je teste une application qui utilise le Webkit : Plouf .. marche pas :rolleyes: (l'ascenseur émotionnel)

Cinquième étape "QtWebProcess" :


Le QtWebKit utilise en "out of process" l'executable QtWebProcess (comme sur windows) et "macdeployqt" ne l'a pas déployé dans mon "bundle" (je sais toujours pas si ce nom est approprié).
Je le copie dans le repertoire "MacOS" à côté de l'executable.

Je re-test l'application qui utilise QtWebKit ... : Re Plouf !!!
Je pleure un coup ... ca fait du bien ...

Je lance "ps -ef" (un vieux souvenir de mes 20 ans ...) et "QtWebProcess" est bien lancé.
Par contre "otool -L" sur le "QtWebProcess" installé dans mon "bundle" me dit qu'il n'utilise pas les frameworks Qt installés dans mon bundle .. Arrrggggg ...
Je me replonge dans la doc et .... :

macdeployqt Zeecrowd.app -executable=Zeecrowd.app/Contents/MacOS/QtWebProcess

Je re-re-re-re-re test ... Ahou !!!!! ca fonctionne :lol:

Sixième étape "création d'un package"

macdeployqt Zeecrowd.app -dmg

Cette commande me créé un jolie package que je peux deployer sur notre site internet :)
Allez je le fais ... J'ouvre "Chrome" (sans me faire exorciser avant (re troll)), download du .dmg ... Clique dessus ... et là ....

Prés à de boucher le champagne comme nos amis Italiens en 2000 (allez rappelez vous :-)) ....

GateKeeper me jète en disant que cette application proviens d'internet et elle est pas signée ....

Mais c'est bien sur .. Comme Windows il faut que je signe l'application.

Septième étape "Signature de l'application" :


Ca tombe bien on a un certificat pour la version Windows fournit par "Comodo". Je l'installe dans le "trousseau d'accès".
Je signe en utilisant "codesign" :

codesign --force --verify --verbose --deep --sign "My Windows Certificat" macosx/Dev/Zeecrowd.app


Mon Mac est toujours pas d'accords : il faut un certificat Apple !!!!

80 euros plus loin on arrive à générer un certificat "Developper ID". Pour cela il faut être "Team Agent" (he oui les Team Admin peuvent pas le faire).
Pour générer ce certificat j'ai utilisé XCode. Dans le menu "Preference" on ajoute son "Apple Id" et ensuite on peut générer les certificats.

Et là : tout fonctionne bien mon Mac accepte le package et il fonctionne :D

Allez je pars dormir une semaine ...

Réponses

  • Bonjour,

    Ton post me fait très plaisir, le ton trollesque encore plus ]:D
    Ayant expérimenté (toutes les ignobles immondices de ) Windows, je n'avais rien encore pour comparer Linux à Mac.
    Après, je ne connais pas tous les détails, c'est normal que tous les paquets utiles doivent être installés, mais pourquoi ne le sont-ils pas à l'installation de Qt (d'après ce que j'ai compris de ton post encore une fois)...
  • Bonsoir

    Après, je ne connais pas tous les détails, c'est normal que tous les paquets utiles doivent être installés, mais pourquoi ne le sont-ils pas à l'installation de Qt
    Quand tu installes Qt sur ta machine et que tu compiles. Le compilateur référence les frameworks et librairies utilisées lors de la compilation.
    Mais il faut pas non plus espérer que tes utilisateurs aient installé Qt, en plus sur le même répertoire. Hors de question aussi d'installer Qt sur leurs postes.

    C'est là ou "macdeployqt" te rend un immense service. Il t'aide à embarquer le framework Qt dans ton "Bundle" (si quelqu'un peut me dire si j’emploie le bon terme :-)).
    Comme cela ton livrable se suffit à lui même ...

    Une dernière pour la route


    Dans l'étape de signature j'ai omis un détail : "macdeployqt" oubli carrément de livrer les fichiers "info.plist" desn frameworks Qt. Et "codesign" n'aime pas du tout ça.
    Il faut donc que tu te tapes la copie un par un à la "mimine" de ces fichiers depuis l'installation de Qt vers ton "Bundle" dans chacun des répertoires "Framework" associés.
    Quelque chose comme ça dans mon cas :

    cp /Users/zeecrowddev/Qt5.3.2/5.3/clang_64/lib/QtCore.framework/Contents/Info.plist Zeecrowd.app/Contents/Frameworks/QtCore.framework/Resources/


Connectez-vous ou Inscrivez-vous pour répondre.