Difference between revisions of "FFI imports packaging utility"

From HaskellWiki
Jump to navigation Jump to search
Line 51: Line 51:
   
 
==== Preprocessing Header Files ====
 
==== Preprocessing Header Files ====
  +
  +
A small include file is created, containing <code>#include</code> statements for all the files listed on the '''ffipkg''' command line.
  +
  +
The '''C''' preprocessor is invoked with command line options <code>-E -dD</code> to preprocess the include file mentioned in the previous paragraph.
   
 
==== Generating FFI Imports ====
 
==== Generating FFI Imports ====

Revision as of 04:35, 28 January 2006

Note: This page contains a progressing draft of the documentation for an extension to HSFFIG to create Haskell packages for FFI imports. Once this page is complete this note will be removed. Dimitry Golubovsky

The FFI Packaging Utility

Abstract

This document contains user manual for the FFI Packaging Utility (ffipkg) which is an extension to HSFFIG.

It is expected that readers of this document first make themselves familiar with the following Wiki pages:

Why Package FFI Imports

Typically, when building a Haskell applications calling foreign functions from some library directly, certain things are taken into consideration such as location of the library header files and the library itself.

The hsffig tool automatically preprocesses library header files and generates FFI import statements for all foreign functions (with few exceptions like variadic functions and functions taking/returning structures) as well as function declarations to access members of C structures and unions.

As a result of such automatic FFI import generation, substantial amount of Haskell code is created which in turn results in subatantial time to compile it.

The Cabal tool assists in creation of packages. Usually Haskell packages contain reusable libraries of modules written in Haskell.

The ffipkg utility serves the purpose to bridge FFI imports and packaging. With FFI packages, locations of foreign libraries and header files need to be remembered only once, during package creation. The Haskell code created during the automated FFI import process needs to be compiled only once, thus reducing the time to compile applications using the foreign library.

Command Line Options

Usage: ffipkg [OPTION...] include-file...
  -v      --verbose              provide verbose output
  -s      --static               prefer static libraries
  -i      --header               stop after writing package include file
  -?, -h  --help                 print this help message
  -I                             include files location (may be multiple)
  -L                             library files location (may be multiple)
  -l                             library file to link (may be multiple)
  -V      --version              show version number
  -w 0.0  --package-version=0.0  specify version of the package
  -p      --package-name=        name the package (will be uppercased)
          --with-make=make       path to make
          --with-awk=awk         path to awk
          --with-ar=ar           path to ar
          --with-ghc=ghc         path to ghc
          --with-gcc=gcc         path to gcc
          --with-hsc2hs=hsc2hs   path to hsc2hs

How It Works

The ffipkg utility is a toplevel driver integrating functionality of hsffig and splitter (see the HSFFIG Tutorial), and also implementing the logic described in the HSFFIG Linkage Optimization notes. It accepts user's command line options and arguments, checks availability of the programs needed to build a package, converts C header files into Haskell FFI declarations, creates Makefile, and the Setup.hs file for integration with Cabal.

The following subsections describe this process in deeper details.

Preprocessing Header Files

A small include file is created, containing #include statements for all the files listed on the ffipkg command line.

The C preprocessor is invoked with command line options -E -dD to preprocess the include file mentioned in the previous paragraph.

Generating FFI Imports

Splitting Haskell Sources

Building Package Libraries

Integration with Cabal

Working Examples

Hello World

Berkeley DB

X11 Transport Protocol

Conclusion