diff --git a/main/Main.hs b/main/Main.hs index aed6499d..c0154921 100644 --- a/main/Main.hs +++ b/main/Main.hs @@ -103,6 +103,8 @@ parseKernelArgs = foldl' addFlag defaultKernelSpecOptions kernelSpecOpts { kernelSpecGhcLibdir = libdir } addFlag kernelSpecOpts (KernelspecInstallPrefix prefix) = kernelSpecOpts { kernelSpecInstallPrefix = Just prefix } + addFlag kernelSpecOpts KernelspecUseStack = + kernelSpecOpts { kernelSpecUseStack = True } addFlag kernelSpecOpts flag = error $ "Unknown flag" ++ show flag -- | Run the IHaskell language kernel. @@ -112,6 +114,7 @@ runKernel :: KernelSpecOptions -- ^ Various options from when the kernel was ins runKernel kernelOpts profileSrc = do let debug = kernelSpecDebug kernelOpts libdir = kernelSpecGhcLibdir kernelOpts + useStack = kernelSpecUseStack kernelOpts -- Parse the profile file. Just profile <- liftM decode $ LBS.readFile profileSrc @@ -121,22 +124,23 @@ runKernel kernelOpts profileSrc = do Stdin.recordKernelProfile dir profile #if MIN_VERSION_ghc(7,8,0) - -- Detect if we have stack - runResult <- try $ readProcessWithExitCode "stack" [] "" - let stack = - case runResult :: Either SomeException (ExitCode, String, String) of - Left _ -> False - Right (exitCode, stackStdout, _) -> exitCode == ExitSuccess && "The Haskell Tool Stack" `isInfixOf` stackStdout + when useStack $ do + -- Detect if we have stack + runResult <- try $ readProcessWithExitCode "stack" [] "" + let stack = + case runResult :: Either SomeException (ExitCode, String, String) of + Left _ -> False + Right (exitCode, stackStdout, _) -> exitCode == ExitSuccess && "The Haskell Tool Stack" `isInfixOf` stackStdout - -- If we're in a stack directory, use `stack` to set the environment - -- We can't do this with base <= 4.6 because setEnv doesn't exist. - when stack $ do - stackEnv <- lines <$> readProcess "stack" ["exec", "env"] "" - forM_ stackEnv $ \line -> - let (var, val) = break (== '=') line - in case tailMay val of - Nothing -> return () - Just val' -> setEnv var val' + -- If we're in a stack directory, use `stack` to set the environment + -- We can't do this with base <= 4.6 because setEnv doesn't exist. + when stack $ do + stackEnv <- lines <$> readProcess "stack" ["exec", "env"] "" + forM_ stackEnv $ \line -> + let (var, val) = break (== '=') line + in case tailMay val of + Nothing -> return () + Just val' -> setEnv var val' #endif -- Serve on all sockets and ports defined in the profile. diff --git a/src/IHaskell/Flags.hs b/src/IHaskell/Flags.hs index 5cde5b0b..85f19e06 100644 --- a/src/IHaskell/Flags.hs +++ b/src/IHaskell/Flags.hs @@ -38,6 +38,7 @@ data Argument = ConfFile String -- ^ A file with commands to load at startup | ConvertToFormat NotebookFormat | ConvertLhsStyle (LhsStyle String) | KernelspecInstallPrefix String + | KernelspecUseStack deriving (Eq, Show) data LhsStyle string = @@ -100,6 +101,11 @@ kernelDebugFlag = flagNone ["debug"] addDebug "Print debugging output from the k where addDebug (Args mode prev) = Args mode (KernelDebug : prev) +kernelStackFlag :: Flag Args +kernelStackFlag = flagNone ["stack"] addStack "Inherit environment from `stack` when it is installed" + where + addStack (Args mode prev) = Args mode (KernelspecUseStack : prev) + confFlag :: Flag Args confFlag = flagReq ["conf", "c"] (store ConfFile) "" "File with commands to execute at start; replaces ~/.ihaskell/rc.hs." @@ -118,11 +124,11 @@ store constructor str (Args mode prev) = Right $ Args mode $ constructor str : p installKernelSpec :: Mode Args installKernelSpec = mode "install" (Args InstallKernelSpec []) "Install the Jupyter kernelspec." noArgs - [ghcLibFlag, kernelDebugFlag, confFlag, installPrefixFlag, helpFlag] + [ghcLibFlag, kernelDebugFlag, confFlag, installPrefixFlag, helpFlag, kernelStackFlag] kernel :: Mode Args kernel = mode "kernel" (Args (Kernel Nothing) []) "Invoke the IHaskell kernel." kernelArg - [ghcLibFlag, kernelDebugFlag, confFlag] + [ghcLibFlag, kernelDebugFlag, confFlag, kernelStackFlag] where kernelArg = flagArg update "" update filename (Args _ flags) = Right $ Args (Kernel $ Just filename) flags diff --git a/src/IHaskell/IPython.hs b/src/IHaskell/IPython.hs index 50ec1b39..ef6a8c9f 100644 --- a/src/IHaskell/IPython.hs +++ b/src/IHaskell/IPython.hs @@ -47,6 +47,7 @@ data KernelSpecOptions = , kernelSpecDebug :: Bool -- ^ Spew debugging output? , kernelSpecConfFile :: IO (Maybe String) -- ^ Filename of profile JSON file. , kernelSpecInstallPrefix :: Maybe String + , kernelSpecUseStack :: Bool -- ^ Whether to use @stack@ environments. } defaultKernelSpecOptions :: KernelSpecOptions @@ -55,6 +56,7 @@ defaultKernelSpecOptions = KernelSpecOptions , kernelSpecDebug = False , kernelSpecConfFile = defaultConfFile , kernelSpecInstallPrefix = Nothing + , kernelSpecUseStack = False } -- | The IPython kernel name. @@ -188,6 +190,7 @@ installKernelspec replace opts = void $ do Nothing -> [] Just file -> ["--conf", file]) ++ ["--ghclib", kernelSpecGhcLibdir opts] + ++ ["--stack" | kernelSpecUseStack opts] let kernelSpec = KernelSpec { kernelDisplayName = "Haskell"