#! /usr/bin/env runhaskell
>
> {-# LANGUAGE FlexibleInstances #-}
>
> import Control.Monad
> import Data.Maybe
> import Data.List
> import Data.Version
> import Distribution.Simple
> import Distribution.Simple.LocalBuildInfo
> import Distribution.Simple.Configure
> import Distribution.Simple.Setup
> import Distribution.Package
> import Distribution.PackageDescription
> import Distribution.Text
> import Text.PrettyPrint.HughesPJ
>
> -- for Cabal 1.4 compatibility
> instance Text [Char] where
> parse = undefined
> disp = text
>
> addToBuildInfo opts binfo = binfo { cppOptions = cppOptions binfo ++ opts }
> addToLibrary opts lib = lib { libBuildInfo = addToBuildInfo opts (libBuildInfo lib) }
> addToExecutable opts exe = exe { buildInfo = addToBuildInfo opts (buildInfo exe) }
> addToPkgDesc opts pkgdesc = pkgdesc
> { library = liftM (addToLibrary opts) (library pkgdesc)
> , executables = map (addToExecutable opts) (executables pkgdesc)
> }
> addToLocalBuildInfo opts lbinfo = lbinfo
> { localPkgDescr = addToPkgDesc opts (localPkgDescr lbinfo) }
>
> -- we detect the base version and add a respective #define
> myPostConf args flags pkgdesc locbuildinfo = do
> let distPref = fromFlag $ configDistPref flags
> deps = packageDeps locbuildinfo
> base = fromJust $ find (\pkg -> display (packageName pkg) == "base") deps
> ver = versionBranch (pkgVersion base)
> major = head ver
> opts = [ "-DBASE_MAJOR_VERSION=" ++ show major ]
> newlocbuildinfo = addToLocalBuildInfo opts locbuildinfo
> putStrLn $ "base version = " ++ concat (intersperse "." $ map show ver)
> writePersistBuildConfig distPref newlocbuildinfo
>
> main = do
> defaultMainWithHooks $
> simpleUserHooks { postConf = myPostConf }
>