Recommended way to conditionally compile modules?
Henning Thielemann
schlepptop at henning-thielemann.de
Sat Jan 16 13:31:37 EST 2010
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.
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.
More information about the Libraries
mailing list