mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 10:08:56 +01:00 
			
		
		
		
	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)>`_ |