Add a script for running a ghci that can load and run ghc
authorMichael Sloan <>
Thu, 26 Jul 2018 21:17:41 +0000 (17:17 -0400)
committerBen Gamari <>
Fri, 27 Jul 2018 15:40:43 +0000 (11:40 -0400)
Add scripts and .ghci files for loading GHC into GHCi

Major credit to Csongor Kiss who wrote nearly all of settings.ghci

Some small modifications to GHC are needed to make this work, and this
diff depends on [D4986]( being

Test Plan:
Manual for now. I have some thoughts on how to run the entire testsuite

Reviewers: alpmestan, mpickering, goldfire, bgamari, erikd

Reviewed By: alpmestan

Subscribers: rwbarton, thomie, carter

Differential Revision:

.ghcid [new file with mode: 0644]
utils/ghc-in-ghci/inner.ghci [new file with mode: 0644]
utils/ghc-in-ghci/load-main.ghci [new file with mode: 0644]
utils/ghc-in-ghci/ [new file with mode: 0755]
utils/ghc-in-ghci/settings.ghci [new file with mode: 0644]

diff --git a/.ghcid b/.ghcid
new file mode 100644 (file)
index 0000000..f751a6f
--- /dev/null
+++ b/.ghcid
@@ -0,0 +1,7 @@
+--command utils/ghc-in-ghci/
+--reload compiler
+--reload ghc
+--reload includes
+--restart utils/ghc-in-ghci/
+--restart utils/ghc-in-ghci/load-main.ghci
+--restart utils/ghc-in-ghci/settings.ghci
diff --git a/utils/ghc-in-ghci/inner.ghci b/utils/ghc-in-ghci/inner.ghci
new file mode 100644 (file)
index 0000000..72834c9
--- /dev/null
@@ -0,0 +1 @@
+:set prompt "%s [inner]> "
diff --git a/utils/ghc-in-ghci/load-main.ghci b/utils/ghc-in-ghci/load-main.ghci
new file mode 100644 (file)
index 0000000..a798557
--- /dev/null
@@ -0,0 +1 @@
+:load Main
diff --git a/utils/ghc-in-ghci/ b/utils/ghc-in-ghci/
new file mode 100755 (executable)
index 0000000..2dda647
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh -xe
+# Runs ghc-stage2 with GHCi settings that allow GHC to be loaded and run in the
+# interpreter. Options provided on the command-line will be passed directly to
+# the GHCi invocation.
+# Note that this script is intended to be run from the root of the GHC repo,
+# like this:
+# ./utils/ghc-in-ghci/
+# This is substantially faster than doing an actual compile, and so can aid in
+# tighter development iterations. It can be made even faster by specifying "-jN"
+# for parallelism. Typically choosing an N value close to the number of logical
+# CPU cores you have leads to faster loads. Here's how to specify -j:
+# ./utils/ghc-in-ghci/ -j4
+# The script will also run `:load Main`, to load GHC's main module. After that,
+# running `main` will run an inner GHCi, because there is a default `:set args
+# --interactive ...`. To override this, use `:set args ...` or `:main ...`.
+# If you don't want to wait for `:load Main`, since you want to load some other
+# module, then you can use `Ctrl+C` to cancel the initial load.
+export _GHC_TOP_DIR=./inplace/lib
+exec ./inplace/bin/ghc-stage2 \
+    --interactive \
+    -ghci-script ./utils/ghc-in-ghci/settings.ghci \
+    -ghci-script ./utils/ghc-in-ghci/load-main.ghci \
+    -odir ./ghci-tmp \
+    -hidir ./ghci-tmp \
+    +RTS -A128m -RTS \
+    "$@"
diff --git a/utils/ghc-in-ghci/settings.ghci b/utils/ghc-in-ghci/settings.ghci
new file mode 100644 (file)
index 0000000..1348274
--- /dev/null
@@ -0,0 +1,41 @@
+:set -icompiler/backpack
+:set -icompiler/basicTypes
+:set -icompiler/cmm
+:set -icompiler/codeGen
+:set -icompiler/coreSyn
+:set -icompiler/deSugar
+:set -icompiler/ghci
+:set -icompiler/hsSyn
+:set -icompiler/iface
+:set -icompiler/llvmGen
+:set -icompiler/main
+:set -icompiler/nativeGen
+:set -icompiler/parser
+:set -icompiler/prelude
+:set -icompiler/profiling
+:set -icompiler/rename
+:set -icompiler/simplCore
+:set -icompiler/simplStg
+:set -icompiler/specialise
+:set -icompiler/stgSyn
+:set -icompiler/stranal
+:set -icompiler/typecheck
+:set -icompiler/types
+:set -icompiler/utils
+:set -icompiler/vectorise
+:set -ighc
+:set -Icompiler
+:set -Icompiler/stage2
+:set -Icompiler/stage2/build
+:set -icompiler/stage2/build
+:set -Iincludes
+:set -Iincludes/dist-derivedconstants/header
+:set -package=ghc-boot-th
+:set -DSTAGE=2
+:set -DGHCI
+:set -XNoImplicitPrelude
+-- Setup args so that running "main" will run ghci and set the prompt to
+-- indicate that it is an inner ghci.
+:set args --interactive -ghci-script utils/ghc-in-ghci/inner.ghci