URL: https://linuxfr.org/users/pied/journaux/qtwebengine-sous-raspbian-la-croix-et-la-galere Title: QtWebEngine sous raspbian, la croix et la galère... Authors: Pinaraf Date: 2019年11月30日T10:37:56+01:00 License: CC By-SA Tags: qt, blink, raspbian, crosscompilation et debian Score: 21 Salut à tous Après avoir passé... «plusieurs heures» pour obtenir un QtWebEngine qui fonctionne sous raspbian, je me suis dit qu'il serait peut-être intéressant de partager l'expérience ici. À la fois pour le côté scientifique, documentaire de la chose, mais aussi tout simplement pour vider mon sac, parce qu'on en a gros. Puis ça fait longtemps que j'ai pas fait de journal, ça me manque... Tout d'abord, petite observation : sur les dépôts raspbian, on trouve beaucoup de paquets... normal, c'est un dérivé de debian me direz-vous ? Non non, même des vieilleries genre Qt 3 sont encore là, sorti 8 ans avant la première Raspberry Pi... Mais par contre des fois y'a des trous. Genre quand on veut afficher une page web, la techno officielle de Qt est WebEngine, dérivé de Chromium (suite à la direction prise par Apple dans Webkit à l'époque de la version '2.0'). Et là, ben on n'a pas grand chose : on a la doc, les données, mais pas la lib. Du coup, petite histoire de cross-compilation (compiler blink sur une raspberry pi me semble être une très mauvaise idée) et de souffrance, accrochez vous. L'environnement hôte =========== Alors, j'utilise une debian pour cela. Attention : il faut une debian inférieure ou égale à la version raspbian ciblée pour utiliser le compilateur packagé par Debian. Je m'explique. Quand on va compiler sur mettons une debian sid, même si on réalise une cross-compilation vers raspbian, certains composants vont venir du compilateur lui-même, et donc être liées à la version de la libc de debian. Démonstration: ``` snoopy@peanuts2:/tmp$ cat math.cpp #include int test(int a, int b) { return pow(a, b); } snoopy@peanuts2:/tmp$ arm-linux-gnueabihf-g++ math.cpp -shared -o math.so snoopy@peanuts2:/tmp$ arm-linux-gnueabihf-nm math.so | grep pow U pow@@GLIBC_2.29 ``` Donc déjà vous avez perdu 5 points de santé mentale en ayant configuré toute votre machine pour la cross-compilation, tout installé, vérifié et tout... pour au final vous rendre compte que votre binaire ne pourra pas marcher. (Évidemment je m'en suis rendu compte avec mon Qt complet, pas avec un exemple d'une ligne) Du coup, on reprend, l'environnement hôte... Il suffit d'installer les paquets `gcc-arm-linux-gnueabihf` et `g++-arm-linux-gnueabihf` et votre debian buster devrait normalement être à même de produire des binaires compatibles avec raspbian buster. Ensuite, deuxième étape : il vous faut une raspbian sur votre debian. Pas exécutable (encore que, avec qemu... bref), mais juste l'arborescence pour avoir les fichiers d'en-tête, les bibliothèques dans les bonnes versions... Du coup, il faut préparer une raspbian. Je vous invite à suivre https://wiki.qt.io/RaspberryPi2EGLFS mais pas trop. Jusqu'à l'étape 9, tout va presque bien... Parce que c'est pas encore assez fun, les pilotes graphiques de Raspberry Pi ========== La Pi <4 dispose, pour sa puce graphique VC4, de deux pilotes: le pilote libre vc4, intégré au noyau, et le pilote propriétaire brcm. N'utilisez pas le pilote propriétaire pour cet usage. Il impose un vieux GCC qui n'est pas compatible avec les webengine récents... (j'ai pleuré du sang sur cette blague là) Du coup, on suit pas exactement le tuto. Dans raspi-config, dans le choix du pilote GL, il faut utiliser le «OpenGL desktop driver» (à vous le choix fake KMS vs full KMS, ça dépend de votre écran et de comment il est connecté... 3 points de santé mentale en moins) Ensuite seulement, on peut reprendre la documentation de Qt pour obtenir un sysroot viable. Compilation de Qt... ======== Je vous invite à prendre directement les archives complètes plutôt que les modules individuels depuis git. C'est bien plus simple, surtout quand ça inclut un monstre comme WebEngine (au moins 30 minutes de git clone chez moi). Du coup je suis parti de https://download.qt.io/official_releases/qt/5.12/5.12.6/single/qt-everywhere-src-5.12.6.tar.xz.mirrorlist Tout d'abord, le configure... ``` ./configure -release -opengl es2 -device linux-rasp-pi3-vc4-g++ -device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- -sysroot /opt/raspi/sysroot.vc4 -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix /opt/qt5pi/5.12.6/build -hostprefix /opt/qt5pi/5.12.6/tools -no-xcb -no-use-gold-linker -v -nomake examples -nomake tests -libinput -libudev -webengine-proprietary-codecs ``` Ce sont mes options, libre à vous d'en changer évidemment. Décomposons... -release : pas de debug (sinon c'est beaucoup plus lourd) -device linux-rasp-pi3-vc4-g++ -device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- -sysroot /opt/raspi/sysroot.vc4 : on vise une raspberry pi 3, pilote vc4, et on utilise le compilateur de notre debian -opensource -confirm-license : on est sur la version libre, et oui on a lu la licence -prefix /usr/local/qt5pi -extprefix /opt/qt5pi/5.12.6/build -hostprefix /opt/qt5pi/5.12.6/tools : on installera dans /usr/local/qt5pi sur la Pi, et dans /opt/qt5pi/5.12.6 sur la machine hôte (j'ai pris là où j'avais de la place) -no-xcb : je vise de l'embarqué, donc pas de X11 -nomake examples -nomake tests : on va économiser quelques minutes de compilation quand même -no-use-gold-linker : parce que j'ai pleuré sans (encore des points de santé mentale en moins) -libinput -libudev -webengine-proprietary-codecs : des options dont j'ai besoin pour mon usage Et on compile tout ça, avec un `make -j 42` (remplacez 42 par le nombre de ×ばつ2+âge du capitaine-5)... on va prendre moultes thés, cafés, cachets d'opium... et on revient : hoo, il a compilé ! Tout fièrement, on fait `make install`... on regarde... Hooo, il n'a pas compilé QtWebEngine, le petit cachotier... Bande de zapotèques ! =========== Nous arrivons à la blague ultime. Vraiment balaise. Tout d'abord, le configure de Qt n'est pas très précis et ne dit pas clairement que non non, le QtWebEngine ne passe pas. Et ce qui m'a le plus bloqué et rendu fou n'est pas lié à Qt mais à WebEngine. Pour compiler blink en ciblant de l'ARM 32 bits, si on est sur une machine x86 64 bits, il *faut* avoir le nécessaire pour compiler du x86 32 bits. Oui oui. Pour compiler pour l'architecture A, si on est sur une architecture B, il faut aussi pouvoir compiler pour l'architecture C. J'étais fou de rage sur celle là. Ha oui, il utilise aussi son propre système de build lancé depuis make. Parce que c'est plus fun. Et puis des fois il se plante et veut voir les libs sur le système hôte au lieu de chercher dans le système cible. Du coup, j'ai installé les paquets suivants sur mon hôte pour que ça passe: `apt install ninja-build lib32stdc++-8-dev libnss3-dev` Et là, après environ 4 heures de compilation, là c'est passé. Supplément de mensonges ========== Y'a une petite blague dans ce que j'ai dit au dessus, que je placerais à 10 sur l'échelle de la puputerie : *il utilise aussi son propre système de build lancé depuis make*. Ils ont choisi d'utiliser ninja... Soit, ok, si vous voulez. Mais ninja est vachement fort, il peut lancer autant de jobs en parallèle qu'il y a de CPU... Bonne idée direz-vous ? J'ai fait un OOM avant d'aller patcher les Makefile pour forcer ninja à utiliser moins de taches de compilation en parallèle. Blink est un monstre à compiler, les fichiers demandent rapidement des GB de RAM pour compiler. Donc un conseil : activez de la swap, ou utilisez une machine avec moulte espace (j'ai que 16GB sur mon PC perso, et pas mal d'outils qui tournent déjà et réduisent à moins de 10GB la RAM dispo) Merci à vous d'avoir lu mes heures de souffrance. Vous pouvez maintenant faire un navigateur embarqué sur votre Pi, sans utiliser X11, directement sur le framebuffer. Bon, je vous conseille quand même de faire les interfaces en QML, c'est quand même largement plus performant vu que c'est fait pour (y'a quand même des boites qui développent des moteurs HTML conçus exprès pour ce genre d'usage, genre https://www.ekioh.com/flow-browser/ mais c'est pas libre et y'a même pas une démo téléchargeable)

AltStyle によって変換されたページ (->オリジナル) /