The c-generate
procedure takes a library name and an
optional preamble. It reads the library.cdecl file and
writes two .c files. The preamble is included at the top of
both. It typically contains #include
C pre-processor
directives required by the C library, but could include additional
shim code. Here is a short script that generates a shim for the
example “Hello, World!” program.
(load-option 'FFI) (c-generate "prhello" "#include <gtk/gtk.h>")
This script will produce three files:
AUXDIR
directory —
e.g. /usr/local/lib/mit-scheme/.
c-includes
structure containing all of
the types, constants and functions declared in the .cdecl file.
The following Makefile rules describe the process of building and installing a shim for the example “Hello, World!” program.
install-example: build-example $(INSTALL_DATA) prhello-types.bin ../lib/. $(INSTALL_DATA) prhello-const.bin ../lib/. $(INSTALL_DATA) prhello-shim.so ../lib/. build-example: prhello-shim.so prhello-types.bin prhello-const.bin prhello-shim.so: prhello-shim.o $(CC) -shared -fPIC -o $@ $^ `pkg-config --libs gtk+-2.0` prhello-shim.o: prhello-shim.c $(CC) -I../lib -Wall -fPIC `pkg-config --cflags gtk+-2.0` -o $@ -c $< prhello-shim.c prhello-const.c prhello-types.bin: prhello.cdecl (echo "(load-option 'FFI)"; \ echo '(C-generate "prhello" "#include <gtk/gtk.h>")') \ | ../microcode/scheme --library ../lib --batch-mode prhello-const.bin: prhello-const.scm echo '(sf "prhello-const")' | mit-scheme --compiler --batch-mode prhello-const.scm: prhello-const ./prhello-const prhello-const: prhello-const.o @rm -f $@ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ `pkg-config --libs gtk+-2.0` prhello-const.o: prhello-const.c $(CC) `pkg-config --cflags gtk+-2.0` $(CFLAGS) -o $@ -c $<