cabal-ghci 0.1.1 → 0.2.0
raw patch · 2 files changed
+65/−22 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Distribution.Dev.Interactive: Pkg :: FilePath -> PackageDescription -> LoadCabalRet
+ Distribution.Dev.Interactive: Pkg :: FilePath -> PackageDescription -> (Maybe LocalBuildInfo) -> LoadCabalRet
- Distribution.Dev.Interactive: packageOpts :: FilePath -> PackageDescription -> String -> Maybe [String]
+ Distribution.Dev.Interactive: packageOpts :: FilePath -> PackageDescription -> Maybe LocalBuildInfo -> String -> Maybe [String]
Files
- Distribution/Dev/Interactive.hs +62/−19
- cabal-ghci.cabal +3/−3
Distribution/Dev/Interactive.hs view
@@ -18,17 +18,25 @@ import Distribution.PackageDescription import Distribution.PackageDescription.Parse import Distribution.PackageDescription.Configuration+import Distribution.Simple.PackageIndex+import Distribution.Simple.LocalBuildInfo hiding (compiler)+import Data.Version import System.FilePath import System.Directory import System.Info import Data.Maybe+import Data.Either+import Control.Exception+import Data.List +type Deps = [(PackageName, Version)]+ -- | Return value for 'loadCabal' data LoadCabalRet = NoCabalFile | -- ^ No cabal file found MissingDeps [Dependency] | -- ^ Missing dependencies- Pkg FilePath PackageDescription -- ^ Successful loading and parsing of cabal file+ Pkg FilePath PackageDescription (Maybe LocalBuildInfo) -- ^ Successful loading and parsing of cabal file deriving Show compiler ∷ CompilerId@@ -38,10 +46,11 @@ packageOpts ∷ FilePath -- ^ path to the .cabal file → PackageDescription -- ^ parsed package description+ → Maybe LocalBuildInfo -- ^ parsed build config → String -- ^ name of executable → Maybe [String]-packageOpts path pkg executable =- maybe Nothing (\bi → Just $ includeOpts path bi ++ extensionOpts bi ++ customOpts bi) $+packageOpts path pkg mlbi executable =+ maybe Nothing (\bi → Just $ ghcOpts path bi (listDeps bi =<< mlbi)) $ listToMaybe $ if executable == "" then allBuildInfo pkg@@ -50,19 +59,35 @@ filter (\x → exeName x == executable) . executables $ pkg -customOpts ∷ BuildInfo → [String]-customOpts bi = - hcOptions buildCompilerFlavor bi--extensionOpts ∷ BuildInfo → [String]-extensionOpts bi =- map (\x → "-X" ++ display x) $ allExtensions bi+listDeps ∷ BuildInfo → LocalBuildInfo → Maybe Deps+listDeps bi lbi = sequence $ map find reqs + where+ reqs = targetBuildDepends bi+ db = installedPkgs lbi+ find dep@(Dependency pkg _) = do+ (fst . head → ver) ← return $ lookupDependency db dep+ return (pkg, ver) -includeOpts ∷ FilePath → BuildInfo → [String]-includeOpts path bi =- ["-i" ++ dir ++ "/dist/build/autogen"] ++- map (("-i"++) . combine dir) (hsSourceDirs bi)- where dir = takeDirectory path+-- | GHC options for a 'BuildInfo'+ghcOpts ∷ FilePath → BuildInfo → Maybe Deps → [String]+ghcOpts path bi deps = concat $ + maybe [] ((noPkgs:) . add "-package=" . map addDep) deps :+ map ($ bi) [+ hcOptions buildCompilerFlavor,+ addf "-X" display . allExtensions,+ addf "-i" (combine dir) . ("/dist/build/autogen":) . hsSourceDirs,+ add "-optP" . cppOptions,+ add "-optc" . ccOptions,+ add "-optl" . ldOptions+ -- TODO frameworks cSources otherModules extraLibs extraLibsDirs includes + ]+ where+ dir = takeDirectory path+ add s = map (s++)+ addf ∷ String → (a → String) → [a] → [String]+ addf s f = map ((s++) . f)+ noPkgs = "-hide-all-packages"+ addDep (PackageName pkg, showVersion → ver) = pkg ++ "-" ++ ver -- | Load the current cabal project file and parse it loadCabal@@ -74,11 +99,29 @@ flip (maybe (return NoCabalFile)) mCabalFile $ \cabalFile → do gdescr ← readPackageDescription normal cabalFile+ mlbi ← loadCabalConfig (takeDirectory cabalFile `combine` "dist" `combine` "setup-config") case finalizePackageDescription flags (const True) buildPlatform compiler [] gdescr of Left deps → return $ MissingDeps deps- Right (descr, _) → return $ Pkg cabalFile descr+ Right (descr, _) → return $ Pkg cabalFile descr mlbi +maybeNth ∷ Int → [a] → Maybe a+maybeNth 0 (x:_) = Just x+maybeNth n (_:xs) = maybeNth (n-1) xs+maybeNth _ _ = Nothing++maybeRead s = case reads s of [(a, "")] → Just a; _ → Nothing++-- | Load the 'LocalBuildInfo' from dist/setup-config+loadCabalConfig ∷ FilePath → IO (Maybe LocalBuildInfo)+loadCabalConfig path = + -- TODO: don't ignore all exceptions+ fmap (either ignore id) $ try $+ fmap ((maybeRead =<<) . maybeNth 1 . lines) $ readFile path+ where+ ignore ∷ SomeException → Maybe a+ ignore _ = Nothing+ -- | Find a .cabal file in the path or any of it's parent directories lookForCabalFile ∷ FilePath -- ^ canonicalised path@@ -117,8 +160,8 @@ case ret of NoCabalFile → err "Current directory is not a cabal project" MissingDeps deps → err $ "Missing dependencies: " ++ unwords (map show deps)- Pkg path descr → do- let mopts = packageOpts path descr executable+ Pkg path descr mlbi → do+ let mopts = packageOpts path descr mlbi executable case mopts of Nothing → err ( if executable /= ""@@ -142,7 +185,7 @@ -- $ head -n 4 >> ~/.ghci -- :m + Distribution.Dev.Interactive -- :def cabalset cabalSet--- :cabalset+-- :cabalset -fcabal-ghci -- :m - Distribution.Dev.Interactive -- @
cabal-ghci.cabal view
@@ -1,5 +1,5 @@ Name: cabal-ghci-Version: 0.1.1+Version: 0.2.0 Synopsis: Set up ghci with options taken from a .cabal file Description: The executable cabal-ghci runs ghci with the paths and extensions needed by a cabal project. The cabalSet function can be added to your .ghci to provide the same functionality at runtime, giving you more control over the options that are set. Homepage: http://code.atnnn.com/projects/cabal-ghci/wiki@@ -17,10 +17,10 @@ Executable cabal-ghci Main-is: CabalGHCI.hs- extensions: UnicodeSyntax+ extensions: UnicodeSyntax, ViewPatterns build-depends: process Library Exposed-modules: Distribution.Dev.Interactive Build-depends: Cabal, base == 4.*, directory, filepath- extensions: UnicodeSyntax+ extensions: UnicodeSyntax, ViewPatterns