Génération des fichiers .defs
Les fichiers .defs sont des fichiers texte, au format lisp, décrivant l'API de la bibliothèque C, y compris ses
- objets (GObjects, éléments graphiques, interfaces, types de boîtes et structures brutes)
- fonctions
- énumérations
- signaux
- propriétés
- fonctions virtuelles.
À ce moment, nous disposons d'outils séparés pour générer les diverses parties des fichiers .defs, nous les éclatons donc en fichiers séparés. Par exemple, dans le répertoire gtk/src des sources de gtkmm, vous trouvez ces fichiers :
- gtk.defs
inclut les autres fichiers.
- gtk_methods.defs
objets et fonctions
- gtk_enums.defs
énumérations.
- gtk_signals.defs
signaux et propriétés
- gtk_vfuncs.defs
fonctions virtuelles (champs de pointeurs membres de fonction dans des structures), écrites à la main.
G.II.I. Génération des .defs pour les fonctions membres
Ce fichier .defs décrit les objets et leurs fonctions. Il est généré par le script h2def.py que vous trouverez dans le répertoire codegen des pygobject. Par exemple,
$ ./h2def.py /usr/include/gtk-2.0/gtk/*.h > gtk_methods.defs
G.II.II. Génération des .defs pour les énumérations
Ce fichier .defs décrit les types enum et leurs valeurs possibles. Il est généré par le script enum.pl que vous trouverez dans le répertoire tools de glibmm. Par exemple,
$ ./enum.pl /usr/include/gtk-2.0/gtk/*.h > gtk_enums.defs
G.II.III. Génération des .defs pour les signaux et les propriétés
Ce fichier .defs décrit les signaux et les propriétés. Il est généré par l'utilitaire spécial extra_defs qui se trouve dans tout projet d'habillage, tel que gtkmm/tools/extra_defs_gen/. Par exemple
$ cd tools/extra_defs_gen $ ./generate_extra_defs > gtk_signals.defs
Vous devez rédiger le code source de votre propre outil generate_extra_defs pour générer les fichiers .defs des types C GObject que vous souhaitez habiller. Dans l'arborescence des sources squelettes, le fichier source s'appelle codegen/extradefs/generate_extra_defs_skeleton.cc. Si ce n'est pas déjà fait, le fichier doit être renommé en remplaçant la variable de substitution skeleton par le nom de base de la nouvelle liaison. Le fichier codegen/Makefile.am doit également citer le nouveau nom du fichier source.
Ensuite, modifiez le fichier .cc pour définir les types corrects. Par exemple, il se peut que votre fonction main() ressemble à quelque chose comme ceci :
#include <libsomething.h> int main(int, char**) { something_init(); std::cout << get_defs(EXAMPLE_TYPE_SOMETHING) << get_defs(EXAMPLE_TYPE_THING); return 0; }