Creating Haskell shared libraries on OS X

It is possible to create working shared libraries on 64-bit OS X, with the latest Haskell Platform release (2012.4 64bit)

The invocation line works for me:

ghc -O2 --make \
-no-hs-main -optl '-shared' -optc '-DMODULE=Test' \
-o libTest.so Test.hs module_init.c

module_init.c should be something like:

#define CAT(a,b) XCAT(a,b)
#define XCAT(a,b) a ## b
#define STR(a) XSTR(a)
#define XSTR(a) #a

#include <HsFFI.h>

extern void CAT(__stginit_, MODULE)(void);

static void library_init(void) __attribute__((constructor));
static void library_init(void)
{
  /* This seems to be a no-op, but it makes the GHCRTS envvar work. */
  static char *argv[] = { STR(MODULE) ".so", 0 }, **argv_ = argv;
  static int argc = 1;

  hs_init(&argc, &argv_);
  hs_add_root(CAT(__stginit_, MODULE));
}

static void library_exit(void) __attribute__((destructor));
static void library_exit(void)
{
  hs_exit();
}

This git repo: https://github.com/bennoleslie/haskell-shared-example contains a working example.

All credit goes to this original source: http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)