Compiling and Linking - FFI 0.2
Description: FFI 0.2

Next: Hello World, 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 $<