DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(guile.info.gz) How guile-snarf works

Info Catalog (guile.info.gz) Init Snarfing with guile-snarf (guile.info.gz) Macros guile-snarf recognizes
 
 13.1.1.1 How guile-snarf works
 ..............................
 
 Usage: guile-snarf [-o OUTFILE] [CPP-ARGS ...]
 
    The `guile-snarf' program will extract initialization actions to
 OUTFILE or to standard output when no OUTFILE has been specified or
 when OUTFILE is `-'.  The C preprocessor is called with CPP-ARGS (which
 usually include an input file) and the output is filtered to extract
 the initialization actions.
 
    If there are errors during processing, OUTFILE is deleted and the
 program exits with non-zero status.
 
    During snarfing, the pre-processor macro `SCM_MAGIC_SNARFER' is
 defined.  You could use this to avoid including snarfer output files
 that don't yet exist by writing code like this:
 
      #ifndef SCM_MAGIC_SNARFER
      #include "foo.x"
      #endif
 
    If the environment variable `CPP' is set, use its value instead of
 the C pre-processor determined at Guile configure-time.
 
     Macros guile-snarf recognizes, for a list of the special
 (some would say magic) cpp macros you can use, including the list of
 deprecated macros.
 
    For example, here is how you might define a new subr called
 `clear-image', implemented by the C function `clear_image':
 
      #include <libguile.h>
 
      SCM_DEFINE (clear_image, "clear-image", 1, 0, 0,
                  (SCM image_smob),
                  "Clear the image.")
      #define FUNC_NAME s_clear_image
      {
        /* C code to clear the image in `image_smob'... */
      }
      #undef FUNC_NAME
 
      void
      init_image_type ()
      {
      #include "image-type.x"
      }
 
    The `SCM_DEFINE' declaration says that the C function `clear_image'
 implements a Scheme subr called `clear-image', which takes one required
 argument (of type `SCM' and named `image_smob'), no optional arguments,
 and no rest argument.   Doc Snarfing, for info on the docstring.
 
    This works in concert with `FUNC_NAME' to also define a static array
 of characters named `s_clear_image', initialized to the string
 "clear-image".  The body of `clear_image' may use the array in error
 messages, instead of writing out the literal string; this may save
 string space on some systems.
 
    Assuming the text above lives in a file named `image-type.c', you
 will need to execute the following command to prepare this file for
 compilation:
 
      guile-snarf -o image-type.x image-type.c
 
    This scans `image-type.c' for `SCM_DEFINE' declarations, and writes
 to `image-type.x' the output:
 
      scm_c_define_gsubr (s_clear_image, 1, 0, 0, (SCM (*)() ) clear_image);
 
    When compiled normally, `SCM_DEFINE' is a macro which expands to a
 declaration of the `s_clear_image' string and the function header for
 `clear_image'.
 
    Note that the output file name matches the `#include' from the input
 file.  Also, you still need to provide all the same information you
 would if you were using `scm_c_define_gsubr' yourself, but you can
 place the information near the function definition itself, so it is
 less likely to become incorrect or out-of-date.
 
    If you have many files that `guile-snarf' must process, you should
 consider using a fragment like the following in your Makefile:
 
      snarfcppopts = $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
      .SUFFIXES: .x
      .c.x:
      	guile-snarf -o $ $< $(snarfcppopts)
 
    This tells make to run `guile-snarf' to produce each needed `.x'
 file from the corresponding `.c' file.
 
    The program `guile-snarf' passes its command-line arguments directly
 to the C preprocessor, which it uses to extract the information it
 needs from the source code. this means you can pass normal compilation
 flags to `guile-snarf' to define preprocessor symbols, add header file
 directories, and so on.
 
Info Catalog (guile.info.gz) Init Snarfing with guile-snarf (guile.info.gz) Macros guile-snarf recognizes
automatically generated byinfo2html