The .defs
files 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 the gtk/src
directory of the gtkmm
sources, you will find these files:
gtk.defs
Includes the other files.
gtk_methods.defs
Objects and functions.
gtk_enums.defs
Enumerations.
gtk_signals.defs
Signals and properties.
gtk_vfuncs.defs
vfuncs (function pointer member fields in structs), written by hand.
The skeletonmm/codegen/generate_defs_and_docs.sh
script
generates all .defs
files and the *_docs.xml
file,
described in the Documentation section.
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
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-3.0/gtk/*.h > gtk_enums.defs
This .defs
file describes signals and properties. It is
generated by the special generate_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 generate_extra_defs
tool
in order to generate the .defs
for the GObject C types that you wish to
wrap. In the skeleton source tree, the source file is named
codegen/extradefs/generate_extra_defs_skeleton.cc
. If not done so
already, the file should be renamed, with the basename of your new binding substituted
for the skeleton
placeholder. The codegen/Makefile.am
file should also mention the new source filename.
Then edit the .cc
file to specify the correct types.
For instance, your main()
function might look like this:
#include <libsomething.h> int main(int, char**) { something_init(); std::cout << get_defs(SOME_TYPE_WIDGET) << get_defs(SOME_TYPE_STUFF); return 0; }