| .. _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)>`_ |