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