ghc-options-0.1.0.0: src/Language/Haskell/GhcOpts.hs
module Language.Haskell.GhcOpts
( ghcOpts
, module Language.Haskell.GhcOpts.Types
) where
import System.Directory (setCurrentDirectory)
import System.FilePath (takeDirectory)
import Language.Haskell.GhcOpts.Utils
import Language.Haskell.GhcOpts.Types
import Language.Haskell.GhcOpts.Cabal
import Language.Haskell.GhcOpts.Stack
ghcOpts :: FilePath -> IO (Either String Config)
ghcOpts f = fileCommand f >>= newConfig >>= packageConfig
{-
do
-- putStrLn $ "File: " ++ f
cmd <- fileCommand f
-- putStrLn $ "Command: " ++ show cmd
cf0 <- newConfig cmd
-- putStrLn $ "NewCfg: " ++ show cf0
packageConfig cf0
-}
fileCommand :: FilePath -> IO CommandExtra
fileCommand f = do
mCabalFile <- findCabalFile (Just f) >>= traverse absoluteFilePath
return $ emptyCommand { cePath = Just f, ceCabalConfig = mCabalFile}
newConfig :: CommandExtra -> IO Config
newConfig cmd = do
cabal <- traverse (\path -> mkCabalConfig path (ceCabalOptions cmd)) $ ceCabalConfig cmd
stack <- getStackConfig (cePath cmd)
return Config { configGhcOpts = "-O0" : ceGhcOptions cmd
, configCabal = cabal
, configStack = stack }
packageConfig :: Config -> IO (Either String Config)
packageConfig cfg =
case configCabal cfg of
Nothing -> return $ Right cfg
Just c -> (withOpts cfg <$>) <$> packageOptions (configStack cfg) c
withOpts :: Config -> [String] -> Config
withOpts cfg opts = cfg { configGhcOpts = opts ++ configGhcOpts cfg }
packageOptions :: Maybe StackConfig -> CabalConfig -> IO (Either String [String])
packageOptions stack cabal = do
setCurrentDirectory . takeDirectory $ cabalConfigPath cabal
getPackageGhcOpts (cabalConfigPath cabal) stack (cabalConfigOpts cabal)