ghc-mod/Cabal.hs

80 lines
2.7 KiB
Haskell
Raw Normal View History

2012-03-23 17:05:38 +00:00
{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
2012-02-06 09:07:32 +00:00
2013-02-12 07:24:33 +00:00
module Cabal (initializeGHC, getDirs, fromCabal) where
2011-05-24 07:18:22 +00:00
2013-03-01 06:25:43 +00:00
import CabalApi
2011-11-29 18:02:55 +00:00
import Control.Applicative
import Control.Exception
2011-10-18 03:09:25 +00:00
import Control.Monad
2011-08-24 06:58:12 +00:00
import CoreMonad
2011-05-24 07:18:22 +00:00
import Data.List
import Distribution.PackageDescription (BuildInfo(..), usedExtensions)
import Distribution.Text (display)
2011-08-24 07:50:26 +00:00
import ErrMsg
2011-05-24 07:18:22 +00:00
import GHC
2012-02-14 07:09:53 +00:00
import GHCApi
2012-02-16 05:44:20 +00:00
import GHCChoice
2011-05-24 07:18:22 +00:00
import System.Directory
import System.FilePath
import Types
----------------------------------------------------------------
2011-10-18 03:22:48 +00:00
importDirs :: [String]
2011-12-19 06:54:46 +00:00
importDirs = [".","..","../..","../../..","../../../..","../../../../.."]
2011-10-18 03:22:48 +00:00
2013-03-01 07:42:22 +00:00
initializeGHC :: Options -> FilePath -> [String] -> Bool -> Ghc LogReader
2012-02-16 05:44:20 +00:00
initializeGHC opt fileName ghcOptions logging = withCabal ||> withoutCabal
where
2012-02-15 05:52:48 +00:00
withoutCabal = do
logReader <- initSession opt ghcOptions importDirs Nothing logging
2013-03-01 07:42:22 +00:00
return logReader
withCabal = do
2013-02-12 07:24:33 +00:00
(gopts,idirs,depPkgs) <- liftIO $ fromCabal ghcOptions
logReader <- initSession opt gopts idirs (Just depPkgs) logging
2013-03-01 07:42:22 +00:00
return logReader
2013-02-12 07:24:33 +00:00
fromCabal :: [String] -> IO ([String], [FilePath], [String])
fromCabal ghcOptions = do
(owdir,cdir,cfile) <- getDirs
cabal <- cabalParseFile cfile
2013-03-01 04:14:46 +00:00
let binfo@BuildInfo{..} = cabalBuildInfo cabal
let exts = map (("-X" ++) . display) $ usedExtensions binfo
lang = maybe "-XHaskell98" (("-X" ++) . display) defaultLanguage
2013-02-12 07:24:33 +00:00
libs = map ("-l" ++) extraLibs
libDirs = map ("-L" ++) extraLibDirs
gopts = ghcOptions ++ exts ++ [lang] ++ libs ++ libDirs
idirs = case hsSourceDirs of
[] -> [cdir,owdir]
dirs -> map (cdir </>) dirs ++ [owdir]
2013-03-01 06:25:43 +00:00
let depPkgs = removeMe cfile $ cabalAllDependPackages cabal
2013-02-12 07:24:33 +00:00
return (gopts,idirs,depPkgs)
2011-05-24 07:18:22 +00:00
removeMe :: FilePath -> [String] -> [String]
removeMe cabalfile depPkgs = filter (/= me) depPkgs
where
me = dropExtension $ takeFileName cabalfile
2011-05-24 07:18:22 +00:00
----------------------------------------------------------------
-- CurrentWorkingDir, CabalDir, CabalFile
getDirs :: IO (FilePath,FilePath,FilePath)
2011-05-24 07:18:22 +00:00
getDirs = do
2011-08-24 06:58:12 +00:00
wdir <- getCurrentDirectory
(cdir,cfile) <- cabalDir wdir
return (wdir,cdir,cfile)
2011-05-24 07:18:22 +00:00
-- Causes error, catched in the upper function.
-- CabalDir, CabalFile
cabalDir :: FilePath -> IO (FilePath,FilePath)
2011-05-24 07:18:22 +00:00
cabalDir dir = do
2011-10-18 03:09:25 +00:00
cnts <- (filter isCabal <$> getDirectoryContents dir)
2011-10-19 05:22:28 +00:00
>>= filterM (\file -> doesFileExist (dir </> file))
let dir' = takeDirectory dir
2011-10-18 03:09:25 +00:00
case cnts of
[] | dir' == dir -> throwIO $ userError "No cabal file"
| otherwise -> cabalDir dir'
cfile:_ -> return (dir,dir </> cfile)
2011-05-24 07:18:22 +00:00
where
isCabal name = ".cabal" `isSuffixOf` name && length name > 6