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;
}

G.II.IV. Écriture des .defs pour les fonctions virtuelles