The .defs file are text files, in a lisp format, that describe the API of a C library, including its
objects (GObjects, widgets, interfaces, boxed-types and plain structs)
functions
enums
signals
properties
vfuncs
At the moment, we have separate tools for generating different parts of
    these .defs, so we split them up into separate files.
    For instance, in gtkmm/gtk/src, you will find these
    files:
    
gtk.defsIncludes the other files.
gtk_methods.defsObjects and functions.
gtk_enums.defsEnums.
gtk_signals.defSignals and properties.
gtk_vfuncs.defsvfuncs (function pointer member fields in structs), written by hand.
This .defs file describes objects and their functions. It is generated by the h2def.py script which you can find in pygobject's codegen directory. For instance,
$ ./h2def.py /usr/include/gtk-2.0/gtk/*.h > gtk_methods.defs
This .defs file describes enum types and their possible values. It is
    generated by the enum.pl script which you can find in
    glibmm's tools directory. For instance,
$ ./enum.pl /usr/include/gtk-2.0/gtk/*.h > gtk_enums.defs
 This .defs file describes signals and properties. It is generated by the
    special extra_defs utility that is in every wrapping
    project, such as gtkmm/tools/extra_defs_gen/. For
    instance 
$ cd tools/extra_defs_gen $ ./generate_extra_defs > gtk_signals.defs
You must edit the source code of your own
    extra_defs_gen tool in order to generate the .defs for
    the C types that you wish to wrap. Start by renaming the file:
$ cd tools/extra_defs_gen $ mv generate_defs_gda.cc generate_defs_example.cc
Then edit the Makefile.am so that it mentions the new
    file name, and edit the new .cc file to specify the
    correct types. For instance, your main() function might
    look like this:
#include <libsomething.h>
int main (int argc, char *argv[])
{
    libexample_init(argc, argv);
    std::cout << get_defs(EXAMPLE_TYPE_SOMETHING)
              << get_defs(EXAMPLE_TYPE_THING);
    return 0;
}