[Haskell-cafe] Cabal HackORama -- how to handle par and pseq on
stable platforms
John D. Ramsdell
ramsdell0 at gmail.com
Tue Nov 10 18:06:31 EST 2009
I am writing a Cabal file for an application that uses par and pseq.
I want to support both modern distributions of GHC and the version
that comes with Ubuntu Hardy Heron, a Long Term Support version of
Ubuntu that will be retired in April 2011. It provides GHC 6.8.2
with Cabal 1.2.3.0 and no parallel package. You might be interested
in my solution to supporting both releases.
I did the obvious in my Cabal file. A defined a flag as follows:
-- Disable with -f-par option during configuration.
Flag Par
Description: Enable use of the parallel construct par
Default: True
The description of the executable includes:
if flag(par)
Cpp-Options: -DHAVE_PAR
GHC-Options: -threaded
Build-Depends: parallel
The C preprocessor is used to toggle between a parallel version of map
and the usual one.
#if defined HAVE_PAR
parMap :: (a -> b) -> [a] -> [b]
parMap _ [] = []
parMap f (x:xs) =
par y (pseq ys (y:ys))
where
y = f x
ys = parMap f xs
#else
parMap :: (a -> b) -> [a] -> [b]
parMap = map
#endif
Here is what makes this cabal file sweet. Cabal 1,2,3.0 supports
flags, but ignores the Default specification. It assumes the default
value of every flag is False. Thus, for both modern versions of GHC
and the one on Hardy Heron, no user supplied flags are required during
configuration.
John
More information about the Haskell-Cafe
mailing list