Resources for newcomers to GHC

This page is intended to serve as the first stop for those people who say, "I want to contribute to GHC, but I don't know quite where to begin." Begin here. While the building guide, working conventions, commentary and debugging pages (always linked from the left sidebar) have great information that can come in handy while you're working on your first, or first several patches, this page is intended to have the details you will need to get rolling.

First steps

Prepare your machine, clone the git repo, and build GHC. For the short, short version, which may or may not work for your machine, you can try this:

# needed only once, URL rewrite rule is persisted in ${HOME}/.gitconfig
git config --global url."git://".insteadOf git:// 

# clone GHC's main Git repository (creates './ghc' folder in CWD)
git clone --recursive git://
cd ghc/

# configure build
cd mk

## edit to remove the comment marker # on the line "BuildFlavour = devel2"

cd ..
# NOTE: On Windows you need to download some binary distributables before being able to build
# This only has to be done once and can be done by adding a flag to the call to configure:
./configure --enable-tarballs-autodownload

# build GHC
make -j8 # parallelize to at most 8 parallel jobs; adapt to actual number of cpu cores

If your machine has all the prerequisites, this might just work. Expect it all to take roughly an hour.

  • While you are waiting for your build to finish, orient yourself to the general architecture of GHC. This article is written by two of the chief architects of GHC, Simon Marlow and Simon Peyton-Jones, is excellent and current (2012).
  • After a successful build, you should have your brand new compiler in ./inplace/bin/ghc-stage2. (GHCi is launched with ./inplace/bin/ghc-stage2 --interactive). Try it out.

Fast rebuilding

There are 4 things to remember:

  1. Select BuildFlavour = devel2 in your mk/ file (copy mk/ to mk/ first), to make GHC build more quickly.
  1. Don't run make directly in the ghc root directory. Instead, first change to the directory (compiler, utils, ghc or libraries) where you're making your changes. See Building a single sub-component.

  1. Set stage=2 in your mk/ file, to freeze the stage 1 compiler. This makes sure that only the stage-2 compiler will be rebuilt after this.
  1. Use make fast to skip dependency building.

A good first sanity check is to twiddle some error message in the code, just to see that changed error message pop up when you compile a file. Write some Haskell code with an error in it, and look at the error message. Search through the code for that error message. Change the message, rebuild ghc (run make fast in the ghc directory), and recompile your file again with ./inplace/bin/ghc-stage2. If you see the changed message, you're good to go.

Finding a ticket

Below is a list of tickets that appear to be "low-hanging fruit" -- things that might be reasonable for a newcomer to GHC hacking. Of course, we can't ever be sure of how hard a task is before doing it, so apologies if one of these is too hard.


reify never provides the declaration of variables
StablePtrs should be organized by generation for efficient minor collections
ghc-pkg complains about missing haddock interface files
Performance tests behave differently depending on presence of .hi file (even with -fforce-recomp)
readRawBufferPtr and writeRawBufferPtr allocate memory
-ddump-to-file should create empty dump files when there was nothing to dump
"ghci -XMonomorphismRestriction" doesn't turn on the monomorphism restriction
CmmSwitchTest is broken on 32-bit platforms
testsuite should ignore config files

Feature requests:

functions without implementations
RecursiveDo in Template Haskell
Broken link testing
ghc --cleanup
The -> in ViewPatterns binds more weakly than infix data constructors.
Add a flag to remove/delete intermediate files generated by GHC
Greater customization of GHCi prompt
Warning for incomplete record field label used as function
Pretty Printer for textual version of Language (name) in DynFlags
Improve error message when using rec/mdo keyword without RecursiveDo extention.
No message when GCHI reusing compiled code
PostfixOperators doesn't work for types
feature: warn about unused data definitions (with typeclass instances)
Add unicode syntax for banana brackets
add command-line option to GHC to dump raw parse trees of Haskell programs


Make it possible to purely use the parser
Record Pattern Synonym Cleanup
Decide and document how semicolons are supposed to work in GHCi

Practical advice

Less practical advice

  • Don't get scared. GHC is a big codebase, but it makes sense when you stare at it long enough!
  • Be forewarned that many pages on the GHC wiki are somewhat out-of-date. Always check the last modification date. Email if you're not sure.

Need help?

You can email the ghc-devs list, or ask on irc in #ghc.

Happy hacking!

Last modified 7 weeks ago Last modified on Dec 19, 2015 9:31:46 AM