Skip to content

Commit

Permalink
'cabal repl': when there's no .cabal file, just start ghci.
Browse files Browse the repository at this point in the history
  • Loading branch information
23Skidoo committed Dec 19, 2013
1 parent 2bbe274 commit b209238
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 29 deletions.
11 changes: 10 additions & 1 deletion Cabal/Distribution/Simple/Build.hs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -}

module Distribution.Simple.Build (
build, repl,
startInterpreter,

initialBuildSteps,
writeAutogenFiles,
Expand All @@ -67,7 +68,8 @@ import Distribution.Package
( Package(..), PackageName(..), PackageIdentifier(..)
, Dependency(..), thisPackageVersion )
import Distribution.Simple.Compiler
( CompilerFlavor(..), compilerFlavor, PackageDB(..) )
( Compiler, CompilerFlavor(..), compilerFlavor
, PackageDB(..), PackageDBStack )
import Distribution.PackageDescription
( PackageDescription(..), BuildInfo(..), Library(..), Executable(..)
, TestSuite(..), TestSuiteInterface(..), Benchmark(..)
Expand Down Expand Up @@ -202,6 +204,13 @@ repl pkg_descr lbi flags suffixes args = do
in replComponent verbosity pkg_descr lbi' suffixes comp clbi distPref


-- | Start an interpreter without loading any package files.
startInterpreter :: Verbosity -> ProgramDb -> Compiler -> PackageDBStack -> IO ()
startInterpreter verbosity programDb comp packageDBs =
case compilerFlavor comp of
GHC -> GHC.startInterpreter verbosity programDb comp packageDBs
_ -> die "A REPL is not supported with this compiler."

buildComponent :: Verbosity
-> Flag (Maybe Int)
-> PackageDescription
Expand Down
12 changes: 12 additions & 0 deletions Cabal/Distribution/Simple/GHC.hs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ module Distribution.Simple.GHC (
configure, getInstalledPackages, getPackageDBContents,
buildLib, buildExe,
replLib, replExe,
startInterpreter,
installLib, installExe,
libAbiHash,
initPackageDB,
Expand Down Expand Up @@ -917,6 +918,17 @@ buildOrReplLib forRepl verbosity numJobsFlag pkg_descr lbi lib clbi = do
whenSharedLib False $
runGhcProg ghcSharedLinkArgs

-- | Start a REPL without loading any source files.
startInterpreter :: Verbosity -> ProgramConfiguration -> Compiler
-> PackageDBStack -> IO ()
startInterpreter verbosity conf comp packageDBs = do
let replOpts = mempty {
ghcOptMode = toFlag GhcModeInteractive,
ghcOptPackageDBs = packageDBs
}
checkPackageDbStack packageDBs
(ghcProg, _) <- requireProgram verbosity ghcProgram conf
runGHC verbosity ghcProg comp replOpts

-- | Build an executable with GHC.
--
Expand Down
73 changes: 45 additions & 28 deletions cabal-install/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ import Distribution.Client.Utils (determineNumJobs

import Distribution.PackageDescription
( Executable(..) )
import Distribution.Simple.Build
( startInterpreter )
import Distribution.Simple.Command
( CommandParse(..), CommandUI(..), Command
, commandsRun, commandAddAction, hiddenCommand )
Expand All @@ -114,7 +116,7 @@ import qualified Distribution.Simple.LocalBuildInfo as LBI
import Distribution.Simple.Program (defaultProgramConfiguration)
import qualified Distribution.Simple.Setup as Cabal
import Distribution.Simple.Utils
( cabalVersion, die, notice, info, topHandler )
( cabalVersion, die, notice, info, topHandler, findPackageDesc )
import Distribution.Text
( display )
import Distribution.Verbosity as Verbosity
Expand All @@ -128,7 +130,7 @@ import System.Exit (exitFailure)
import System.FilePath (splitExtension, takeExtension)
import System.IO (BufferMode(LineBuffering),
hSetBuffering, stdout)
import System.Directory (doesFileExist)
import System.Directory (doesFileExist, getCurrentDirectory)
import Data.List (intercalate)
import Data.Monoid (Monoid(..))
import Control.Monad (when, unless)
Expand Down Expand Up @@ -326,32 +328,47 @@ filterBuildFlags version config buildFlags

replAction :: ReplFlags -> [String] -> GlobalFlags -> IO ()
replAction replFlags extraArgs globalFlags = do
let distPref = fromFlagOrDefault (useDistPref defaultSetupScriptOptions)
(replDistPref replFlags)
verbosity = fromFlagOrDefault normal (replVerbosity replFlags)
noAddSource = case replReload replFlags of
Flag True -> SkipAddSourceDepsCheck
_ -> DontSkipAddSourceDepsCheck

-- Calls 'configureAction' to do the real work, so nothing special has to be
-- done to support sandboxes.
(useSandbox, _config) <- reconfigure verbosity distPref
mempty [] globalFlags noAddSource NoFlag
(const Nothing)

maybeWithSandboxDirOnSearchPath useSandbox $
let progConf = defaultProgramConfiguration
setupOptions = defaultSetupScriptOptions
{ useCabalVersion = orLaterVersion $ Version [1,18,0] []
, useDistPref = distPref
}
replFlags' = replFlags
{ replVerbosity = toFlag verbosity
, replDistPref = toFlag distPref
}
in setupWrapper verbosity setupOptions Nothing
(Cabal.replCommand progConf) (const replFlags') extraArgs

cwd <- getCurrentDirectory
pkgDesc <- findPackageDesc cwd
either (const onNoPkgDesc) (const onPkgDesc) pkgDesc
where
verbosity = fromFlagOrDefault normal (replVerbosity replFlags)

-- There is a .cabal file in the current directory: start a REPL and load
-- the project's modules.
onPkgDesc = do
let distPref = fromFlagOrDefault (useDistPref defaultSetupScriptOptions)
(replDistPref replFlags)
noAddSource = case replReload replFlags of
Flag True -> SkipAddSourceDepsCheck
_ -> DontSkipAddSourceDepsCheck
progConf = defaultProgramConfiguration
setupOptions = defaultSetupScriptOptions
{ useCabalVersion = orLaterVersion $ Version [1,18,0] []
, useDistPref = distPref
}
replFlags' = replFlags
{ replVerbosity = toFlag verbosity
, replDistPref = toFlag distPref
}
-- Calls 'configureAction' to do the real work, so nothing special has to
-- be done to support sandboxes.
(useSandbox, _config) <- reconfigure verbosity distPref
mempty [] globalFlags noAddSource NoFlag
(const Nothing)

maybeWithSandboxDirOnSearchPath useSandbox $
setupWrapper verbosity setupOptions Nothing
(Cabal.replCommand progConf) (const replFlags') extraArgs

-- No .cabal file in the current directory: just start the REPL (possibly
-- using the sandbox package DB).
onNoPkgDesc = do
(_useSandbox, config) <- loadConfigOrSandboxConfig verbosity globalFlags
mempty
let configFlags = savedConfigureFlags config
(comp, _platform, programDb) <- configCompilerAux' configFlags
startInterpreter verbosity programDb comp (configPackageDB' configFlags)

-- | Re-configure the package in the current directory if needed. Deciding
-- when to reconfigure and with which options is convoluted:
Expand Down

0 comments on commit b209238

Please sign in to comment.