[glib/issue-1783: 1/4] Add example of using glib-mkenums with Meson



commit 040803b34df400a6b6006187b3d489a51704d81d
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Tue May 21 18:10:24 2019 +0100

    Add example of using glib-mkenums with Meson
    
    We're using Meson for GLib itself, and we recommend people to use it
    for their own projects, so it would be good to have our documentation
    present examples on how to use Meson with our tools.
    
    Let's move the template example into its own section while we're at it,
    since it's referenced by both Meson and Autotools examples.
    
    Fixes: #1783

 docs/reference/gobject/glib-mkenums.xml | 168 +++++++++++++++++++++++---------
 1 file changed, 123 insertions(+), 45 deletions(-)
---
diff --git a/docs/reference/gobject/glib-mkenums.xml b/docs/reference/gobject/glib-mkenums.xml
index 6017001f2..216b71749 100644
--- a/docs/reference/gobject/glib-mkenums.xml
+++ b/docs/reference/gobject/glib-mkenums.xml
@@ -390,52 +390,15 @@ limit. For example, Windows has a limit of 8191 characters.
 </variablelist>
 </refsect1>
 
-<refsect1><title>Using glib-mkenums with Autotools</title>
+<refsect1><title>Using templates</title>
 <para>
-In order to use <command>glib-mkenums</command> in your project when using
-Autotools as the build system, you will first need to modify your
-<filename>configure.ac</filename> file to ensure you find the appropriate
-command using <command>pkg-config</command>, similarly as to how you discover
-the compiler and linker flags for GLib.
-</para>
-<informalexample><programlisting>
-PKG_PROG_PKG_CONFIG([0.28])
-
-PKG_CHECK_VAR([GLIB_MKENUMS], [glib-2.0], [glib_mkenums])
-</programlisting></informalexample>
-<para>
-In your <filename>Makefile.am</filename> file you will typically use rules
-like these:
+Instead of passing the various sections of the generated file to the command
+line of <command>glib-mkenums</command>, it's strongly recommended to use a
+template file, especially for generating C sources.
 </para>
-<informalexample><programlisting>
-# 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)
 
-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
-</programlisting></informalexample>
 <para>
-In the example above, we have a variable called <literal>project_headers</literal>
-where we reference all header files we want to inspect for generating enumeration
-GTypes. In the <filename>enum-types.h</filename> rule we use <command>glib-mkenums</command>
-with a template called <filename>enum-types.h.in</filename> in order to generate the
-header file; a header template file will typically look like this:
+A C header template file will typically look like this:
 </para>
 <informalexample><programlisting>
 /*** BEGIN file-header ***/
@@ -461,10 +424,9 @@ GType @enum_name@_get_type (void) G_GNUC_CONST;
 G_END_DECLS
 /*** END file-tail ***/
 </programlisting></informalexample>
+
 <para>
-The <filename>enum-types.c</filename> rule is similar to the rule for the
-header file, but will use a different <filename>enum-types.c.in</filename> template
-file, similar to this:
+A C source template file will typically look like this:
 </para>
 <informalexample><programlisting>
 /*** BEGIN file-header ***/
@@ -506,6 +468,122 @@ GType
 
 /*** END value-tail ***/
 </programlisting></informalexample>
+
+<para>
+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.
+</para>
+</refsect1>
+
+<refsect1><title>Using glib-mkenums with Meson</title>
+<para>
+Meson supports generating enumeration types using <command>glib-mkenums</command>
+out of the box in its "gnome" module.
+</para>
+
+<para>
+In your <filename>meson.build</filename> file you will typically call the
+<literal>gnome.mkenums()</literal> method with a list of headers to inspect
+and the template files to use:
+</para>
+<informalexample><programlisting>
+project_headers = [
+  'project-foo.h',
+  'project-bar.h',
+  'project-baz.h',
+]
+
+gnome = import('gnome')
+enum_files = gnome.mkenums('enum-types',
+  sources: project_headers,
+  c_template: 'enum-types.c.in',
+  h_template: 'enum-types.h.in',
+)
+</programlisting></informalexample>
+
+<para>
+The <literal>enum_files</literal> variable will contain an array of two elements
+in the following order:
+</para>
+<itemizedlist>
+  <listitem><para>a build target for the source file</para></listitem>
+  <listitem><para>a build target for the header file</para></listitem>
+</itemizedlist>
+<para>
+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:
+</para>
+<informalexample><programlisting>
+mainlib = library('project',
+  sources: project_sources + enum_files,
+  ...
+)
+</programlisting></informalexample>
+<para>
+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:
+</para>
+<informalexample><programlisting>
+mainlib_dep = declare_dependency(sources: enum_files[1], link_with: mainlib)
+</programlisting></informalexample>
+<para>
+You should not include the generates source file, otherwise it will be built
+twice.
+</para>
+</refsect1>
+
+<refsect1><title>Using glib-mkenums with Autotools</title>
+<para>
+In order to use <command>glib-mkenums</command> in your project when using
+Autotools as the build system, you will first need to modify your
+<filename>configure.ac</filename> file to ensure you find the appropriate
+command using <command>pkg-config</command>, similarly as to how you discover
+the compiler and linker flags for GLib.
+</para>
+<informalexample><programlisting>
+PKG_PROG_PKG_CONFIG([0.28])
+
+PKG_CHECK_VAR([GLIB_MKENUMS], [glib-2.0], [glib_mkenums])
+</programlisting></informalexample>
+<para>
+In your <filename>Makefile.am</filename> file you will typically use rules
+like these:
+</para>
+<informalexample><programlisting>
+# 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
+</programlisting></informalexample>
+<para>
+In the example above, we have a variable called <literal>project_headers</literal>
+where we reference all header files we want to inspect for generating enumeration
+GTypes. In the <filename>enum-types.h</filename> rule we use <command>glib-mkenums</command>
+with a template called <filename>enum-types.h.in</filename> in order to generate the
+header file; similarly, in the <filename>enum-types.c</filename> rule we use a
+template called <filename>enum-types.c.in</filename>.
+</para>
 </refsect1>
 
 <refsect1><title>See also</title>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]