The Hugs 98 User's Guide
Prev | Chapter 4. Other ways of running Hugs | Next

# 4.2. Compiling modules that use the Foreign Function Interface

ffihugs [`option`...] [`-i` `include`...] `file` [`cc-arg`...]

Any module that contains `foreign import` declarations must be compiled with ffihugs before it can be loaded into Hugs.

Suppose you have some C functions in `test.c` with some `foreign import` declarations for those functions in `HTest.hs`, and that the code in `test.c` needs to be compiled with `-lm`. To use these with Hugs, you must first use ffihugs to generate `HTest.c`, compile it and link it against `test.c` with `-lm` to produce an object file (`HTest.so` on Unix, `HTest.dll` on Windows):

    ffihugs HTest.hs test.c -lm

Any Hugs options should be placed before the module name, as in

    ffihugs -98 HTest.hs test.c -lm

Now you can run Hugs as normal:

    hugs -98 HTest.hs

When `HTest.hs` is loaded, Hugs will load the corresponding object file and then use the imported functions. (If `HTest.hs` depends on other modules using foreign functions, you'll have to have compiled those modules too, but not necessarily before compiling `HTest.hs`.)

> Note: Because ffihugs generates a C file with the same base name as the Haskell source file, any auxiliary C files should avoid that name.

In the standard FFI, each `foreign import` declaration should name a C header file containing the prototype of the function. Because this is often cumbersome, ffihugs provides the following additional option:

`-i` `include`

  Specify an include for the generated C file. The `include` string should be something that can follow "`#include`" in a C program, as in

      ffihugs '-i<math.h>' '-i"mydefs.h"' Test.hs test.c -lm

  Note the necessary quoting of the `-i` options here.

Prev | Home | Next
Other ways of running Hugs | Up | Graphical interface for Windows