1<refentry id="glib-genmarshal" lang="en"> 2 3<refentryinfo> 4 <title>glib-genmarshal</title> 5 <productname>GObject</productname> 6 <authorgroup> 7 <author> 8 <contrib>Developer</contrib> 9 <firstname>Emmanuele</firstname> 10 <surname>Bassi</surname> 11 </author> 12 <author> 13 <contrib>Original developer</contrib> 14 <firstname>Tim</firstname> 15 <surname>Janik</surname> 16 </author> 17 </authorgroup> 18</refentryinfo> 19 20<refmeta> 21<refentrytitle>glib-genmarshal</refentrytitle> 22<manvolnum>1</manvolnum> 23<refmiscinfo class="manual">User Commands</refmiscinfo> 24</refmeta> 25 26<refnamediv> 27<refname>glib-genmarshal</refname> 28<refpurpose>C code marshaller generation utility for GLib closures</refpurpose> 29</refnamediv> 30 31<refsynopsisdiv> 32<cmdsynopsis> 33<command>glib-genmarshal</command> 34<arg choice="opt" rep="repeat">OPTION</arg> 35<arg choice="opt" rep="repeat">FILE</arg> 36</cmdsynopsis> 37</refsynopsisdiv> 38 39<refsect1><title>Description</title> 40<para><command>glib-genmarshal</command> is a small utility that generates C code 41marshallers for callback functions of the GClosure mechanism in the GObject 42sublibrary of GLib. The marshaller functions have a standard signature, 43they get passed in the invoking closure, an array of value structures holding 44the callback function parameters and a value structure for the return value 45of the callback. The marshaller is then responsible to call the respective C 46code function of the closure with all the parameters on the stack and to 47collect its return value. 48</para> 49 50<para><command>glib-genmarshal</command> takes a list of marshallers to generate as 51input. The marshaller list is either read from files passed as additional arguments 52on the command line; or from standard input, by using <literal>-</literal> as the 53input file. 54</para> 55 56<refsect2><title>Marshaller list format</title> 57<para> 58The marshaller lists are processed line by line, a line can contain a 59comment in the form of 60<informalexample><programlisting> 61# this is a comment 62</programlisting></informalexample> 63or a marshaller specification of the form 64<programlisting> 65<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable> 66<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable> 67<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable> 68</programlisting> 69</para> 70<para> 71The <replaceable>RTYPE</replaceable> part specifies the callback's return 72type and the <replaceable>PTYPE</replaceable>s right to the colon specify 73the callback's parameter list, except for the first and the last arguments 74which are always pointers. 75</para> 76</refsect2> 77<refsect2><title>Parameter types</title> 78<para> 79Currently, the following types are supported: 80<variablelist> 81<varlistentry> 82<term><replaceable>VOID</replaceable></term> 83<listitem><para> 84indicates no return type, or no extra parameters. 85If <replaceable>VOID</replaceable> is used as the parameter list, no 86additional parameters may be present. 87</para></listitem> 88</varlistentry> 89 90<varlistentry> 91<term><replaceable>BOOLEAN</replaceable></term> 92<listitem><para> 93for boolean types (gboolean) 94</para></listitem> 95</varlistentry> 96 97<varlistentry> 98<term><replaceable>CHAR</replaceable></term> 99<listitem><para> 100for signed char types (gchar) 101</para></listitem> 102</varlistentry> 103 104<varlistentry> 105<term><replaceable>UCHAR</replaceable></term> 106<listitem><para> 107for unsigned char types (guchar) 108</para></listitem> 109</varlistentry> 110 111<varlistentry> 112<term><replaceable>INT</replaceable></term> 113<listitem><para> 114for signed integer types (gint) 115</para></listitem> 116</varlistentry> 117 118<varlistentry> 119<term><replaceable>UINT</replaceable></term> 120<listitem><para> 121for unsigned integer types (guint) 122</para></listitem> 123</varlistentry> 124 125<varlistentry> 126<term><replaceable>LONG</replaceable></term> 127<listitem><para> 128for signed long integer types (glong) 129</para></listitem> 130</varlistentry> 131 132<varlistentry> 133<term><replaceable>ULONG</replaceable></term> 134<listitem><para> 135for unsigned long integer types (gulong) 136</para></listitem> 137</varlistentry> 138 139<varlistentry> 140<term><replaceable>INT64</replaceable></term> 141<listitem><para> 142for signed 64bit integer types (gint64) 143</para></listitem> 144</varlistentry> 145 146<varlistentry> 147<term><replaceable>UINT64</replaceable></term> 148<listitem><para> 149for unsigned 64bit integer types (guint64) 150</para></listitem> 151</varlistentry> 152 153<varlistentry> 154<term><replaceable>ENUM</replaceable></term> 155<listitem><para> 156for enumeration types (gint) 157</para></listitem> 158</varlistentry> 159 160<varlistentry> 161<term><replaceable>FLAGS</replaceable></term> 162<listitem><para> 163for flag enumeration types (guint) 164</para></listitem> 165</varlistentry> 166 167<varlistentry> 168<term><replaceable>FLOAT</replaceable></term> 169<listitem><para> 170for single-precision float types (gfloat) 171</para></listitem> 172</varlistentry> 173 174<varlistentry> 175<term><replaceable>DOUBLE</replaceable></term> 176<listitem><para> 177for double-precision float types (gdouble) 178</para></listitem> 179</varlistentry> 180 181<varlistentry> 182<term><replaceable>STRING</replaceable></term> 183<listitem><para> 184for string types (gchar*) 185</para></listitem> 186</varlistentry> 187 188<varlistentry> 189<term><replaceable>BOXED</replaceable></term> 190<listitem><para> 191for boxed (anonymous but reference counted) types (GBoxed*) 192</para></listitem> 193</varlistentry> 194 195<varlistentry> 196<term><replaceable>PARAM</replaceable></term> 197<listitem><para> 198for GParamSpec or derived types (GParamSpec*) 199</para></listitem> 200</varlistentry> 201 202<varlistentry> 203<term><replaceable>POINTER</replaceable></term> 204<listitem><para> 205for anonymous pointer types (gpointer) 206</para></listitem> 207</varlistentry> 208 209<varlistentry> 210<term><replaceable>OBJECT</replaceable></term> 211<listitem><para> 212for GObject or derived types (GObject*) 213</para></listitem> 214</varlistentry> 215 216<varlistentry> 217<term><replaceable>VARIANT</replaceable></term> 218<listitem><para> 219for GVariant types (GVariant*) 220</para></listitem> 221</varlistentry> 222 223<varlistentry> 224<term><replaceable>NONE</replaceable></term> 225<listitem><para> 226deprecated alias for <replaceable>VOID</replaceable> 227</para></listitem> 228</varlistentry> 229 230<varlistentry> 231<term><replaceable>BOOL</replaceable></term> 232<listitem><para> 233deprecated alias for <replaceable>BOOLEAN</replaceable> 234</para></listitem> 235</varlistentry> 236</variablelist> 237</para> 238</refsect2> 239</refsect1> 240 241<refsect1><title>Options</title> 242<variablelist> 243 244<varlistentry> 245<term><option>--header</option></term> 246<listitem><para> 247Generate header file contents of the marshallers. This option is mutually 248exclusive with the <option>--body</option> option. 249</para></listitem> 250</varlistentry> 251 252<varlistentry> 253<term><option>--body</option></term> 254<listitem><para> 255Generate C code file contents of the marshallers. This option is mutually 256exclusive with the <option>--header</option> option. 257</para></listitem> 258</varlistentry> 259 260<varlistentry> 261<term><option>--prefix=<replaceable>PREFIX</replaceable></option></term> 262<listitem><para> 263Specify marshaller prefix. The default prefix is <literal>`g_cclosure_user_marshal'</literal>. 264</para></listitem> 265</varlistentry> 266 267<varlistentry> 268<term><option>--skip-source</option></term> 269<listitem><para> 270Skip source location remarks in generated comments. 271</para></listitem> 272</varlistentry> 273 274<varlistentry> 275<term><option>--stdinc</option></term> 276<listitem><para> 277Use the standard marshallers of the GObject library, and include 278<filename>glib-object.h</filename> in generated header files. This 279option is mutually exclusive with the <option>--nostdinc</option> 280option. 281</para></listitem> 282</varlistentry> 283 284<varlistentry> 285<term><option>--nostdinc</option></term> 286<listitem><para> 287Do not use the standard marshallers of the GObject library, and skip 288<filename>glib-object.h</filename> include directive in generated header files. 289This option is mutually exclusive with the <option>--stdinc</option> option. 290</para></listitem> 291</varlistentry> 292 293<varlistentry> 294<term><option>--internal</option></term> 295<listitem><para> 296Mark generated functions as internal, using <literal>G_GNUC_INTERNAL</literal>. 297</para></listitem> 298</varlistentry> 299 300<varlistentry> 301<term><option>--valist-marshallers</option></term> 302<listitem><para> 303Generate valist marshallers, for use with <function>g_signal_set_va_marshaller()</function>. 304</para></listitem> 305</varlistentry> 306 307<varlistentry> 308<term><option>-v</option>, <option>--version</option></term> 309<listitem><para> 310Print version information. 311</para></listitem> 312</varlistentry> 313 314<varlistentry> 315<term><option>--g-fatal-warnings</option></term> 316<listitem><para> 317Make warnings fatal, that is, exit immediately once a warning occurs. 318</para></listitem> 319</varlistentry> 320 321<varlistentry> 322<term><option>-h</option>, <option>--help</option></term> 323<listitem><para> 324Print brief help and exit. 325</para></listitem> 326</varlistentry> 327 328<varlistentry> 329<term><option>-v</option>, <option>--version</option></term> 330<listitem><para> 331Print version and exit. 332</para></listitem> 333</varlistentry> 334 335<varlistentry> 336<term><option>--output=FILE</option></term> 337<listitem><para> 338Write output to <replaceable>FILE</replaceable> instead of the standard output. 339</para></listitem> 340</varlistentry> 341 342<varlistentry> 343<term><option>--prototypes</option></term> 344<listitem><para> 345Generate function prototypes before the function definition in the C source 346file, in order to avoid a <literal>missing-prototypes</literal> compiler 347warning. This option is only useful when using the <option>--body</option> 348option. 349</para></listitem> 350</varlistentry> 351 352<varlistentry> 353<term><option>--pragma-once</option></term> 354<listitem><para> 355Use the <literal>once</literal> pragma instead of an old style header guard 356when generating the C header file. This option is only useful when using the 357<option>--header</option> option. 358</para></listitem> 359</varlistentry> 360 361<varlistentry> 362<term><option>--include-header=<replaceable>HEADER</replaceable></option></term> 363<listitem><para> 364Adds a <literal>#include</literal> directive for the given file in the C 365source file. This option is only useful when using the <option>--body</option> 366option. 367</para></listitem> 368</varlistentry> 369 370<varlistentry> 371<term><option>-D <replaceable>SYMBOL[=VALUE]</replaceable></option></term> 372<listitem><para> 373Adds a <literal>#define</literal> C pre-processor directive for 374<replaceable>SYMBOL</replaceable> and its given <replaceable>VALUE</replaceable>, 375or "1" if the value is unset. You can use this option multiple times; if you do, 376all the symbols will be defined in the same order given on the command line, before 377the symbols undefined using the <option>-U</option> option. This option is only 378useful when using the <option>--body</option> option. 379</para></listitem> 380</varlistentry> 381 382<varlistentry> 383<term><option>-U <replaceable>SYMBOL</replaceable></option></term> 384<listitem><para> 385Adds a <literal>#undef</literal> C pre-processor directive to undefine the 386given <replaceable>SYMBOL</replaceable>. You can use this option multiple times; 387if you do, all the symbols will be undefined in the same order given on the 388command line, after the symbols defined using the <option>-D</option> option. 389This option is only useful when using the <option>--body</option> option. 390</para></listitem> 391</varlistentry> 392 393<varlistentry> 394<term><option>--quiet</option></term> 395<listitem><para> 396Minimizes the output of <command>glib-genmarshal</command>, by printing only 397warnings and errors. This option is mutually exclusive with the 398<option>--verbose</option> option. 399</para></listitem> 400</varlistentry> 401 402<varlistentry> 403<term><option>--verbose</option></term> 404<listitem><para> 405Increases the verbosity of <command>glib-genmarshal</command>, by printing 406debugging information. This option is mutually exclusive with the 407<option>--quiet</option> option. 408</para></listitem> 409</varlistentry> 410 411</variablelist> 412</refsect1> 413 414<refsect1><title>Using glib-genmarshal with Autotools</title> 415<para> 416In order to use <command>glib-genmarshal</command> in your project when using 417Autotools as the build system, you will first need to modify your 418<filename>configure.ac</filename> file to ensure you find the appropriate 419command using <command>pkg-config</command>, similarly as to how you discover 420the compiler and linker flags for GLib. 421</para> 422<informalexample><programlisting> 423PKG_PROG_PKG_CONFIG([0.28]) 424 425PKG_CHECK_VAR([GLIB_GENMARSHAL], [glib-2.0], [glib_genmarshal]) 426</programlisting></informalexample> 427<para> 428In your <filename>Makefile.am</filename> file you will typically need very 429simple rules to generate the C files needed for the build. 430</para> 431<informalexample><programlisting> 432marshal.h: marshal.list 433 $(AM_V_GEN)$(GLIB_GENMARSHAL) \ 434 --header \ 435 --output=$@ \ 436 $< 437 438marshal.c: marshal.list marshal.h 439 $(AM_V_GEN)$(GLIB_GENMARSHAL) \ 440 --include-header=marshal.h \ 441 --body \ 442 --output=$@ \ 443 $< 444 445BUILT_SOURCES += marshal.h marshal.c 446CLEANFILES += marshal.h marshal.c 447EXTRA_DIST += marshal.list 448</programlisting></informalexample> 449<para> 450In the example above, the first rule generates the header file and depends on 451a <filename>marshal.list</filename> file in order to regenerate the result in 452case the marshallers list is updated. The second rule generates the source file 453for the same <filename>marshal.list</filename>, and includes the file generated 454by the header rule. 455</para> 456</refsect1> 457 458<refsect1><title>Example</title> 459<para> 460To generate marshallers for the following callback functions: 461</para> 462<informalexample><programlisting> 463void foo (gpointer data1, 464 gpointer data2); 465void bar (gpointer data1, 466 gint param1, 467 gpointer data2); 468gfloat baz (gpointer data1, 469 gboolean param1, 470 guchar param2, 471 gpointer data2); 472</programlisting></informalexample> 473<para> 474The <filename>marshaller.list</filename> file has to look like this: 475</para> 476<programlisting> 477VOID:VOID 478VOID:INT 479FLOAT:BOOLEAN,UCHAR 480</programlisting> 481<para> 482and you call glib-genmarshal like this: 483</para> 484<programlisting> 485glib-genmarshal --header marshaller.list > marshaller.h 486glib-genmarshal --body marshaller.list > marshaller.c 487</programlisting> 488<para> 489The generated marshallers have the arguments encoded in their function name. 490For this particular list, they are 491</para> 492<programlisting> 493g_cclosure_user_marshal_VOID__VOID(...), 494g_cclosure_user_marshal_VOID__INT(...), 495g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR(...). 496</programlisting> 497<para> 498They can be used directly for GClosures or be passed in as the 499GSignalCMarshaller c_marshaller; argument upon creation of signals: 500</para> 501<informalexample><programlisting> 502GClosure *cc_foo, *cc_bar, *cc_baz; 503 504cc_foo = g_cclosure_new (NULL, foo, NULL); 505g_closure_set_marshal (cc_foo, g_cclosure_user_marshal_VOID__VOID); 506cc_bar = g_cclosure_new (NULL, bar, NULL); 507g_closure_set_marshal (cc_bar, g_cclosure_user_marshal_VOID__INT); 508cc_baz = g_cclosure_new (NULL, baz, NULL); 509g_closure_set_marshal (cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR); 510</programlisting></informalexample> 511</refsect1> 512<refsect1><title>See also</title> 513<para> 514<citerefentry> 515<refentrytitle>glib-mkenums</refentrytitle> 516<manvolnum>1</manvolnum> 517</citerefentry> 518</para> 519</refsect1> 520</refentry> 521