cabal-helper 0.6.0.0 → 0.6.1.0
raw patch · 6 files changed
+130/−26 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Distribution.Helper: cabalProgram :: Programs -> FilePath
- Distribution.Helper: chExposedModules :: ChEntrypoint -> [ChModuleName]
- Distribution.Helper: chMainIs :: ChEntrypoint -> FilePath
- Distribution.Helper: chOtherModules :: ChEntrypoint -> [ChModuleName]
- Distribution.Helper: ghcPkgProgram :: Programs -> FilePath
- Distribution.Helper: ghcProgram :: Programs -> FilePath
- Distribution.Helper: instance (Monad m, Functor m) => Applicative (Query m)
- Distribution.Helper: instance Constructor C1_0Programs
- Distribution.Helper: instance Datatype D1Programs
- Distribution.Helper: instance Eq Programs
- Distribution.Helper: instance Eq SomeLocalBuildInfo
- Distribution.Helper: instance Exception LibexecNotFoundError
- Distribution.Helper: instance Functor m => Functor (Query m)
- Distribution.Helper: instance Generic Programs
- Distribution.Helper: instance Monad m => Monad (Query m)
- Distribution.Helper: instance MonadIO m => MonadIO (Query m)
- Distribution.Helper: instance Ord Programs
- Distribution.Helper: instance Ord SomeLocalBuildInfo
- Distribution.Helper: instance Read Programs
- Distribution.Helper: instance Read SomeLocalBuildInfo
- Distribution.Helper: instance Selector S1_0_0Programs
- Distribution.Helper: instance Selector S1_0_1Programs
- Distribution.Helper: instance Selector S1_0_2Programs
- Distribution.Helper: instance Show LibexecNotFoundError
- Distribution.Helper: instance Show Programs
- Distribution.Helper: instance Show SomeLocalBuildInfo
- Distribution.Helper: instance Typeable LibexecNotFoundError
- Distribution.Helper: instance Typeable Programs
+ Distribution.Helper: [cabalProgram] :: Programs -> FilePath
+ Distribution.Helper: [chExposedModules] :: ChEntrypoint -> [ChModuleName]
+ Distribution.Helper: [chMainIs] :: ChEntrypoint -> FilePath
+ Distribution.Helper: [chOtherModules] :: ChEntrypoint -> [ChModuleName]
+ Distribution.Helper: [ghcPkgProgram] :: Programs -> FilePath
+ Distribution.Helper: [ghcProgram] :: Programs -> FilePath
+ Distribution.Helper: configFlags :: MonadIO m => Query m [(String, Bool)]
+ Distribution.Helper: flags :: MonadIO m => Query m [(String, Bool)]
+ Distribution.Helper: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Distribution.Helper.Query m)
+ Distribution.Helper: instance GHC.Base.Functor m => GHC.Base.Functor (Distribution.Helper.Query m)
+ Distribution.Helper: instance GHC.Base.Monad m => GHC.Base.Applicative (Distribution.Helper.Query m)
+ Distribution.Helper: instance GHC.Base.Monad m => GHC.Base.Monad (Distribution.Helper.Query m)
+ Distribution.Helper: instance GHC.Classes.Eq Distribution.Helper.Programs
+ Distribution.Helper: instance GHC.Classes.Eq Distribution.Helper.SomeLocalBuildInfo
+ Distribution.Helper: instance GHC.Classes.Ord Distribution.Helper.Programs
+ Distribution.Helper: instance GHC.Classes.Ord Distribution.Helper.SomeLocalBuildInfo
+ Distribution.Helper: instance GHC.Exception.Exception Distribution.Helper.LibexecNotFoundError
+ Distribution.Helper: instance GHC.Generics.Constructor Distribution.Helper.C1_0Programs
+ Distribution.Helper: instance GHC.Generics.Datatype Distribution.Helper.D1Programs
+ Distribution.Helper: instance GHC.Generics.Generic Distribution.Helper.Programs
+ Distribution.Helper: instance GHC.Generics.Selector Distribution.Helper.S1_0_0Programs
+ Distribution.Helper: instance GHC.Generics.Selector Distribution.Helper.S1_0_1Programs
+ Distribution.Helper: instance GHC.Generics.Selector Distribution.Helper.S1_0_2Programs
+ Distribution.Helper: instance GHC.Read.Read Distribution.Helper.Programs
+ Distribution.Helper: instance GHC.Read.Read Distribution.Helper.SomeLocalBuildInfo
+ Distribution.Helper: instance GHC.Show.Show Distribution.Helper.LibexecNotFoundError
+ Distribution.Helper: instance GHC.Show.Show Distribution.Helper.Programs
+ Distribution.Helper: instance GHC.Show.Show Distribution.Helper.SomeLocalBuildInfo
+ Distribution.Helper: nonDefaultConfigFlags :: MonadIO m => Query m [(String, Bool)]
+ Distribution.Helper: packageId :: MonadIO m => Query m (String, Version)
Files
- CabalHelper/Common.hs +9/−0
- CabalHelper/Main.hs +40/−1
- CabalHelper/Types.hs +3/−2
- CabalHelper/Wrapper.hs +13/−1
- Distribution/Helper.hs +64/−21
- cabal-helper.cabal +1/−1
CabalHelper/Common.hs view
@@ -86,3 +86,12 @@ appDataDir :: IO FilePath appDataDir = (</> "cabal-helper") <$> getAppUserDataDirectory "ghc-mod"++isCabalFile :: FilePath -> Bool+isCabalFile f = takeExtension' f == ".cabal"++takeExtension' :: FilePath -> String+takeExtension' p =+ if takeFileName p == takeExtension p+ then "" -- just ".cabal" is not a valid cabal file+ else takeExtension p
CabalHelper/Main.hs view
@@ -19,8 +19,12 @@ import Distribution.Simple.Utils (cabalVersion) import Distribution.Simple.Configure -import Distribution.Package (PackageIdentifier, InstalledPackageId, PackageId)+import Distribution.Package (PackageIdentifier, InstalledPackageId, PackageId,+ packageName, packageVersion) import Distribution.PackageDescription (PackageDescription,+ GenericPackageDescription(..),+ Flag(..),+ FlagName(..), FlagAssignment, Executable(..), Library(..),@@ -65,9 +69,11 @@ #endif import Control.Applicative ((<$>))+import Control.Arrow (first, (&&&)) import Control.Monad import Control.Exception (catch, PatternMatchFail(..)) import Data.List+import qualified Data.Map as Map import Data.Maybe import Data.Monoid import Data.IORef@@ -92,6 +98,10 @@ ++"PROJ_DIR DIST_DIR [--with-* ...] (\n" ++" version\n" ++" | print-lbi [--human]\n"+ ++" | package-id\n"+ ++" | flags\n"+ ++" | config-flags\n"+ ++" | non-default-config-flags\n" ++" | write-autogen-files\n" ++" | compiler-version\n" ++" | ghc-options [--with-inplace]\n"@@ -107,6 +117,10 @@ commands :: [String] commands = [ "print-bli"+ , "package-id"+ , "flags"+ , "config-flags"+ , "non-default-config-flags" , "write-autogen-files" , "compiler-version" , "ghc-options"@@ -131,8 +145,11 @@ errMsg $ "distdir '"++distdir++"' does not exist" exitFailure + [cfile] <- filter isCabalFile <$> getDirectoryContents projdir+ v <- maybe silent (const deafening) . lookup "GHC_MOD_DEBUG" <$> getEnvironment lbi <- unsafeInterleaveIO $ getPersistBuildConfig distdir+ gpd <- unsafeInterleaveIO $ readPackageDescription v (projdir </> cfile) let pd = localPkgDescr lbi let lvd = (lbi, v, distdir) @@ -162,6 +179,26 @@ print =<< flip mapM cmds $$ \cmd -> do case cmd of+ "flags":[] -> do+ return $ Just $ ChResponseFlags $ sort $+ map (flagName' &&& flagDefault) $ genPackageFlags gpd++ "config-flags":[] -> do+ return $ Just $ ChResponseFlags $ sort $+ map (first unFlagName') $ configConfigurationsFlags $ configFlags lbi++ "non-default-config-flags":[] -> do+ let flagDefinitons = genPackageFlags gpd+ flagAssgnments = configConfigurationsFlags $ configFlags lbi+ nonDefaultFlags =+ [ (fn, v)+ | MkFlag {flagName=FlagName fn, flagDefault=dv} <- flagDefinitons+ , (FlagName fn', v) <- flagAssgnments+ , fn == fn'+ , v /= dv+ ]+ return $ Just $ ChResponseFlags $ sort nonDefaultFlags+ "write-autogen-files":[] -> do -- calls writeAutogenFiles initialBuildSteps distdir pd lbi v@@ -256,6 +293,8 @@ _ -> errMsg "Invalid usage!" >> usage >> exitFailure +flagName' = unFlagName' . flagName+unFlagName' (FlagName n) = n getLibrary :: PackageDescription -> Library getLibrary pd = unsafePerformIO $ do
CabalHelper/Types.hs view
@@ -35,9 +35,10 @@ | ChResponseEntrypoints [(ChComponentName, ChEntrypoint)] | ChResponseList [String] | ChResponsePkgDbs [ChPkgDb]- | ChResponseLbi String- | ChResponseVersion String Version+ | ChResponseLbi String+ | ChResponseVersion String Version | ChResponseLicenses [(String, [(String, Version)])]+ | ChResponseFlags [(String, Bool)] deriving (Eq, Ord, Read, Show, Generic) data ChEntrypoint = ChSetupEntrypoint -- ^ Almost like 'ChExeEntrypoint' but
CabalHelper/Wrapper.hs view
@@ -35,6 +35,9 @@ import Distribution.System (buildPlatform) import Distribution.Text (display)+import Distribution.Verbosity (silent, deafening)+import Distribution.PackageDescription.Parse (readPackageDescription)+import Distribution.Package (packageName, packageVersion) import Paths_cabal_helper (version) import CabalHelper.Common@@ -56,7 +59,7 @@ \ [--with-cabal=CABAL_PATH]\n\ \ [--with-cabal-version=VERSION]\n\ \ [--with-cabal-pkg-db=PKG_DB]\n\-\ PROJ_DIR DIST_DIR ( print-exe | [CABAL_HELPER_ARGS...] ) )\n"+\ PROJ_DIR DIST_DIR ( print-exe | package-id | [CABAL_HELPER_ARGS...] ) )\n" globalArgSpec :: [OptDescr (Options -> Options)] globalArgSpec =@@ -116,6 +119,15 @@ "version":[] -> putStrLn $ showVersion version "print-appdatadir":[] -> putStrLn =<< appDataDir "print-build-platform":[] -> putStrLn $ display buildPlatform++ projdir:_distdir:"package-id":[] -> do+ v <- maybe silent (const deafening) . lookup "GHC_MOD_DEBUG" <$> getEnvironment+ -- ghc-mod will catch multiple cabal files existing before we get here+ [cfile] <- filter isCabalFile <$> getDirectoryContents projdir+ gpd <- readPackageDescription v (projdir </> cfile)+ putStrLn $ show $+ [Just $ ChResponseVersion (display (packageName gpd)) (packageVersion gpd)]+ projdir:distdir:args' -> do cfgf <- canonicalizePath (distdir </> "setup-config") mhdr <- getCabalConfigHeader cfgf
Distribution/Helper.hs view
@@ -44,6 +44,10 @@ , ghcMergedPkgOptions , ghcLangOptions , pkgLicenses+ , flags+ , configFlags+ , nonDefaultConfigFlags+ , packageId -- * Result types , ChModuleName(..)@@ -147,7 +151,10 @@ slbiGhcPkgOptions :: [(ChComponentName, [String])], slbiGhcMergedPkgOptions :: [String], slbiGhcLangOptions :: [(ChComponentName, [String])],- slbiPkgLicenses :: [(String, [(String, Version)])]+ slbiPkgLicenses :: [(String, [(String, Version)])],+ slbiFlags :: [(String, Bool)],+ slbiConfigFlags :: [(String, Bool)],+ slbiNonDefaultConfigFlags :: [(String, Bool)] } deriving (Eq, Ord, Read, Show) -- | Caches helper executable result so it doesn't have to be run more than once@@ -212,6 +219,21 @@ -- | Get the licenses of the packages the current project is linking against. pkgLicenses :: MonadIO m => Query m [(String, [(String, Version)])] +-- | Flag definitions from cabal file+flags :: MonadIO m => Query m [(String, Bool)]++-- | Flag assignments from setup-config+configFlags :: MonadIO m => Query m [(String, Bool)]++-- | Flag assignments from setup-config which differ from the default+-- setting. This can also include flags which cabal decided to modify,+-- i.e. don't rely on these being the flags set by the user directly.+nonDefaultConfigFlags :: MonadIO m => Query m [(String, Bool)]++-- | Package identifier, i.e. package name and version+packageId :: MonadIO m => Query m (String, Version)++ packageDbStack = Query $ slbiPackageDbStack `liftM` getSlbi entrypoints = Query $ slbiEntrypoints `liftM` getSlbi sourceDirs = Query $ slbiSourceDirs `liftM` getSlbi@@ -221,6 +243,10 @@ ghcMergedPkgOptions = Query $ slbiGhcMergedPkgOptions `liftM` getSlbi ghcLangOptions = Query $ slbiGhcLangOptions `liftM` getSlbi pkgLicenses = Query $ slbiPkgLicenses `liftM` getSlbi+flags = Query $ slbiFlags `liftM` getSlbi+configFlags = Query $ slbiConfigFlags `liftM` getSlbi+nonDefaultConfigFlags = Query $ slbiNonDefaultConfigFlags `liftM` getSlbi+packageId = Query $ getPackageId -- | Run @cabal configure@ reconfigure :: MonadIO m@@ -240,8 +266,10 @@ _ <- liftIO $ readProc (cabalProgram progs) ("configure":progOpts) "" return () -getSomeConfigState :: MonadQuery m => m SomeLocalBuildInfo-getSomeConfigState = ask >>= \QueryEnv {..} -> do+++invokeHelper :: MonadQuery m => [String] -> m [Maybe ChResponse]+invokeHelper args = ask >>= \QueryEnv {..} -> do let progs = qePrograms projdir = qeProjectDir distdir = qeDistDir@@ -251,25 +279,37 @@ , "--with-cabal=" ++ cabalProgram progs ] - args = [ "package-db-stack"- , "entrypoints"- , "source-dirs"- , "ghc-options"- , "ghc-src-options"- , "ghc-pkg-options"- , "ghc-merged-pkg-options"- , "ghc-lang-options"- , "licenses"- ]-- res <- liftIO $ do+ liftIO $ do exe <- findLibexecExe "cabal-helper-wrapper"- out <- qeReadProcess exe (progArgs ++ projdir:distdir:args) ""+ let args' = progArgs ++ projdir:distdir:args+ out <- qeReadProcess exe args' "" evaluate (read out) `E.catch` \(SomeException _) ->- error $ concat ["getSomeConfigState", ": ", exe, " "- , intercalate " " (map show $ progArgs ++ projdir:distdir:args)- , " (read failed)"]+ error $ concat ["invokeHelper", ": ", exe, " "+ , intercalate " " (map show args')+ , " (read failed)"+ ] +getPackageId :: MonadQuery m => m (String, Version)+getPackageId = ask >>= \QueryEnv {..} -> do+ [ Just (ChResponseVersion pkgName pkgVer) ] <- invokeHelper [ "package-id" ]+ return (pkgName, pkgVer)+++getSomeConfigState :: MonadQuery m => m SomeLocalBuildInfo+getSomeConfigState = ask >>= \QueryEnv {..} -> do+ res <- invokeHelper [ "package-db-stack"+ , "entrypoints"+ , "source-dirs"+ , "ghc-options"+ , "ghc-src-options"+ , "ghc-pkg-options"+ , "ghc-merged-pkg-options"+ , "ghc-lang-options"+ , "licenses"+ , "flags"+ , "config-flags"+ , "non-default-config-flags"+ ] let [ Just (ChResponsePkgDbs pkgDbs), Just (ChResponseEntrypoints eps), Just (ChResponseCompList srcDirs),@@ -278,11 +318,14 @@ Just (ChResponseCompList ghcPkgOpts), Just (ChResponseList ghcMergedPkgOpts), Just (ChResponseCompList ghcLangOpts),- Just (ChResponseLicenses pkgLics)+ Just (ChResponseLicenses pkgLics),+ Just (ChResponseFlags fls),+ Just (ChResponseFlags cfls),+ Just (ChResponseFlags ndcfls) ] = res return $ SomeLocalBuildInfo- pkgDbs eps srcDirs ghcOpts ghcSrcOpts ghcPkgOpts ghcMergedPkgOpts ghcLangOpts pkgLics+ pkgDbs eps srcDirs ghcOpts ghcSrcOpts ghcPkgOpts ghcMergedPkgOpts ghcLangOpts pkgLics fls cfls ndcfls -- | Make sure the appropriate helper executable for the given project is -- installed and ready to run queries.
cabal-helper.cabal view
@@ -1,5 +1,5 @@ name: cabal-helper-version: 0.6.0.0+version: 0.6.1.0 synopsis: Simple interface to some of Cabal's configuration state used by ghc-mod description: @cabal-helper@ provides a library which wraps the internal use of