This module serves as a way to automatically populate G-Wrap wrapsets using information parsed out of C header files.
First, the C header files are parsed into S-expression API description forms and
written into .defs
files. These files are typically included in the
distribution, and regenerated infrequently. Then, the binding author includes a
call to load-defs
in their G-Wrap wrapset definition, which loads those
API definitions into the wrapset.
The .defs
files are usually produced using the API scanner script,
h2defs.py
, included in the Guile-GNOME source distribution.
Code in this module is only loaded when generating wrapsets; as such, it is not for end users.
As an example, ATK is wrapped with the following code, from
atk/gnome/gw/atk-spec.scm
:
(define-module (gnome gw atk-spec) #:use-module (oop goops) #:use-module (gnome gw support g-wrap) #:use-module (gnome gw gobject-spec) #:use-module (gnome gw support gobject) #:use-module (gnome gw support defs)) (define-class <atk-wrapset> (<gobject-wrapset-base>) #:id 'gnome-atk #:dependencies '(standard gnome-glib gnome-gobject)) (define-method (global-declarations-cg (self <atk-wrapset>)) (list (next-method) "#include <atk/atk.h>\n" "#include <atk/atk-enum-types.h>\n")) (define-method (initialize (ws <atk-wrapset>) initargs) (next-method ws (append '(#:module (gnome gw atk)) initargs)) ;; manually wrap AtkState as a 64 bit uint (add-type-alias! ws "AtkState" 'unsigned-int64) (load-defs-with-overrides ws "gnome/defs/atk.defs"))
The wrapper-specifiction modules are actually installed, along with the .defs files, so that other wrappers which use ATK's types, such as GTK+, can have them available.
A full discussion of the Makefile mechanics of how to generate and compile the C
file, or how to interact with the wrapset objects, is probably prone to bitrot
here. Your best bet is to poke at Guile-GNOME's source, or especially the source
of a module distributed independently of guile-gnome-platform
, such as
guile-gnome-libwnck
.
Further details about the procedural API available for use e.g. within the
wrapset's initialize
function can be found in the documentation for
(gnome gw support gobject)
, and in G-Wrap's documentation.
Load G-Wrap type and function information from file into the G-Wrap wrapset ws.
file should be a relative path, which will be searched in the vicinity of Guile's
%load-path
.include
directives in the file will be searched relative to the absolute path of the file.The following forms are understood:
define-enum
,define-flags
,define-object
,define-interface
,define-pointer
,define-boxed
,define-function
,define-method
,ignore
,ignore-glob
, andignore-types
.The optional argument, overrides, specifies the location of an overrides file that will be spliced into the
.defs
file at the point of an(include overrides)
form.