mardi 8 novembre 2016

Ubuntu Phone et SDL - Magie

Ça marche ! Rhaaaa ! Rhaaaaaaaaa ! Rhaaaaaaaaaaaaaaaaaaa !

Ça n'a pas été sans mal, mais j'ai enfin réussi à faire tourner un mini-programme utilisant la SDL. Quelle plaie ! On va tout reprendre depuis le début, et essayer d'expliquer comment y arriver.

La première épreuve est de télécharger une version de la SDL qui fonctionne avec la version de MIR, le serveur d'affichage de chez Ubuntu, disponible sur le téléphone. Alors c'est bien simple, SDL 2.0.5 a besoin d'une version de MIR trop récente (>= 0.25), et 2.0.4 a besoin d'une version de MIR trop vieille (0.14). Il faut donc aller trouver la bonne révision dans le dépôt SDL, pour aller chercher la SDL juste quand elle marchait avec MIR 0.24. Donc, dans votre répertoire courant, faites:

hg clone http://hg.libsdl.org/SDL -r 10361

Maintenant, ouvrez un shell sur la chroot de cross-compilation ARM (je rappelle pour ceux du fond qui ne suivent pas, dans QtCreator, c'est Tools => Options => Ubuntu => onglet Click => architecture armhf => Maintain). Dans ce shell, nous allons définir quelques variables d'environnement pour s'assurer que la cross-compilation est correctement configurée, en faisant pointer le compilo, l'éditeur de liens, et le PKG_CONFIG (pour MIR) au bon endroit.

export CC=/usr/bin/arm-linux-gnueabihf-gcc
export LD=/usr/bin/arm-linux-gnueabihf-ld
export AS=/usr/bin/arm-linux-gnueabihf-as
export CXX=/usr/bin/arm-linux-gnueabihf-g++
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/

Ensuite, on peut lancer la compilation en elle-même.

../SDL/configure --prefix=/usr/ --host=arm-linux-gnueabihf
make -j 4
make install

Tout se passe à peu près bien, et l'on peut vérifier que la bibliothèque est bien générée avec des instructions ARM

/usr/bin/arm-linux-gnueabihf-objdump -x /usr/lib/libSDL2.a | head -n 20

L'on voit de charmantes choses du genre "SDL.o: file format elf32-littlearm", qui sont quand même très bon signe.

Ensuite, construisons un programme SDL proprement dit. J'utilise un exemple tiré de StackOverflow, et j'ajuste l'édition de liens en ajoutant cette ligne au sein du fichier .pro pour lier SDL en statique :

LIBS += -l:libSDL2.a -ldl

Après, on lance, et miracle, j'ai des petits pixels qui s'affichent !

Alors, certes, ce n'est qu'une étape. Il est plaisant de voir que la cross-compile fonctionne, que SDL arrive à papoter avec MIR, et que l'on se trouve enfin en terrain connu.

Reste à compléter l'intégration. Dans mon programme d'exemple, la résolution est codée en dur, il faudrait arriver à récupérer la résolution du téléphone. Peut-on attraper l'événement de mise en arrière plan ? Peut-on attraper l'événement de rotation de l'écran ? Est-ce que les API SDL sont correctement reliées à la machine, et peut-on détecter un doigt, un geste, un geste à plusieurs doigts ? Est-ce que le son et la musique fonctionnent correctement ?

Mais ce sera pour un autre jour. Maintenant, dodo.

Aucun commentaire: