GNU Info

Info Node: (guile.info)A Sample Guile Main Program

(guile.info)A Sample Guile Main Program


Prev: Guile Initialization Functions Up: Linking Programs With Guile
Enter node , (file) or (file)node

A Sample Guile Main Program
---------------------------

Here is `simple-guile.c', source code for a `main' and an `inner_main'
function that will produce a complete Guile interpreter.

     /* simple-guile.c --- how to start up the Guile
        interpreter from C code.  */
     
     /* Get declarations for all the scm_ functions.  */
     #include <libguile.h>
     
     static void
     inner_main (void *closure, int argc, char **argv)
     {
       /* module initializations would go here */
       scm_shell (argc, argv);
     }
     
     int
     main (int argc, char **argv)
     {
       scm_boot_guile (argc, argv, inner_main, 0);
       return 0; /* never reached */
     }

The `main' function calls `scm_boot_guile' to initialize Guile, passing
it `inner_main'.  Once `scm_boot_guile' is ready, it invokes
`inner_main', which calls `scm_shell' to process the command-line
arguments in the usual way.

Here is a Makefile which you can use to compile the above program.
     # Use GCC, if you have it installed.
     CC=gcc
     
     # Tell the C compiler where to find <libguile.h> and -lguile.
     CFLAGS=-I/usr/local/include -L/usr/local/lib
     
     # Include -lqt and -lrx if they are present on your system.
     LIBS=-lguile -lqt -lrx -lm
     
     simple-guile: simple-guile.o
             ${CC} ${CFLAGS} simple-guile.o ${LIBS} -o simple-guile
     simple-guile.o: simple-guile.c
             ${CC} -c ${CFLAGS} simple-guile.c

If you are using the GNU Autoconf package to make your application more
portable, Autoconf will settle many of the details in the Makefile above
automatically, making it much simpler and more portable; we recommend
using Autoconf with Guile.  Here is a `configure.in' file for
`simple-guile', which Autoconf can use as a template to generate a
`configure' script:
     AC_INIT(simple-guile.c)
     
     # Find a C compiler.
     AC_PROG_CC
     
     # Check for libraries.
     AC_CHECK_LIB(m, sin)
     AC_CHECK_LIB(rx, regcomp)
     AC_CHECK_LIB(qt, main)
     AC_CHECK_LIB(guile, scm_boot_guile)
     
     # Generate a Makefile, based on the results.
     AC_OUTPUT(Makefile)

Here is a `Makefile.in' template, from which the `configure' script
produces a Makefile customized for the host system:
     # The configure script fills in these values.
     CC=@CC@
     CFLAGS=@CFLAGS@
     LIBS=@LIBS@
     
     simple-guile: simple-guile.o
             ${CC} ${CFLAGS} simple-guile.o ${LIBS} -o simple-guile
     simple-guile.o: simple-guile.c
             ${CC} -c ${CFLAGS} simple-guile.c

The developer should use Autoconf to generate the `configure' script
from the `configure.in' template, and distribute `configure' with the
application.  Here's how a user might go about building the application:

     $ ls
     Makefile.in     configure*      configure.in    simple-guile.c
     $ ./configure
     creating cache ./config.cache
     checking for gcc... gcc
     checking whether the C compiler (gcc  ) works... yes
     checking whether the C compiler (gcc  ) is a cross-compiler... no
     checking whether we are using GNU C... yes
     checking whether gcc accepts -g... yes
     checking for sin in -lm... yes
     checking for regcomp in -lrx... yes
     checking for main in -lqt... yes
     checking for scm_boot_guile in -lguile... yes
     updating cache ./config.cache
     creating ./config.status
     creating Makefile
     $ make
     gcc -c -g -O2 simple-guile.c
     gcc -g -O2 simple-guile.o -lguile -lqt -lrx -lm  -o simple-guile
     $ ./simple-guile
     guile> (+ 1 2 3)
     6
     guile> (getpwnam "jimb")
     #("jimb" "83Z7d75W2tyJQ" 4008 10 "Jim Blandy" "/u/jimb"
       "/usr/local/bin/bash")
     guile> (exit)
     $


automatically generated by info2www version 1.2.2.9