mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 16:32:18 +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)>`_
 |