mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-27 07:56:14 +01:00
031e65808d
So they are consistent with the way we’re building man pages in other projects, and because some people are allergic to XML. This changes the build-time dependencies from `xsltproc` to `rst2man`, and also takes the opportunity to change the `-Dman` Meson option from a boolean to a feature (so you should use `-Dman-pages={enabled,disabled}` now, rather than `-Dman={true,false}`). Signed-off-by: Philip Withnall <pwithnall@gnome.org> Helps: #3037
491 lines
15 KiB
ReStructuredText
491 lines
15 KiB
ReStructuredText
.. _glib-mkenums(1):
|
||
.. meta::
|
||
:copyright: Copyright 2003 Matthias Clasen
|
||
:copyright: Copyright 2009 Christian Persch
|
||
:copyright: Copyright 2010 Allison Karlitskaya
|
||
:copyright: Copyright 2012, 2013, 2016 Red Hat, Inc.
|
||
:copyright: Copyright 2017, 2019, 2022 Emmanuele Bassi
|
||
:copyright: Copyright 2018, 2020 Centricular
|
||
:copyright: Copyright 2020 Aleksander Morgado
|
||
: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: 2009 Christian Persch
|
||
SPDX-FileCopyrightText: 2010 Allison Karlitskaya
|
||
SPDX-FileCopyrightText: 2012, 2013, 2016 Red Hat, Inc.
|
||
SPDX-FileCopyrightText: 2017, 2019, 2022 Emmanuele Bassi
|
||
SPDX-FileCopyrightText: 2018, 2020 Centricular
|
||
SPDX-FileCopyrightText: 2020 Aleksander Morgado
|
||
SPDX-License-Identifier: LGPL-2.1-or-later
|
||
|
||
============
|
||
glib-mkenums
|
||
============
|
||
|
||
----------------------------------------------
|
||
C language enum description generation utility
|
||
----------------------------------------------
|
||
|
||
SYNOPSIS
|
||
--------
|
||
|
||
| **glib-mkenums** [OPTION…] [FILE…]
|
||
|
||
DESCRIPTION
|
||
-----------
|
||
|
||
``glib-mkenums`` is a small utility that parses C code to extract enum
|
||
definitions and produces enum descriptions based on text templates specified by
|
||
the user. Typically, you can use this tool to generate enumeration
|
||
types for the GType type system, for GObject properties and signal marshalling;
|
||
additionally, you can use it to generate enumeration values of GSettings
|
||
schemas.
|
||
|
||
``glib-mkenums`` takes a list of valid C code files as input. The options
|
||
specified control the text that generated, substituting various keywords
|
||
enclosed in ``@`` characters in the templates.
|
||
|
||
Since version 2.74, GLib provides the ``G_DEFINE_ENUM_TYPE`` and
|
||
``G_DEFINE_FLAGS_TYPE`` C pre-processor macros. These macros can be used to
|
||
define a GType for projects that have few, small enumeration types without going
|
||
through the complexities of generating code at build time.
|
||
|
||
PRODUCTION TEXT SUBSTITUTIONS
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
Certain keywords enclosed in ``@`` characters will be substituted in the
|
||
emitted text. For the substitution examples of the keywords below,
|
||
the following example enum definition is assumed::
|
||
|
||
typedef enum
|
||
{
|
||
PREFIX_THE_XVALUE = 1 << 3,
|
||
PREFIX_ANOTHER_VALUE = 1 << 4
|
||
} PrefixTheXEnum;
|
||
|
||
``@EnumName@``
|
||
|
||
The name of the enum currently being processed, enum names are assumed to be
|
||
properly namespaced and to use mixed capitalization to separate
|
||
words (e.g. ``PrefixTheXEnum``).
|
||
|
||
``@enum_name@``
|
||
|
||
The enum name with words lowercase and word-separated by underscores
|
||
(e.g. ``prefix_the_xenum``).
|
||
|
||
``@ENUMNAME@``
|
||
|
||
The enum name with words uppercase and word-separated by underscores
|
||
(e.g. ``PREFIX_THE_XENUM``).
|
||
|
||
``@ENUMSHORT@``
|
||
|
||
The enum name with words uppercase and word-separated by underscores,
|
||
prefix stripped (e.g. ``THE_XENUM``).
|
||
|
||
``@ENUMPREFIX@``
|
||
|
||
The prefix of the enum name (e.g. ``PREFIX``).
|
||
|
||
``@VALUENAME@``
|
||
|
||
The enum value name currently being processed with words uppercase and
|
||
word-separated by underscores, this is the assumed literal notation of enum
|
||
values in the C sources (e.g. ``PREFIX_THE_XVALUE``).
|
||
|
||
``@valuenick@``
|
||
|
||
A nick name for the enum value currently being processed, this is usually
|
||
generated by stripping common prefix words of all the enum values of the
|
||
current enum, the words are lowercase and underscores are substituted by a
|
||
minus (e.g. ``the-xvalue``).
|
||
|
||
``@valuenum@``
|
||
|
||
The integer value for the enum value currently being processed. If the
|
||
evaluation fails then ``glib-mkenums`` will exit with an
|
||
error status, but this only happens if ``@valuenum@``
|
||
appears in your value production template. (Since: 2.26)
|
||
|
||
``@type@``
|
||
|
||
This is substituted either by ‘enum’ or ‘flags’, depending on whether the
|
||
enum value definitions contained bit-shift operators (e.g. ``flags``).
|
||
|
||
``@Type@``
|
||
|
||
The same as ``@type@`` with the first letter capitalized (e.g. ``Flags``).
|
||
|
||
``@TYPE@``
|
||
|
||
The same as ``@type@`` with all letters uppercased (e.g. ``FLAGS``).
|
||
|
||
``@filename@``
|
||
|
||
The full path of the input file currently being processed
|
||
(e.g. ``/build/environment/project/src/foo.h``).
|
||
|
||
``@basename@``
|
||
|
||
The base name of the input file currently being processed (e.g. ``foo.h``).
|
||
Typically you want to use ``@basename@`` in place of ``@filename@``
|
||
in your templates, to improve the reproducibility of the build. (Since: 2.22)
|
||
|
||
TRIGRAPH EXTENSIONS
|
||
^^^^^^^^^^^^^^^^^^^
|
||
|
||
Some C comments are treated specially in the parsed enum definitions, such
|
||
comments start out with the trigraph sequence ``/*<`` and end with the trigraph
|
||
sequence ``>*/``.
|
||
|
||
The following options can be specified per enum definition:
|
||
|
||
``skip``
|
||
|
||
Indicates this enum definition should be skipped.
|
||
|
||
``flags``
|
||
|
||
Indicates this enum should be treated as a flags definition.
|
||
|
||
``underscore_name``
|
||
|
||
Specifies the word separation used in the ``*_get_type()``
|
||
function. For instance,
|
||
``/*< underscore_name=gnome_vfs_uri_hide_options >*/``.
|
||
|
||
``since``
|
||
|
||
Specifies the version tag that will be used to substitute the ``@enumsince@``
|
||
keyword in the template, useful when documenting methods generated from the
|
||
enums (e.g. ``Since: @enumsince@``). (Since: 2.66)
|
||
|
||
The following options can be specified per value definition:
|
||
|
||
``skip``
|
||
|
||
Indicates the value should be skipped.
|
||
|
||
``nick``
|
||
|
||
Specifies the otherwise auto-generated nickname.
|
||
|
||
Examples::
|
||
|
||
typedef enum /*< skip >*/
|
||
{
|
||
PREFIX_FOO
|
||
} PrefixThisEnumWillBeSkipped;
|
||
typedef enum /*< flags,prefix=PREFIX,since=1.0 >*/
|
||
{
|
||
PREFIX_THE_ZEROTH_VALUE, /*< skip >*/
|
||
PREFIX_THE_FIRST_VALUE,
|
||
PREFIX_THE_SECOND_VALUE,
|
||
PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/
|
||
} PrefixTheFlagsEnum;
|
||
|
||
OPTIONS
|
||
-------
|
||
|
||
``--fhead <TEXT>``
|
||
|
||
Emits ``TEXT`` prior to processing input files.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be prepended to the
|
||
template’s ``file-header`` section.
|
||
|
||
``--fprod <TEXT>``
|
||
|
||
Emits ``TEXT`` every time a new input file is being processed.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be appended to the
|
||
template’s ``file-production`` section.
|
||
|
||
``--ftail <TEXT>``
|
||
|
||
Emits ``TEXT`` after all input files have been processed.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be appended to the
|
||
template’s ``file-tail`` section.
|
||
|
||
``--eprod <TEXT>``
|
||
|
||
Emits ``TEXT`` every time an enum is encountered in the input files.
|
||
|
||
``--vhead <TEXT>``
|
||
|
||
Emits ``TEXT`` before iterating over the set of values of an enum.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be prepended to the
|
||
template’s ``value-header`` section.
|
||
|
||
``--vprod <TEXT>``
|
||
|
||
Emits ``TEXT`` for every value of an enum.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be appended to the
|
||
template’s ``value-production`` section.
|
||
|
||
``--vtail <TEXT>``
|
||
|
||
Emits ``TEXT`` after iterating over all values of an enum.
|
||
|
||
You can specify this option multiple times, and the ``TEXT`` will be
|
||
concatenated.
|
||
|
||
When used along with a template file, ``TEXT`` will be appended to the
|
||
template’s ``value-tail`` section.
|
||
|
||
``--comments <TEXT>``
|
||
|
||
Template for auto-generated comments, the default (for C code generations) is
|
||
``"/* @comment@ */"``.
|
||
|
||
``--template <FILE>``
|
||
|
||
Read templates from the given file. The templates are enclosed in
|
||
specially-formatted C comments::
|
||
|
||
/*** BEGIN section ***/
|
||
/*** END section ***/
|
||
|
||
``section`` may be ``file-header``, ``file-production``, ``file-tail``,
|
||
``enumeration-production``, ``value-header``, ``value-production``,
|
||
``value-tail`` or ``comment``.
|
||
|
||
``--identifier-prefix <PREFIX>``
|
||
|
||
Indicates what portion of the enum name should be interpreted as the prefix
|
||
(e.g. the ``Gtk`` in ``GtkDirectionType``). Normally this will be figured out
|
||
automatically, but you may need to override the default if your namespace is
|
||
capitalized oddly.
|
||
|
||
``--symbol-prefix <PREFIX>``
|
||
|
||
Indicates what prefix should be used to correspond to the identifier prefix in
|
||
related C function names (e.g. the ``gtk`` in
|
||
``gtk_direction_type_get_type``). Equivalently, this is the lowercase version
|
||
of the prefix component of the enum value names (e.g. the ``GTK`` in
|
||
``GTK_DIR_UP``). The default value is the identifier prefix, converted to
|
||
lowercase.
|
||
|
||
``--help``
|
||
|
||
Print brief help and exit.
|
||
|
||
``--version``
|
||
|
||
Print version and exit.
|
||
|
||
``--output <FILE>``
|
||
|
||
Write output to ``FILE`` instead of stdout.
|
||
|
||
``@RSPFILE``
|
||
|
||
When passed as the sole argument, read and parse the actual arguments from
|
||
``RSPFILE``. Useful on systems with a low command-line length limit. For
|
||
example, Windows has a limit of 8191 characters.
|
||
|
||
USING TEMPLATES
|
||
---------------
|
||
|
||
Instead of passing the various sections of the generated file to the command
|
||
line of ``glib-mkenums``, it’s strongly recommended to use a template file,
|
||
especially for generating C sources.
|
||
|
||
A C header template file will typically look like this::
|
||
|
||
/*** BEGIN file-header ***/
|
||
#pragma once
|
||
|
||
/* Include the main project header */
|
||
#include "project.h"
|
||
|
||
G_BEGIN_DECLS
|
||
/*** END file-header ***/
|
||
|
||
/*** BEGIN file-production ***/
|
||
|
||
/* enumerations from "@basename@" */
|
||
/*** END file-production ***/
|
||
|
||
/*** BEGIN value-header ***/
|
||
GType @enum_name@_get_type (void) G_GNUC_CONST;
|
||
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
|
||
/*** END value-header ***/
|
||
|
||
/*** BEGIN file-tail ***/
|
||
G_END_DECLS
|
||
/*** END file-tail ***/
|
||
|
||
A C source template file will typically look like this::
|
||
|
||
/*** BEGIN file-header ***/
|
||
#include "config.h"
|
||
#include "enum-types.h"
|
||
|
||
/*** END file-header ***/
|
||
|
||
/*** BEGIN file-production ***/
|
||
/* enumerations from "@basename@" */
|
||
/*** END file-production ***/
|
||
|
||
/*** BEGIN value-header ***/
|
||
GType
|
||
@enum_name@_get_type (void)
|
||
{
|
||
static GType static_g_@type@_type_id = 0;
|
||
|
||
if (g_once_init_enter_pointer (&static_g_@type@_type_id))
|
||
{
|
||
static const G@Type@Value values[] = {
|
||
/*** END value-header ***/
|
||
|
||
/*** BEGIN value-production ***/
|
||
{ @VALUENAME@, "@VALUENAME@", "@valuenick@" },
|
||
/*** END value-production ***/
|
||
|
||
/*** BEGIN value-tail ***/
|
||
{ 0, NULL, NULL }
|
||
};
|
||
|
||
GType g_@type@_type_id =
|
||
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
||
|
||
g_once_init_leave_pointer (&static_g_@type@_type_id, g_@type@_type_id);
|
||
}
|
||
|
||
return static_g_@type@_type_id;
|
||
}
|
||
|
||
/*** END value-tail ***/
|
||
|
||
Template files are easier to modify and update, and can be used to generate
|
||
various types of outputs using the same command line or tools during the build.
|
||
|
||
USING GLIB-MKENUMS WITH MESON
|
||
-----------------------------
|
||
|
||
Meson supports generating enumeration types using ``glib-mkenums`` out of the
|
||
box in its ``gnome`` module.
|
||
|
||
In your ``meson.build`` file you will typically call the
|
||
``gnome.mkenums_simple()`` method to generate idiomatic enumeration types from a
|
||
list of headers to inspect::
|
||
|
||
project_headers = [
|
||
'project-foo.h',
|
||
'project-bar.h',
|
||
'project-baz.h',
|
||
]
|
||
|
||
gnome = import('gnome')
|
||
enum_files = gnome.mkenums_simple('enum-types',
|
||
sources: project_headers,
|
||
)
|
||
|
||
The ``enum_files`` variable will contain an array of two elements
|
||
in the following order:
|
||
|
||
1. a build target for the source file
|
||
2. 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 + enum_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: enum_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>`_.
|
||
|
||
If you are generating C header and source files that require special templates,
|
||
you can use ``gnome.mkenums()`` to provide those headers, for instance::
|
||
|
||
enum_files = gnome.mkenums('enum-types',
|
||
sources: project_headers,
|
||
h_template: 'enum-types.h.in',
|
||
c_template: 'enum-types.c.in',
|
||
install_header: true,
|
||
)
|
||
|
||
For more information, see the
|
||
`Meson documentation <https://mesonbuild.com/Gnome-module.html#gnomegenmarshal>`_
|
||
for ``gnome.mkenums()``.
|
||
|
||
USING GLIB-MKENUMS WITH AUTOTOOLS
|
||
---------------------------------
|
||
|
||
In order to use ``glib-mkenums`` 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_MKENUMS], [glib-2.0], [glib_mkenums])
|
||
|
||
In your ``Makefile.am`` file you will typically use rules like these::
|
||
|
||
# A list of headers to inspect
|
||
project_headers = \
|
||
project-foo.h \
|
||
project-bar.h \
|
||
project-baz.h
|
||
|
||
enum-types.h: $(project_headers) enum-types.h.in
|
||
$(AM_V_GEN)$(GLIB_MKENUMS) \
|
||
--template=enum-types.h.in \
|
||
--output=$@ \
|
||
$(project_headers)
|
||
|
||
enum-types.c: $(project_headers) enum-types.c.in enum-types.h
|
||
$(AM_V_GEN)$(GLIB_MKENUMS) \
|
||
--template=enum-types.c.in \
|
||
--output=$@ \
|
||
$(project_headers)
|
||
|
||
# Build the enum types files before every other target
|
||
BUILT_SOURCES += enum-types.h enum-types.c
|
||
CLEANFILES += enum-types.h enum-types.c
|
||
EXTRA_DIST += enum-types.h.in enum-types.c.in
|
||
|
||
In the example above, we have a variable called ``project_headers`` where we
|
||
reference all header files we want to inspect for generating enumeration GTypes.
|
||
In the ``enum-types.h`` rule we use ``glib-mkenums`` with a template called
|
||
``enum-types.h.in`` in order to generate the header file; similarly, in the
|
||
``enum-types.c`` rule we use a template called ``enum-types.c.in``.
|
||
|
||
SEE ALSO
|
||
--------
|
||
|
||
`glib-genmarshal(1) <man:glib-genmarshal(1)>`_ |