Génération des fichiers .defs
The .defs files are text files, in a lisp format, that describe the API of a C library, including its
- 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
This .defs file describes objects and their functions. It is generated by the h2def.py script which you can find in glibmm's tools/defs_gen directory. For instance,
$ ./h2def.py /usr/include/gtk-3.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-3.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; }