Affichage des articles dont le libellé est programmation. Afficher tous les articles
Affichage des articles dont le libellé est programmation. Afficher tous les articles

samedi 23 février 2013

SDL : Unable to open a console terminal

Un petit post pour aider ceux qui pourraient avoir le même souci que moi : après avoir compilé la lib SDL 1.2.15 dans une machine virtuelle Ubuntu 10.04 (dans le but d’en faire une version qui fonctionne sur la plupart des distributions récentes), je la teste sous Arch Linux et j’obtiens un résultat étrange :

- X disparait pour afficher à la place un TTY…
- je dois presser Ctrl-alt-F2 puis Ctrl-alt-F1 pour revenir à X
- mon programme affiche dans le terminal ce mystérieux message d’erreur :
Error initializing video: Unable to open a console terminal
Pourtant j’ai compilé la libSDL avec exactement les mêmes options que dans le PKGBUILD sdl d’Arch Linux, et mon jeu fonctionne très bien avec la lib d’Arch !

Après des recherches web ne retournant ni explication ni solution, je cherche le message d’erreur dans les sources de la SDL et vois qu’il provient du fichier video/fbcon/SDL_fbevents.c. fbcon ? Pourquoi est-ce que la SDL essaye d’utiliser une framebuffer console au lieu d’ouvrir une fenêtre sous X ??

J’essaye de forcer l’utilisation du pilote X11 :

export SDL_VIDEODRIVER=x11
./MonJeu


… et j’obtiens cet autre message d’erreur :
Error initializing video: No available video device
Quelqu’un dans le canal #SDL sur IRC me demande si le ./configure affiche que X est supporté ou non, et je relance donc la VM pour voir ça. Mon script de compilation installe automatiquement deux packages qui, curieusement, ne m’avaient pas été nécessaires pour compiler la version 64 bit de la SDL, mais étaient requis en 32 bit : libxext-dev et x11proto-xext-dev. Et lorsque je teste à nouveau mon jeu sous Arch avec la nouvelle version de la lib 64 bit, ça fonctionne !*

Conclusion : sous Ubuntu ou Debian, installez libxext-dev avant de compiler la libSDL, sinon elle ne gérera pas l’ouverture de fenêtres sous X. Sous Arch Linux, vous avez probablement déjà le package libxext installé.

*en fait, non, ça ne marche toujours pas, mais le message d’erreur a disparu et la fenêtre de mon jeu s’ouvre brièvement. J’ai juste d’autres problèmes à corriger…

mardi 20 novembre 2012

Utiliser Git pour patcher un projet open-source sous svn

J’ai commencé il y a quelques mois à modifier pour mon usage personnel un logiciel open-source. Son code étant hébergé dans une base Subversion (svn) sur SourceForge, j’avais tout simplement fait un « svn checkout » du projet et commencé à taper dans le code pour faire mes modifications.

Et puis un jour j’ai voulu soumettre un patch aux développeurs. Problème : si je fais un « svn diff », j’obtiens tous mes changements en vrac. Comment faire ? Éditer le diff à la main n’est pas très pratique et source d’erreurs. Faire un deuxième checkout et y copier-coller à la main ce que je veux intégrer au patch est fastidieux.

J’ai donc décidé d’utiliser Git et sa supériorité écrasante (si si, il parait) dans la gestion des branches pour créer mes futurs patchs. L’idée est de créer une nouvelle branche pour chaque patch. Ensuite un simple diff entre deux branches permet de générer le patch souhaité.


La méthode pas à pas


Voici comment ça marche :


1) Récupérer le projet


git svn clone https://…

Ça peut prendre très longtemps car ça récupère tout l’historique du projet. Dans mon cas, ça a pris dans les 2 heures pour environ 5500 révisions svn.

Cette opération crée automatiquement une branche nommée « master » dans laquelle on ne fera jamais de commit. Ça sera la branche de référence permettant de générer les patchs.


2) Créer une branche dédiée à notre premier patch


git checkout -b my-great-patch master

3) Coder le patch… et faire autant de commits que l’on souhaite


- pour voir les fichiers modifiés :

git status

- pour vérifier ce qu’on a changé avant de commiter :

git diff

- pour commiter :

git commit -a -m "Description du commit."

4) Générer le patch


git diff master >my-great-patch.diff

5) L’envoyer aux développeurs



6) Supprimer la branche


Si le patch est intégré au code source officiel du projet, vous pouvez alors supprimer la branche :

git checkout master
git branch -d my-great-patch


La méthode est au final assez simple et je peux confirmer que les développeurs n’ont aucun souci avec les patchs créés par git ;-).


Autres commandes


Il y a tout de même quelques autres commandes à connaitre :

- Récupérer la dernière version du code source officiel


D’abord mettre à jour la branche master :

git checkout master
git svn rebase

Puis mettre à jour la branche sur laquelle vous travaillez :

git checkout my-great-patch
git rebase master

Il peut arriver qu’il y ait des conflits à cette étape, mais je n’ai pas d’instructions détaillées à proposer dans ce cas de figure. Git indique lui-même les commandes à taper pour annuler ou continuer la mise à jour.

- Voir les branches existantes et savoir sur laquelle on se trouve


git branch

- Passer d’une branche à une autre


git checkout my-other-great-patch

Notez que si vous avez compilé la branche my-great-patch avant de passer à la branche my-other-great-patch, il faudra probablement faire un « make clean » pour effacer tous les fichiers générés du projet avant de le recompiler (utilisez ccache pour gagner du temps !).

Notez également qu’une pression sur TAB complete tout seul les noms de branche git (sous zsh / Arch Linux). Très pratique :-). Il est également possible de configurer son prompt pour qu’il affiche le nom de la branche courante (je vous laisse chercher comment ; je ne l’ai pas fait).

- Voir le log des révisions svn


git svn log

(C’est totalement indépendant de la branche git courante.)

- Voir le log des commits de la branche courante


git log


Combiner tous les patchs


Si en attendant que vos patchs soient acceptés vous voulez les utiliser en local, il peut être intéressant de créer une branche combinant toutes les autres… À priori le plus simple est d’utiliser « git merge » :

git checkout -b all-my-patches master
git merge my-great-patch
git merge my-other-great-patch


Voilà pour cette fois. Have fun ;-).

samedi 7 janvier 2012

Un chronomètre en bash

Aujourd'hui, j'avais absolument besoin de mesurer le temps qui passe, mais je n'avais rien pour, alors j'ai tapé ça dans un terminal :
c=0;while true;do sleep 1;((c++));echo $c;done
À bientôt pour la suite de mes aventures !

jeudi 19 mai 2011

profileD, une GUI pour le profiling en langage D

Avis aux programmeurs en langage D : je viens de publier sur bitbucket un petit logiciel servant à afficher de manière lisible et pratique le fichier « trace.log » généré par les programmes compilés par dmd avec l'option « -profile ».

L'interface utilise Gtk 2 et ressemble à ça :


C'est bien utile pour savoir quelle fonction fait ramer un jeu :) (par exemple).

L'adresse pour récupérer les sources, et, pourquoi pas, signaler des bugs ou soumettre des patchs : https://bitbucket.org/stqn/profiled