A package is a library of Haskell modules known to the compiler. GHC comes with several packages: see the accompanying library documentation.
Using a package couldn't be simpler: if you're using
--make or GHCi, then most of the installed packages will be
automatically available to your program without any further options. The
exceptions to this rule are covered below in Section 4.8.1, “Using Packages
Building your own packages is also quite straightforward: we provide the Cabal infrastructure which automates the process of configuring, building, installing and distributing a package. All you need to do is write a simple configuration file, put a few files in the right places, and you have a package. See the Cabal documentation for details, and also the Cabal libraries (Distribution.Simple, for example).
To see which packages are installed, use the
$ ghc-pkg list /usr/lib/ghc-6.4/package.conf: base-1.0, haskell98-1.0, template-haskell-1.0, mtl-1.0, unix-1.0, Cabal-1.0, haskell-src-1.0, parsec-1.0, network-1.0, QuickCheck-1.0, HUnit-1.1, fgl-1.0, X11-1.1, HGL-3.1, OpenGL-2.0, GLUT-2.0, stm-1.0, readline-1.0, (lang-1.0), (concurrent-1.0), (posix-1.0), (util-1.0), (data-1.0), (text-1.0), (net-1.0), (hssource-1.0), rts-1.0
Packages are either exposed or hidden. Only modules from exposed packages may be imported by your Haskell code; if you try to import a module from a hidden package, GHC will emit an error message.
Each package has an exposed flag, which says whether it is exposed by
default or not. Packages hidden by default are listed in
(lang-1.0)) in the output from
ghc-pkg list. To expose a package which is hidden by
default, use the
flag (see below).
To see which modules are exposed by a package:
$ ghc-pkg field network exposed-modules exposed-modules: Network.BSD, Network.CGI, Network.Socket, Network.URI, Network
In general, packages containing hierarchical modules are usually exposed by default. However, it is possible for two packages to contain the same module: in this case, only one of the packages can be exposed. This might happen if you have two versions of the same package installed, for example. The general rule is:
There must be no overlaps in the modules provided by all of the exposed packages, and the packages they depend on, and so on.
The GHC command line options that control packages are:
This option causes package
P to be
exposed. The package
P can be specified
in full with its version number
network-1.0) or the version number can be
omitted if there is only one version of the package
If there are multiple versions of
installed, then all other versions will become hidden.
option also causes package
P to be
linked into the resulting executable. In
––make mode and GHCi, the compiler
normally determines which packages are required by the current
Haskell modules, and links only those. In batch mode however, the
dependency information isn't available, and explicit
-package options must be given when linking.
For example, to link a program consisting of objects
we made use of the
network package, we need to
give GHC the
-package flag thus:
$ ghc -o myprog Foo.o Main.o -package network
The same flag is necessary even if we compiled the modules from source, because GHC still reckons it's in batch mode:
$ ghc -o myprog Foo.hs Main.hs -package network
modes (Section 4.4, “Modes of operation”), however, GHC figures out the
packages required for linking without further assistance.
The one other time you might need to use
-package to force linking a package is when the
package does not contain any Haskell modules (it might contain a C
library only, for example). In that case, GHC
will never discover a dependency on it, so it has to be mentioned
This option does the opposite of
causes the specified package to be hidden,
which means that none of its modules will be available for import
Note that the package might still end up being linked into the final program, if it is a dependency (direct or indirect) of another exposed package.
Causes the compiler to behave as if package
P is not installed at all. This is not
the same as
-hide-package, because under
-hide-package the package might still be present
in the program if another package depends on it.
not only causes package
P to be removed,
but also everything that depends on
and so on.
Why do we need
-ignore-package? Well, it is
particularly useful when you're actually compiling package
P itself. The compiler will refuse to
M is already part of a package. So we
P; but then if
P is a dependency of another package
P' we would have to
and the author of the code can't know in advance which packages are
installed on the system and hence which
-hide-package flags are required. So, we provide
-ignore-package which does the Right Thing.
A package database is a file, normally called
package.conf which contains descriptions of installed
packages. GHC usually knows about two package databases:
The global package database, which comes with your GHC installation.
A package database private to each user. On Unix
systems this will be
$HOME/.ghc/, and on
Windows it will be something like
C:\Documents And Settings\.
ghc-pkg tool knows where this file should be
located, and will create it if it doesn't exist (see Section 4.8.4, “Package management (the
When GHC starts up, it reads the contents of these two package
databases, and builds up a list of the packages it knows about. You can
see GHC's package table by running GHC with the
Package databases may overlap: for example, packages in the user database will override those of the same name in the global database.
You can control the loading of package databses using the following GHC options:
Read in the package configuration file
file in addition to the system
default file and the user's local file. Packages in additional
files read this way will override those in the global and user
Prevent loading of the user's local package database.
To create a new package database, just create
a new file and put the string
” in it. Packages can be
added to the file using the
ghc-pkg tool, described in Section 4.8.4, “Package management (the
We don't recommend building packages the hard way. Instead, use the Cabal infrastructure if possible. If your package is particularly complicated or requires a lot of configuration, then you might have to fall back to the low-level mechanisms, so a few hints for those brave souls follow.
You need to build an "installed package info" file for
ghc-pkg when installing your
package. The contents of this file are described in Section 4.8.5, “
InstalledPackageInfo: a package specification
The Haskell code in a package may be built into one or
more archive libraries
libHSfoo.a), or a single DLL on
restriction to a single DLL on Windows is because the
package system is used to tell the compiler when it should
make an inter-DLL call rather than an intra-DLL call
(inter-DLL calls require an extra
indirection). Building packages as DLLs doesn't
work at the moment; see Section 11.5.3, “Creating a DLL”
for the gory details.
Building a static library is done by using the
ar tool, like so:
ar cqs libHSfoo.a A.o B.o C.o ...
B.o and so on are the compiled Haskell
libHSfoo.a is the library
you wish to create. The syntax may differ slightly on your
system, so check the documentation if you run into
Versions of the Haskell libraries for use with GHCi
may also be included: GHCi cannot load
files directly, instead it will look for an object file
HSfoo.o and load that. On some
ghc-pkg tool can
automatically build the GHCi version of each library, see
Section 4.8.4, “Package management (the
ghc-pkg command)”. To build these
libraries by hand from the
.a archive, it
is possible to use GNU ld as
ld -r ––whole-archive -o HSfoo.o libHSfoo.a
–all_load on MacOS X)
GHC does not maintain detailed cross-package dependency information. It does remember which modules in other packages the current module depends on, but not which things within those imported things.
When compiling a Haskell module which is to be part of a new package
It is worth noting that on Windows, when each package
is built as a DLL, since a reference to a DLL costs an extra
indirection, intra-package references are cheaper than
inter-package references. Of course, this applies to the
Main package as well.
ghc-pkg tool allows packages to be
added or removed from a package database. By default,
the system-wide package database is modified, but alternatively
the user's local package database or another specified
file can be used.
Commands which only inspect the database (
field) will take into
account the user's local package database too, unless the
--global option is given. This matches the behaviour
of GHC, which automatically reads the user's local database if it is
ghc-pkg program may be run in the ways listed
below. Where a package name is required, the package can be named in
full including the version number
network-1.0), or without the version number if
there is only a single version of that package installed. Additionally,
the version may be given as
*, which means “all
versions”. For example,
ghc-pkg hide network-*
would hide all versions of the network package.
Reads a package specification from
file (which may be “
to indicate standard input),
and adds it to the database of installed packages. The syntax of
file is given in Section 4.8.5, “
InstalledPackageInfo: a package specification
The package specification must be a package that isn't already installed.
The same as
register, except that if a
package of the same name is already installed, it is
replaced by the new one.
Remove the specified package from the database.
exposed flag for package
exposed flag for package
This option displays the currently installed
packages, for each of the databases known to
ghc-pkg. That includes the global database, the
user's local database (if
--user is given), and
any further files specified using the
-f option on
the command line.
Hidden packages (those for which the
False) are shown in parentheses in the
list of packages.
Emit the full description of the specified package. The
description is in the form of an
InstalledPackageInfo, the same as the input file
ghc-pkg register. See Section 4.8.5, “
InstalledPackageInfo: a package specification
” for details.
Show just a single field of the installed package description
Additionally, the following flags are accepted by
Automatically generate the GHCi
.o version of each
.a Haskell library, using GNU ld (if
that is available). Without this option,
ghc-pkg will warn if GHCi versions of
any Haskell libraries in the package don't exist.
.o libraries don't
necessarily have to live in the same directory as the
.a library. However,
this option will cause the GHCi library to be created in
the same directory as the
Operate on the package database in
-f options are given, or
-f is used in conjunction with
--global, the last
one on the command-line is the one that will be modified.
ghc-pkg to ignore missing
dependencies, directories and libraries when registering a package,
and just go ahead and add it anyway. This might be useful if your
package installation system needs to add the package to
GHC before building and installing the files.
Operate on the global package database (this is the default).
This flag affects the
Outputs the command-line syntax.
Operate on the current user's local package database.
This flag affects the
ghc-pkg version number.
When modifying the package database
file, a copy of the original file is
so in an emergency you can always restore the old settings by
copying the old file back again.
A package specification is a Haskell record; in particular, it is the record InstalledPackageInfo in the module Distribution.InstalledPackageInfo, which is part of the Cabal package distributed with GHC.
InstalledPackageInfo has a human
readable/writable syntax. The functions
showInstalledPackageInfo read and write this syntax
respectively. Here's an example of the
InstalledPackageInfo for the
$ ghc-pkg describe unix name: unix version: 1.0 license: BSD3 copyright: maintainer: email@example.com stability: homepage: package-url: description: category: author: exposed: True exposed-modules: System.Posix, System.Posix.DynamicLinker.Module, System.Posix.DynamicLinker.Prim, System.Posix.Directory, System.Posix.DynamicLinker, System.Posix.Env, System.Posix.Error, System.Posix.Files, System.Posix.IO, System.Posix.Process, System.Posix.Resource, System.Posix.Temp, System.Posix.Terminal, System.Posix.Time, System.Posix.Unistd, System.Posix.User, System.Posix.Signals.Exts import-dirs: /usr/lib/ghc-6.4/libraries/unix library-dirs: /usr/lib/ghc-6.4/libraries/unix hs-libraries: HSunix extra-libs: HSunix_cbits, dl include-dirs: /usr/lib/ghc-6.4/libraries/unix/include includes: HsUnix.h depends: base-1.0
The full Cabal documentation is still in preparation (at time of writing), so in the meantime here is a brief description of the syntax of this file:
A package description consists of a number of field/value pairs. A
field starts with the field name in the left-hand column followed by a
:”, and the value continues until the next line that begins in the
left-hand column, or the end of file.
The syntax of the value depends on the field. The various field types are:
Any arbitrary string, no interpretation or parsing is done.
A sequence of non-space characters, or a sequence of arbitrary
characters surrounded by quotes
A sequence of strings, separated by commas. The sequence may be empty.
In addition, there are some fields with special syntax (e.g. package names, version, dependencies).
The allowed fields, with their types, are:
The package's name (without the version).
The package's version, usually in the form
A.B (any number of components are allowed).
(string) The type of license under which this package is distributed.
This field is a value of the
(optional string) The name of a file giving detailed license information for this package.
(optional freeform) The copyright string.
(optinoal freeform) The email address of the package's maintainer.
(optional freeform) A string describing the stability of the package (eg. stable, provisional or experimental).
(optional freeform) URL of the package's home page.
(optional freeform) URL of a downloadable distribution for this package. The distribution should be a Cabal package.
(optional freeform) Description of the package.
(optinoal freeform) Which category the package belongs to. This field is for use in conjunction with a future centralised package distribution framework, tentatively titled Hackage.
(optional freeform) Author of the package.
(bool) Whether the package is exposed or not.
(string list) modules exposed by this package.
(string list) modules provided by this package, but not exposed to the programmer. These modules cannot be imported, but they are still subject to the overlapping constraint: no other package in the same program may provide a module of the same name.
(string list) A list of directories containing interface files
.hi files) for this package.
If the package contains profiling libraries, then
the interface files for those library modules should have
.p_hi. So the package can
contain both normal and profiling versions of the same
library without conflict (see also
(string list) A list of directories containing libraries for this package.
(string list) A list of libraries containing Haskell code for this
package, with the
.dll suffix omitted. When packages are
built as libraries, the
lib prefix is also omitted.
For use with GHCi, each library should have an
object file too. The name of the object file does
not have a
prefix, and has the normal object suffix for your
For example, if we specify a Haskell library as
HSfoo in the package spec, then the
various flavours of library that GHC actually uses will be
The name of the library on Unix and Windows (mingw) systems. Note that we don't support building dynamic libraries of Haskell code on Unix systems.
The name of the dynamic library on Windows systems (optional).
The object version of the library used by GHCi.
(string list) A list of extra libraries for this package. The
extra-libs is that
hs-libraries normally have several
versions, to support profiling, parallel and other build
options. The various versions are given different
suffixes to distinguish them, for example the profiling
version of the standard prelude library is named
libHSbase_p.a, with the
_p indicating that this is a profiling
version. The suffix is added automatically by GHC for
hs-libraries only, no suffix is added
for libraries in
The libraries listed in
extra-libs may be any libraries
supported by your system's linker, including dynamic
.so on Unix,
.DLL on Windows).
extra-libs are placed
on the linker command line after the
hs-libraries for the same package. If
your package has dependencies in the other direction (i.e.
extra-libs depends on
hs-libraries), and the libraries are
static, you might need to make two separate
(string list) A list of directories containing C includes for this package.
(string list) A list of files to include for via-C compilations using this package. Typically the include file(s) will contain function prototypes for any C functions used in the package, in case they end up being called as a result of Haskell functions from the package being inlined.
(package name list) Packages on which this package depends. This field contains
packages with explicit versions are required, except that when
submitting a package to
ghc-pkg register, the
versions will be filled in if they are unambiguous.
(string list) Options to pass to Hugs for this package.
(string list) Extra arguments to be added to the gcc command line when this package is being used (only for via-C compilations).
(string list) Extra arguments to be added to the gcc command line (for linking) when this package is being used.
(string list) On Darwin/MacOS X, a list of directories containing
frameworks for this package. This corresponds to the
-framework-path option. It is ignored on all other
(string list) On Darwin/MacOS X, a list of frameworks to link to. This
corresponds to the
-framework option. Take a look
at Apple's developer documentation to find out what frameworks
actually are. This entry is ignored on all other platforms.
(string list) A list of filenames containing Haddock interface
.haddock files) for this package.
(optional string) The directory containing the Haddock-generated HTML for this package.