Managing GHC versions with ghcupPosted on September 18, 2019
If you use Haskell, you probably use the Glasgow Haskell Compiler. GHC releases once every six months. When using
nix, the GHC version is managed for you. When using
cabal, it is up to you to manage your GHC installation(s). I have previously posted about how I manage multiple installations of GHC using
apt. More recently I have mostly been using the
ghcup tool, which lets you install and manage multiple GHC versions on most Linux distributions and macOS.
ghcup because it’s simple and works across multiple operating systems. For example, it’s my favourite option for installing GHC on my home Fedora machine and my Ubuntu VMs (although Herbert’s Ubuntu PPA and Debian packages should be preferred on those systems). On NixOS I still use nix.
ghcup is great for multiple getting GHCs happening, almost wherever you are, but you should consider using your operating system’s package manager when possible.
ghcup by following the instructions here. This will also install the recommended versions of
cabal and GHC. Make sure to follow the script’s instructions about adding the appropriate line to your
~/.bashrc or similar.
ghcup installed, you can install the extra GHC versions you care about:
$ ghcup install 8.0.2 $ ghcup install 8.2.2 $ ghcup install 8.4.4 $ ghcup install 8.6.5
$ You can also use
ghcup to install the latest
cabal as needed:
$ ghcup install-cabal
You will need to add
ghcup’s binary directory
~/.ghcup/bin to your
PATH to use these executables.
ghcup will fetch binaries for your system, or if there aren’t any available, it will try to build GHC from source. I’ve found the binaries work for me on all the Linux distributions I’ve tried. I’ve heard that
ghcup works well on macOS too, but I haven’t personally tested it. There are not many modern GHC binaries available for FreeBSD, so if you’re using that operating system I recommend getting GHC from
Specifying a GHC version to be used
You can select which GHC version is
ghc on the
PATH by using
$ ghcup set 8.8.1
which is very helpful.
If you want to use a different version for a particular build, you can use
--with-compiler flag or its short form
-w. This flag lets you specify a Haskell compiler on your
PATH to use, for example, you can test your project with GHC
8.4.4 by running
$ cabal v2-test -w ghc-8.4.4
I often use this when I’m testing my packages against multiple GHC versions.
That’s it! Installing and managing multiple GHC versions has never been easier.
Setting a GHC per project
If you want a certain project to always use a particular GHC version, you can do so by adding a line to your
cabal.project file. Here’s a sample
cabal.project file you could drop into any cabal project to make sure it always builds with GHC
packages: . with-compiler: ghc-8.4.4
8.4.4 will be used regardless of which GHC is
ghc on the
PATH. This saves us having to use
-w for every command.
What about Windows?
ghcup does not work on Windows, and it is not planned to. So how should we manage our GHC versions on Windows? I have done some Haskell development on Windows. Most of the time I got away with WSL; I opened a bash shell backed by Ubuntu and just used
On actual Windows, I have heard great things about Chocolatey. See this blog post for more information on getting GHC and cabal up and running on Windows.
bash is evil!
I agree. Here’s how I actually use
ghcup. Instead of curling into bash, clone the repo:
$ git clone firstname.lastname@example.org:haskell/ghcup.git $ cd ghcup
Next, get yourself set up by running the script you would have fetched with curl:
The rest of the process is as above.
We’re using functional programming to set up the infrastructure that we use from day to day.
George Wilson is an enthusiastic programmer at the Queensland Functional Programming Lab. George enjoys writing code, and speaking and writing about Haskell and functional programming.