wiki:Building/Preparation/Windows

Building GHC on Windows

This page documents the instructions for setting up a Windows build using MSYS2, which contains MinGW-w64 compilers and the MSYS2 shell utilities. This guide should get you running in ~5 minutes, modulo download speeds.

I. Setting up MSYS2

Method A: Directly

Installation

Download and run the latest MSYS2 installer: either 64-bit (x86-64) or 32-bit (i686).

From the MSYS2 installation instructions:

After installing or extracting MSYS2 you should start MSYS2 by executing msys2_shell.bat. (if you did not use an installer and this is first time running of MSYS2 after unpacking, then at this point it will create the files and settings necessary for it to function properly. After this initial run you MUST restart MSYS2 so that the settings are correct)

The result of attempting to create a 32-bit build of GHC on a 64-bit machine has not been documented yet. Building 32-bit GHC on a 32-bit version of Windows works, of course.

Launch the MinGW shell using the shortcuts added to Start Menu: MinGW-w64 Win32 Shell or MinGW-w64 Win64 Shell.

Note

Do not use the MSYS2 Shell shortcut. MSYS2 Shell is for building applications that utilize an additional POSIX compatibility layer akin to Cygwin, while the MinGW-w64 shells are for building native Windows applications. The latter is the correct environment for building GHC. For details on the distinction between the two, read the introduction to MSYS2. An easy way to check that you are running the right shell is to check the output of echo $MSYSTEM: it should show either MINGW32 or MINGW64. You can also tell by examining the $PATH.

After starting the shell, make sure /mingw64/bin (or /mingw32/bin depending on the arch you're building for) is the first thing on $PATH. If using Bash, echo "export PATH=/mingw<bitness>/bin:\$PATH" >>~/.bash_profile can be run to append your profile. Replace <bitness> with either 64 or 32 depending on platform.

Note

This is required to ensure that the mingw-w64 variant of tools get priority over the msys versions.

Method B: Via Stack

It is possible to set up MSYS indirectly through Stack:

  1. download and install Stack.
  1. Run stack setup to get GHC and MSYS2, then stack install alex happy to get the tools. (This means step IV can be skipped.)

To start a MinGW shell, run stack exec --no-ghc-package-path mintty from Command Prompt. The --no-ghc-package-path flag is necessary to avoid complaints from Cabal.

II. Upgrading packages in MSYS2

To manage packages, MSYS2 uses pacman, the venerable ArchLinux package manager.

Before installing system dependencies required for building GHC, the packages should be upgraded. If pacman is 5.0.1.6403 or newer, one simply needs to run

pacman -Syuu

You may need to retry a few times if SourceForge times out. On the other hand, if your pacman is older, refer to the MSYS2 installation instructions, section III.

III. Installing packages & tools

Now we can install GHC's dependencies as follows:

pacman -S --needed git tar binutils autoconf make \
    curl libtool automake python python2 p7zip patch \
    mingw-w64-$(uname -m)-gcc mingw-w64-$(uname -m)-python3-sphinx

IV. Installing the host GHC and tools (Alex and Happy)

This step is not necessary if you used Method B of Step I.

A host GHC binary is required for bootstrapping. In order to keep different architectures separate, download and install a prebuilt GHC into /mingw64 or /mingw32:

Run

arch=x86-64 # or i386
bitness=64 # or 32
curl -L https://www.haskell.org/ghc/dist/7.10.3/ghc-7.10.3-${arch}-unknown-mingw32.tar.xz | tar -xJ -C /mingw${bitness} --strip-components=1

Note: --strip-components=1 places everything within the archive's ghc-7.10.1 folder directly into the target directory.

Building GHC requires Alex and Happy. They can be installed using cabal-install. We will also put them in /usr/local/bin, which is by default included in PATH in MSYS.

mkdir -p /usr/local/bin &&
curl -L https://www.haskell.org/cabal/release/cabal-install-1.22.0.0/cabal-1.22.0.0-i386-unknown-mingw32.tar.gz | tar -xz -C /usr/local/bin &&
mv /usr/local/bin/cabal-1.22.0.0-i386-unknown-mingw32.exe /usr/local/bin/cabal.exe &&
cabal update &&
cabal install -j --prefix=/usr/local alex happy

V. Build!

You should now be able to build GHC using the instructions in QuickStart!

Troubleshooting

pacman failed to commit transaction

If pacman fails with error message like this:

error: failed to commit transaction (conflicting files)
mingw-w64-x86_64-libiconv: /mingw64 exists in filesystem

then try re-running the pacman command with the --force option (see MSYS2 bug #31).

Error setting certificate verify locations

If you encounter this error while running git clone:

error: error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

then try reinstalling ca-certificates via pacman -S ca-certificates.

Cabal-1.22.0.0 crashes on Windows Server 2008 R2

The pre-packaged cabal-1.22.0.0 crashes on Windows Server 2008 R2 during cabal update due to this bug. If so, try using a different version such as:

mkdir -p /usr/local/bin &&
pacman -S unzip &&
curl -LO https://www.haskell.org/cabal/release/cabal-install-1.24.0.0-rc1/cabal-install-1.24.0.0-rc1-x86_64-unknown-mingw32.zip &&
unzip cabal-install-1.24.0.0-rc1-x86_64-unknown-mingw32.zip -d /usr/local/bin &&
cabal update &&
cabal install -j --prefix=/usr/local alex happy

Build problems

MSYS2 is known to be glitchy in some situations. If you see errors related to fork(), try closing and reopening the shell; see also msys2 issue #74. Also there have been issues with the build process segfaulting. The reason is not known (we're looking into it). If that happens, simply rerunning make will continue the build process.

Alternatively, to run a pristine build and tests (takes a while):

./validate

NOTE: You may see an error like make 7628 child_info_fork::abort: ... make: fork: Resource temporarily unavailable when running make. To fix this, go to the root of your MSYS dir and run autorebase.bat; see http://sourceforge.net/projects/mingw/files/MSYS/Extension/rebase/rebase-4.0.1_1-1/ and again http://sourceforge.net/p/msys2/tickets/74/. Alternatively, run shutdown //r.

NOTE: If the build seems super slow (takes more than 1 hour to complete), check your virus scanner and whitelist C:/msys64.

Segmentation fault when using parallel make

Running parallel make (e.g., make -j5) is faster, but appears to cause segfaults during the build sometimes. The reasons are not clear yet.

Python and the test suite

There are two known issues when using python to run the GHC test suite:

  • The MinGW-w64 version of python (under the name mingw-w64-$(uname -m)-python) completely breaks on the GHC test suite (see #12554).
  • The MSYS2 version of python (which we recommended installing above using pacman -S python) is broken, but only with recent versions of the MSYS2 runtime (msys2-runtime >= 2.5.1). See #12661, as well as MSYS2-packages issue 707 for more info.

This issue manifests as a failure to remove directories; unfortunately this error is hidden by the driver and you will likely instead see an error of the form:

[Error 183] Cannot create a file when that file already exists: ...

from os.makedirs. This issue appears to happen more often when threading is enabled in the testsuite driver (e.g. make test THREADS=4 after disable the check disabling it in runtests.py), but can also happen in single-threaded mode.

If you experience issues running the test suite on Windows, you can try the following:

  • Run pacman -Q msys2-runtime and verify that you are running a 2.5-series runtime.
  • If you are running a 2.5-series runtime, you can simply downgrade to the last-known-good version, 2.5.0, by running,
$ wget http://repo.msys2.org/msys/x86_64/msys2-runtime-2.5.0.17080.65c939c-1-x86_64.pkg.tar.xz
$ pacman -U msys2-runtime-2.5.0.17080.65c939c-1-x86_64.pkg.tar.xz
  • After you have an MSYS2 installation with function runtime, you'll need to ensure that the testsuite driver runs with the MSYS2 python interpreter (located in /usr/bin/python), not the MinGW-w64 interpreter (located in /mingw*/bin/python). This can be accomplished with make test PYTHON=/usr/bin/python.

Unfortunately there's no easy way of doing this with ./validate. The easiest (but terrible) hack is adding this line:

$ alias python='/usr/bin/python'

to your ~/.bashrc file.

Other documentation

Other documentation for Windows includes:

Last modified 3 weeks ago Last modified on Nov 23, 2016 8:04:44 AM