Setting Up a FreeBSD System for Building GHC
Building GHC on FreeBSD is currently supported on 8.4-RELEASE
or later, on i386
(x86) and amd64
(x86_64) architectures. One might be able to build GHC on different architectures and earlier versions but they are not maintained actively. Note that 8.4-RELEASE
is used for the FreeBSD nightly builds (amd64 head, i386 head).
Note that this section is primarily intended for developers and early adopters. If you are just want to install GHC on your system, simply use the devel/hs-haskell-platform port instead. This port does all the things described below for you. It is usually kept updated to match the latest Haskell Platform specifications.
Required Ports
In order to be able to build GHC from source, the following ports have to be installed.
- converters/libiconv (GNU libiconv, versions before 10.0 only)
- devel/autoconf (GNU Autoconf)
- devel/automake (GNU Automake)
- devel/git (for getting and managing the GHC sources)
- devel/gmake (GNU Make)
- devel/hs-alex (alex)
- devel/hs-happy (happy)
- ftp/curl (HTTP support for git)
- lang/ghc (bootstrap compiler, usually tracking Haskell Platform specifications)
- lang/python37 (Python, for the test suite)
- math/gmp (GNU GMP)
Probably it is possible to use a vanilla binary distribution to bootstrap the build, but one must note that it is built on 8.4-RELEASE
, hence it will require installing misc/compat8x in order to make it work on 9.x and later systems.
Optional Ports
In addition to the required ones, there are some further ports to install for extras.
- devel/binutils (for a more up-to-date version of the GNU toolchain, see Notes)
- devel/libffi (for dynamic linking)
- devel/llvm (for LLVM code generation)
- devel/hs-haskell-platform (the complete Haskell Platform)
- devel/hs-hasktags (for generating HTAGS files)
-
devel/ncurses (for a more up-to-date version for the
terminfo
library, see Notes) - lang/gcc (for GCC 4.6 or later, see Notes)
- print/hs-hscolour (for HsColourized Haddock documentation)
- py37-sphinx (for the users guide)
configure
Running FreeBSD stores locally installed third-party software (i.e. the ports mentioned above) under a separate prefix, called LOCALBASE
here, which is /usr/local/
by default. Thus the preferred way of invoking the configure
script is as follows.
$ ./configure \
--with-gmp-includes=$LOCALBASE/include --with-gmp-libraries=$LOCALBASE/lib \
--disable-large-address-space
The --disable-large-address-space
disables the runtime's two-step allocator, which isn't currently supported on FreeBSD prior to 11.1 and GHC earlier than 8.6 (see #12695 (closed)).
On systems earlier than 10.0-RELEASE
, one has to configure iconv(3)
as well. For 10.0-RELEASE
and later, iconv(3)
functions are part of the base system libraries, so these flags is not needed any more.
--with-iconv-includes=$LOCALBASE/include --with-iconv-libraries=$LOCALBASE/lib \
To use a more recent GCC (this is gcc46
here) and GNU toolchain from the Ports Collection, it should be added as well:
--with-gcc=$LOCALBASE/bin/gcc46 --with-gcc-4.2=$LOCALBASE/bin/gcc46 \
--with-ld=$LOCALBASE/bin/ld
Note that one may also want to set the CC
environment variable to gcc46
before running configure
.
To use libffi
from the Ports Collection:
--with-system-libffi \
--with-ffi-includes=$LOCALBASE/include --with-ffi-libraries=$LOCALBASE/lib
Building the Sources
After configure
ran successfully, invoke GNU make as usual. Note that GNU make is called gmake
under FreeBSD as make
is the BSD make.
$ gmake -j `sysctl -n hw.ncpu`
Notes
Here is a random list of thoughts about things that are good to know when working on FreeBSD.
-
The Alex and Happy ports may not be up-to-date enough for building GHC (as they are tracking the versions specified in the Haskell Platform). Install
cabal-install
and install those tools usingcabal
instead. -
The FreeBSD base system contains GCC and the GNU toolchain in older (pre-10.0) versions. GCC is technically stuck at version 4.2.1 which may not be optimal for building GHC these days. Hence it is highly recommended to use the GNU toolchain (devel/binutils) and GCC ( lang/gcc) from the Ports Collection instead.
-
Clang is the default base system compiler for FreeBSD 10.0 or later. So one may try to build GHC using Clang on such systems (however, Clang can also be installed on earlier versions from the lang/clang33 port). It should work, but have not yet been extensively tested.
-
The FreeBSD base system is shipped with a version of
ncurses
but this may not be the latest. Unfortunately, when devel/ncurses is installed one should add some extra lines tomk/build.mk
to tell GNU make we want to usencurses
from$LOCALBASE
(see above) instead, otherwiseterminfo
(which usesncurses
) becomes linked toncurses
in the base:SRC_HC_OPTS += -I$LOCALBASE/include -L$LOCALBASE/lib libraries/terminfo_CONFIGURE_OPTS += --configure-option=--with-curses-includes=$LOCALBASE/include --configure-option=--with-curses-libraries=$LOCALBASE/lib
See #7472 (closed) for possible symptoms.
-
The GHC source code have an in-tree version of
libffi
andgmp
which may work by accident -- especially if the version oflibgmp.so
andlibffi.so
matches the version installed by the ports. But using them is not recommended as they could result in various strange build and run-time errors. See theconfigure
options to work around them. -
In an extremely high-speed environment it might happen that
gmake
restarts multiple times, c.f. #7592 (closed). This is because timestamp precision for the VFS layer is set to a POSIX-friendly value by default. Adjusting thevfs.timestamp_precision
sysctl(3) variable can help. -
Building GHC sources and Haskell sources in general could be sped up by setting up a tmpfs(5) partition. (This is not created by the default install.) Just replace the
/tmp
partition with a tmpfs-backed entry in/etc/fstab
:tmpfs /tmp tmpfs rw,mode=777 0 0
and use your original
/tmp
partition as a swap device (substituteada0s1
with your device):/dev/ada0s1d none swap sw 0 0