Recommended way to conditionally compile modules?

Sean Leather leather at
Sun Jan 17 16:37:47 EST 2010

Henning Thielemann wrote:

> Bryan O'Sullivan schrieb:
>  I have a source base that contains a number of source files that use APIs
>> that vary by platform: every platform provides select, most provide poll,
>> BSDs provide kqueue, and Linux provides epoll. I already have autoconf tests
>> for these functions, and I'd like to use the results of those autoconf
>> checks to determine which modules to compile, but I am unable to figure out
>> how to do this in my .cabal or .buildinfo file. (I /could/ have explicit os
>> conditionals in there, but that's ugly.)
>> Right now, I'm just building all of the modules, and conditionally giving
>> them bodies as follows:
>> module System.Event.EPoll where
>> #if defined(HAVE_EPOLL)
>> ...
>> #endif
>> The trouble with this is twofold. I have to export everything in the
>> module (because its contents vary depending on where I compile it), and the
>> CPP macros there are ugly. Is there a better solution?
> This means that modules with the same name have different set of functions,
> depending on OS? I think this is generally unsafe, because other packages
> would have to check what API to expect according to the OS.

I agree. This definitely causes problems. In fact, I believe just such CPP
results in difficulty using the network package with Happstack on the Mac by
ifdef-ing out the IPv6 support.

Whereever possible I try to use conditional Hs-Source-Dirs in Cabal for
> selecting OS specific modules, but all of the directories must contain the
> same set of module names and modules with the same name must have the same
> interface.
> If modules have different APIs then I would give them different names and
> put them even in different packages. Then, say, presence of package poll-bsd
> means to the package user, that BSD functionality is available. Whether he
> is actually running BSD or whether the package simulates BSD functions
> doesn't matter.

Another option is to move the CPP to Haskell, so that all the functions are
the same and the capability check is dynamic. This isn't necessarily better,
of course.

-------------- next part --------------
An HTML attachment was scrubbed...

More information about the Libraries mailing list