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 --- Start Guile from C. */ #include <libguile.h> static void inner_main (void *closure, int argc, char **argv) { /* preparation */ scm_shell (argc, argv); /* after exit */ } int main (int argc, char **argv) { scm_boot_guile (argc, argv, inner_main, 0); return 0; /* never reached, see inner_main */ }
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 example program. It
uses pkg-config
to learn about the necessary compiler and
linker flags.
# Use GCC, if you have it installed. CC=gcc # Tell the C compiler where to find <libguile.h> CFLAGS=`pkg-config --cflags guile-3.0` # Tell the linker what libraries to use and where to find them. LIBS=`pkg-config --libs guile-3.0` simple-guile: simple-guile.o ${CC} 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
automatically, making it much simpler and more portable; we recommend
using Autoconf with Guile. Here is a configure.ac file for
simple-guile
that uses the standard PKG_CHECK_MODULES
macro to check for Guile. Autoconf will process this file into a
configure
script. We recommend invoking Autoconf via the
autoreconf
utility.
AC_INIT(simple-guile.c) # Find a C compiler. AC_PROG_CC # Check for Guile PKG_CHECK_MODULES([GUILE], [guile-3.0]) # Generate a Makefile, based on the results. AC_OUTPUT(Makefile)
Run autoreconf -vif
to generate configure
.
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=@GUILE_CFLAGS@ LIBS=@GUILE_LIBS@ simple-guile: simple-guile.o ${CC} 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.ac template, and distribute configure with the application. Here’s how a user might go about building the application:
$ ls Makefile.in configure* configure.ac simple-guile.c $ ./configure checking for gcc... ccache gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether ccache gcc accepts -g... yes checking for ccache gcc option to accept ISO C89... none needed checking for pkg-config... /usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes checking for GUILE... yes configure: creating ./config.status config.status: creating Makefile $ make [...] $ ./simple-guile guile> (+ 1 2 3) 6 guile> (getpwnam "jimb") #("jimb" "83Z7d75W2tyJQ" 4008 10 "Jim Blandy" "/u/jimb" "/usr/local/bin/bash") guile> (exit) $