#! /usr/bin/env runhaskell
> module Main ( main ) where
>
> import Data.Char
> import Data.Maybe
> import Distribution.PackageDescription
> import Distribution.Simple
> import Distribution.Simple.LocalBuildInfo
> import Distribution.Simple.Program
> import Distribution.Simple.Setup
>
> main :: IO ()
> main = defaultMainWithHooks simpleUserHooks
> { hookedPrograms = map simpleProgram programs
> , confHook = configure
> }
>
> programs :: [String]
> programs = ["nix-instantiate", "nix-build", "nix-env", "nix-store"]
>
> configure :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo
> configure (gpd, hbi) flags = do
> lbi' <- confHook simpleUserHooks (gpd, hbi) flags
> let paths = map (\p -> (p, maybe p programPath (lookupProgram (simpleProgram p) (withPrograms lbi)))) programs
> descr = localPkgDescr lbi'
> lib = fromJust (library descr)
> libbi = libBuildInfo lib
> lbi = lbi' { localPkgDescr = descr
> { library = Just (lib { libBuildInfo = libbi { cppOptions = cppOptions libbi ++ map fmtCppArg paths } })
> }
> }
> return lbi
>
> fmtCppArg :: (String, FilePath) -> String
> fmtCppArg (prg, path) = "-DPATH_TO_" ++ map mangle prg ++ "=" ++ show path
> where
> mangle :: Char -> Char
> mangle '-' = '_'
> mangle c = toUpper c