module Main (main) where import Data.List import Distribution.Simple import Distribution.PackageDescription import Distribution.Setup import Distribution.Simple.LocalBuildInfo import System.Environment main :: IO () main = do args <- getArgs let (ghcArgs, args') = extractGhcArgs args (_, args'') = extractConfigureArgs args' hooks = defaultUserHooks { buildHook = add_ghc_options ghcArgs $ buildHook defaultUserHooks } withArgs args'' $ defaultMainWithHooks hooks extractGhcArgs :: [String] -> ([String], [String]) extractGhcArgs = extractPrefixArgs "--ghc-option=" extractConfigureArgs :: [String] -> ([String], [String]) extractConfigureArgs = extractPrefixArgs "--configure-option=" extractPrefixArgs :: String -> [String] -> ([String], [String]) extractPrefixArgs the_prefix args = let f [] = ([], []) f (x:xs) = case f xs of (wantedArgs, otherArgs) -> case removePrefix the_prefix x of Just wantedArg -> (wantedArg:wantedArgs, otherArgs) Nothing -> (wantedArgs, x:otherArgs) in f args removePrefix :: String -> String -> Maybe String removePrefix "" ys = Just ys removePrefix _ "" = Nothing removePrefix (x:xs) (y:ys) | x == y = removePrefix xs ys | otherwise = Nothing type Hook a = PackageDescription -> LocalBuildInfo -> UserHooks -> a -> IO () -- We can't give a type signature as Cabal < 1.1.7 has Maybe UserHooks -- where we have UserHooks. -- add_ghc_options :: [String] -> Hook a -> Hook a add_ghc_options args f pd lbi uhs x = do let lib' = case library pd of Just lib -> let bi = libBuildInfo lib opts = options bi ++ [(GHC, args)] bi' = bi { options = opts } in lib { libBuildInfo = bi' } Nothing -> error "Expected a library" pd' = pd { library = Just lib' } f pd' lbi uhs x