mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-29 00:46:16 +01:00
390 lines
11 KiB
ReStructuredText
390 lines
11 KiB
ReStructuredText
|
.. _glib-genmarshal(1):
|
|||
|
.. meta::
|
|||
|
:copyright: Copyright 2003 Matthias Clasen
|
|||
|
:copyright: Copyright 2005, 2012, 2013, 2016 Red Hat, Inc.
|
|||
|
:copyright: Copyright 2010 Christian Persch
|
|||
|
:copyright: Copyright 2017, 2019, 2020 Emmanuele Bassi
|
|||
|
:copyright: Copyright 2020 Centricular
|
|||
|
:license: LGPL-2.1-or-later
|
|||
|
..
|
|||
|
This has to be duplicated from above to make it machine-readable by `reuse`:
|
|||
|
SPDX-FileCopyrightText: 2003 Matthias Clasen
|
|||
|
SPDX-FileCopyrightText: 2005, 2012, 2013, 2016 Red Hat, Inc.
|
|||
|
SPDX-FileCopyrightText: 2010 Christian Persch
|
|||
|
SPDX-FileCopyrightText: 2017, 2019, 2020 Emmanuele Bassi
|
|||
|
SPDX-FileCopyrightText: 2020 Centricular
|
|||
|
SPDX-License-Identifier: LGPL-2.1-or-later
|
|||
|
|
|||
|
===============
|
|||
|
glib-genmarshal
|
|||
|
===============
|
|||
|
|
|||
|
------------------------------------------------------
|
|||
|
C code marshaller generation utility for GLib closures
|
|||
|
------------------------------------------------------
|
|||
|
|
|||
|
SYNOPSIS
|
|||
|
--------
|
|||
|
|
|||
|
| **glib-genmarshal** [OPTION…] [FILE…]
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
-----------
|
|||
|
|
|||
|
``glib-genmarshal`` is a small utility that generates C code marshallers for
|
|||
|
callback functions of the GClosure mechanism in the GObject sublibrary of GLib.
|
|||
|
The marshaller functions have a standard signature, they get passed in the
|
|||
|
invoking closure, an array of value structures holding the callback function
|
|||
|
parameters and a value structure for the return value of the callback. The
|
|||
|
marshaller is then responsible to call the respective C code function of the
|
|||
|
closure with all the parameters on the stack and to collect its return value.
|
|||
|
|
|||
|
``glib-genmarshal`` takes a list of marshallers to generate as input. The
|
|||
|
marshaller list is either read from files passed as additional arguments
|
|||
|
on the command line; or from standard input, by using ``-`` as the input file.
|
|||
|
|
|||
|
MARSHALLER LIST FORMAT
|
|||
|
^^^^^^^^^^^^^^^^^^^^^^
|
|||
|
|
|||
|
The marshaller lists are processed line by line, a line can contain a comment in
|
|||
|
the form of::
|
|||
|
|
|||
|
# this is a comment
|
|||
|
|
|||
|
or a marshaller specification of the form::
|
|||
|
|
|||
|
RTYPE:PTYPE
|
|||
|
RTYPE:PTYPE,PTYPE
|
|||
|
RTYPE:PTYPE,PTYPE,PTYPE
|
|||
|
…
|
|||
|
|
|||
|
The ``RTYPE`` part specifies the callback’s return type and the ``PTYPE``
|
|||
|
instances right of the colon specify the callback’s parameter list, except for
|
|||
|
the first and the last arguments which are always pointers.
|
|||
|
|
|||
|
PARAMETER TYPES
|
|||
|
^^^^^^^^^^^^^^^
|
|||
|
|
|||
|
Currently, the following types are supported:
|
|||
|
|
|||
|
``VOID``
|
|||
|
|
|||
|
Indicates no return type, or no extra parameters. If ``VOID`` is used as the
|
|||
|
parameter list, no additional parameters may be present.
|
|||
|
|
|||
|
``BOOLEAN``
|
|||
|
|
|||
|
For boolean types (``gboolean``).
|
|||
|
|
|||
|
``CHAR``
|
|||
|
|
|||
|
For signed char types (``gchar``).
|
|||
|
|
|||
|
``UCHAR``
|
|||
|
|
|||
|
For unsigned char types (``guchar``).
|
|||
|
|
|||
|
``INT``
|
|||
|
|
|||
|
For signed integer types (``gint``).
|
|||
|
|
|||
|
``UINT``
|
|||
|
|
|||
|
For unsigned integer types (``guint``).
|
|||
|
|
|||
|
``LONG``
|
|||
|
|
|||
|
For signed long integer types (``glong``).
|
|||
|
|
|||
|
``ULONG``
|
|||
|
|
|||
|
For unsigned long integer types (``gulong``).
|
|||
|
|
|||
|
``INT64``
|
|||
|
|
|||
|
For signed 64-bit integer types (``gint64``).
|
|||
|
|
|||
|
``UINT64``
|
|||
|
|
|||
|
For unsigned 64-bit integer types (``guint64``).
|
|||
|
|
|||
|
``ENUM``
|
|||
|
|
|||
|
For enumeration types (``gint``).
|
|||
|
|
|||
|
``FLAGS``
|
|||
|
|
|||
|
For flag enumeration types (``guint``).
|
|||
|
|
|||
|
``FLOAT``
|
|||
|
|
|||
|
For single-precision float types (``gfloat``).
|
|||
|
|
|||
|
``DOUBLE``
|
|||
|
|
|||
|
For double-precision float types (``gdouble``).
|
|||
|
|
|||
|
``STRING``
|
|||
|
|
|||
|
For string types (``gchar*``).
|
|||
|
|
|||
|
``BOXED``
|
|||
|
|
|||
|
For boxed (anonymous but reference counted) types (``GBoxed*``).
|
|||
|
|
|||
|
``PARAM``
|
|||
|
|
|||
|
For ``GParamSpec`` or derived types (``GParamSpec*``).
|
|||
|
|
|||
|
``POINTER``
|
|||
|
|
|||
|
For anonymous pointer types (``gpointer``).
|
|||
|
|
|||
|
``OBJECT``
|
|||
|
|
|||
|
For ``GObject`` or derived types (``GObject*``).
|
|||
|
|
|||
|
``VARIANT``
|
|||
|
|
|||
|
For ``GVariant`` types (``GVariant*``).
|
|||
|
|
|||
|
``NONE``
|
|||
|
|
|||
|
Deprecated alias for ``VOID``.
|
|||
|
|
|||
|
``BOOL``
|
|||
|
|
|||
|
Deprecated alias for ``BOOLEAN``.
|
|||
|
|
|||
|
OPTIONS
|
|||
|
-------
|
|||
|
|
|||
|
``--header``
|
|||
|
|
|||
|
Generate header file contents of the marshallers. This option is mutually
|
|||
|
exclusive with the ``--body`` option.
|
|||
|
|
|||
|
``--body``
|
|||
|
|
|||
|
Generate C code file contents of the marshallers. This option is mutually
|
|||
|
exclusive with the ``--header`` option.
|
|||
|
|
|||
|
``--prefix <PREFIX>``
|
|||
|
|
|||
|
Specify marshaller prefix. The default prefix is ``g_cclosure_user_marshal``.
|
|||
|
|
|||
|
``--skip-source``
|
|||
|
|
|||
|
Skip source location remarks in generated comments.
|
|||
|
|
|||
|
``--stdinc``
|
|||
|
|
|||
|
Use the standard marshallers of the GObject library, and include
|
|||
|
``glib-object.h`` in generated header files. This option is mutually exclusive
|
|||
|
with the ``--nostdinc`` option.
|
|||
|
|
|||
|
``--nostdinc``
|
|||
|
|
|||
|
Do not use the standard marshallers of the GObject library, and skip the
|
|||
|
``glib-object.h`` include directive in generated header files.
|
|||
|
This option is mutually exclusive with the ``--stdinc`` option.
|
|||
|
|
|||
|
``--internal``
|
|||
|
|
|||
|
Mark generated functions as internal, using ``G_GNUC_INTERNAL``.
|
|||
|
|
|||
|
``-valist-marshallers``
|
|||
|
|
|||
|
Generate ``valist`` marshallers, for use with
|
|||
|
``g_signal_set_va_marshaller()``.
|
|||
|
|
|||
|
``-v``, ``--version``
|
|||
|
|
|||
|
Print version information and exit.
|
|||
|
|
|||
|
``--g-fatal-warnings``
|
|||
|
|
|||
|
Make warnings fatal. That is, exit immediately once a warning occurs.
|
|||
|
|
|||
|
``-h``, ``--help``
|
|||
|
|
|||
|
Print brief help and exit.
|
|||
|
|
|||
|
``--output <FILE>``
|
|||
|
|
|||
|
Write output to ``FILE`` instead of the standard output.
|
|||
|
|
|||
|
``--prototypes``
|
|||
|
|
|||
|
Generate function prototypes before the function definition in the C source
|
|||
|
file, in order to avoid a ``missing-prototypes`` compiler warning. This option
|
|||
|
is only useful when using the ``--body`` option.
|
|||
|
|
|||
|
``--pragma-once``
|
|||
|
|
|||
|
Use the ``once`` pragma instead of an old style header guard
|
|||
|
when generating the C header file. This option is only useful when using the
|
|||
|
``--header`` option.
|
|||
|
|
|||
|
``--include-header <HEADER>``
|
|||
|
|
|||
|
Adds a ``#include`` directive for the given file in the C source file. This
|
|||
|
option is only useful when using the ``--body`` option.
|
|||
|
|
|||
|
``-D <SYMBOL>[=<VALUE>]``
|
|||
|
|
|||
|
Adds a ``#define`` C pre-processor directive for ``SYMBOL`` and its given
|
|||
|
``VALUE``, or ``"1"`` if the value is unset. You can use this option multiple
|
|||
|
times; if you do, all the symbols will be defined in the same order given on
|
|||
|
the command line, before the symbols undefined using the ``-U`` option. This
|
|||
|
option is only useful when using the ``--body`` option.
|
|||
|
|
|||
|
``-U <SYMBOL>``
|
|||
|
|
|||
|
Adds a ``#undef`` C pre-processor directive to undefine the given ``SYMBOL``.
|
|||
|
You can use this option multiple times; if you do, all the symbols will be
|
|||
|
undefined in the same order given on the command line, after the symbols
|
|||
|
defined using the ``-D`` option. This option is only useful when using the
|
|||
|
``--body`` option.
|
|||
|
|
|||
|
``--quiet``
|
|||
|
|
|||
|
Minimizes the output of ``glib-genmarshal``, by printing only warnings and
|
|||
|
errors. This option is mutually exclusive with the ``--verbose`` option.
|
|||
|
|
|||
|
``--verbose``
|
|||
|
|
|||
|
Increases the verbosity of ``glib-genmarshal``, by printing debugging
|
|||
|
information. This option is mutually exclusive with the ``--quiet`` option.
|
|||
|
|
|||
|
USING GLIB-GENMARSHAL WITH MESON
|
|||
|
--------------------------------
|
|||
|
|
|||
|
Meson supports generating closure marshallers using ``glib-genmarshal`` out of
|
|||
|
the box in its ``gnome`` module.
|
|||
|
|
|||
|
In your ``meson.build`` file you will typically call the ``gnome.genmarshal()``
|
|||
|
method with the source list of marshallers to generate::
|
|||
|
|
|||
|
gnome = import('gnome')
|
|||
|
marshal_files = gnome.genmarshal('marshal',
|
|||
|
sources: 'marshal.list',
|
|||
|
internal: true,
|
|||
|
)
|
|||
|
|
|||
|
The ``marshal_files`` variable will contain an array of two elements in the
|
|||
|
following order:
|
|||
|
|
|||
|
* a build target for the source file
|
|||
|
* a build target for the header file
|
|||
|
|
|||
|
You should use the returned objects to provide a dependency on every other
|
|||
|
build target that references the source or header file; for instance, if you
|
|||
|
are using the source to build a library::
|
|||
|
|
|||
|
mainlib = library('project',
|
|||
|
sources: project_sources + marshal_files,
|
|||
|
…
|
|||
|
)
|
|||
|
|
|||
|
Additionally, if you are including the generated header file inside a build
|
|||
|
target that depends on the library you just built, you must ensure that the
|
|||
|
internal dependency includes the generated header as a required source file::
|
|||
|
|
|||
|
mainlib_dep = declare_dependency(sources: marshal_files[1], link_with: mainlib)
|
|||
|
|
|||
|
You should not include the generated source file as well, otherwise it will
|
|||
|
be built separately for every target that depends on it, causing build
|
|||
|
failures. To know more about why all this is required, please refer to the
|
|||
|
`corresponding Meson FAQ entry <https://mesonbuild.com/FAQ.html#how-do-i-tell-meson-that-my-sources-use-generated-headers>`_.
|
|||
|
|
|||
|
For more information on how to use the method, see the
|
|||
|
`Meson documentation <https://mesonbuild.com/Gnome-module.html#gnomegenmarshal>`_
|
|||
|
for ``gnome.genmarshal()``.
|
|||
|
|
|||
|
USING GLIB-GENMARSHAL WITH AUTOTOOLS
|
|||
|
------------------------------------
|
|||
|
|
|||
|
In order to use ``glib-genmarshal`` in your project when using Autotools as the
|
|||
|
build system, you will first need to modify your ``configure.ac`` file to ensure
|
|||
|
you find the appropriate command using ``pkg-config``, similarly as to how you
|
|||
|
discover the compiler and linker flags for GLib::
|
|||
|
|
|||
|
PKG_PROG_PKG_CONFIG([0.28])
|
|||
|
|
|||
|
PKG_CHECK_VAR([GLIB_GENMARSHAL], [glib-2.0], [glib_genmarshal])
|
|||
|
|
|||
|
In your ``Makefile.am`` file you will typically need very simple rules to
|
|||
|
generate the C files needed for the build::
|
|||
|
|
|||
|
marshal.h: marshal.list
|
|||
|
$(AM_V_GEN)$(GLIB_GENMARSHAL) \
|
|||
|
--header \
|
|||
|
--output=$@ \
|
|||
|
$<
|
|||
|
|
|||
|
marshal.c: marshal.list marshal.h
|
|||
|
$(AM_V_GEN)$(GLIB_GENMARSHAL) \
|
|||
|
--include-header=marshal.h \
|
|||
|
--body \
|
|||
|
--output=$@ \
|
|||
|
$<
|
|||
|
|
|||
|
BUILT_SOURCES += marshal.h marshal.c
|
|||
|
CLEANFILES += marshal.h marshal.c
|
|||
|
EXTRA_DIST += marshal.list
|
|||
|
|
|||
|
In the example above, the first rule generates the header file and depends on
|
|||
|
a ``marshal.list`` file in order to regenerate the result in case the
|
|||
|
marshallers list is updated. The second rule generates the source file for the
|
|||
|
same ``marshal.list``, and includes the file generated by the header rule.
|
|||
|
|
|||
|
EXAMPLE
|
|||
|
-------
|
|||
|
|
|||
|
To generate marshallers for the following callback functions::
|
|||
|
|
|||
|
void foo (gpointer data1,
|
|||
|
gpointer data2);
|
|||
|
void bar (gpointer data1,
|
|||
|
gint param1,
|
|||
|
gpointer data2);
|
|||
|
gfloat baz (gpointer data1,
|
|||
|
gboolean param1,
|
|||
|
guchar param2,
|
|||
|
gpointer data2);
|
|||
|
|
|||
|
The ``marshaller.list`` file has to look like this::
|
|||
|
|
|||
|
VOID:VOID
|
|||
|
VOID:INT
|
|||
|
FLOAT:BOOLEAN,UCHAR
|
|||
|
|
|||
|
and you call ``glib-genmarshal`` like this::
|
|||
|
|
|||
|
glib-genmarshal --header marshaller.list > marshaller.h
|
|||
|
glib-genmarshal --body marshaller.list > marshaller.c
|
|||
|
|
|||
|
The generated marshallers have the arguments encoded in their function name.
|
|||
|
For this particular list, they are::
|
|||
|
|
|||
|
g_cclosure_user_marshal_VOID__VOID(...),
|
|||
|
g_cclosure_user_marshal_VOID__INT(...),
|
|||
|
g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR(...).
|
|||
|
|
|||
|
They can be used directly for GClosures or be passed in as the
|
|||
|
``GSignalCMarshaller c_marshaller`` argument upon creation of signals::
|
|||
|
|
|||
|
GClosure *cc_foo, *cc_bar, *cc_baz;
|
|||
|
|
|||
|
cc_foo = g_cclosure_new (NULL, foo, NULL);
|
|||
|
g_closure_set_marshal (cc_foo, g_cclosure_user_marshal_VOID__VOID);
|
|||
|
cc_bar = g_cclosure_new (NULL, bar, NULL);
|
|||
|
g_closure_set_marshal (cc_bar, g_cclosure_user_marshal_VOID__INT);
|
|||
|
cc_baz = g_cclosure_new (NULL, baz, NULL);
|
|||
|
g_closure_set_marshal (cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR);
|
|||
|
|
|||
|
SEE ALSO
|
|||
|
--------
|
|||
|
|
|||
|
`glib-mkenums(1) <man:glib-mkenums(1)>`_
|