Next: , Previous: Callbacks, Up: Top


6 Compiling and Linking

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:

prhello-shim.c
This file contains the trampoline functions — one for each declared C extern or callback. It includes the mit-scheme.h header file, found in the AUXDIR directory — e.g. /usr/local/lib/mit-scheme/.
prhello-const.c
This file contains a C program that creates prhello-const.scm. It is compiled and linked as normal for programs using the toolkit, and does not depend on the Scheme machine. It does not actually call any toolkit functions. It just collects information from the compiler about the declared C types and constants.
prhello-types.bin
This file is a fasdumped 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: build
     	echo '(install-shim "$(DESTDIR)" "prhello")' \
     	| mit-scheme --batch-mode
     
     clean:
     	rm prhello-const* prhello-types* prhello-shim* 
     
     build: prhello-shim.so prhello-types.bin prhello-const.bin
     
     prhello-shim.so: prhello-shim.o
     	echo "(link-shim)" \
     	| mit-scheme --batch-mode -- -o $@ $^ `pkg-config --libs gtk+-2.0`
     
     prhello-shim.o: prhello-shim.c
     	echo '(compile-shim)' \
     	| mit-scheme --batch-mode -- `pkg-config --cflags gtk+-2.0` -c $<
     
     prhello-shim.c prhello-const.c prhello-types.bin: prhello.cdecl
     	echo '(generate-shim "prhello" "#include <gtk/gtk.h>")' \
     	| mit-scheme --batch-mode
     
     prhello-const.bin: prhello-const.scm
     	echo '(sf "prhello-const")' | mit-scheme --batch-mode
     
     prhello-const.scm: prhello-const
     	./prhello-const
     
     prhello-const: prhello-const.o
     	$(CC) -o $@ $^ $(LDFLAGS) `pkg-config --libs gtk+-2.0`
     
     prhello-const.o: prhello-const.c
     	$(CC) `pkg-config --cflags gtk+-2.0` $(CFLAGS) -o $@ -c $<