mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-07 18:06:15 +01:00
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)>`_
|