Packages
packagesA package is a library of Haskell modules known to the
compiler. GHC comes with several packages: see the accompanying
library
documentation. More packages to install can be obtained
from HackageDB.Using a package couldn't be simpler: if you're using
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 .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).Using Packages
packagesusingGHC only knows about packages that are
installed. To see which packages are installed, use
the ghc-pkg list command:
$ ghc-pkg list
/usr/lib/ghc-6.12.1/package.conf.d:
Cabal-1.7.4
array-0.2.0.1
base-3.0.3.0
base-4.2.0.0
bin-package-db-0.0.0.0
binary-0.5.0.1
bytestring-0.9.1.4
containers-0.2.0.1
directory-1.0.0.2
(dph-base-0.4.0)
(dph-par-0.4.0)
(dph-prim-interface-0.4.0)
(dph-prim-par-0.4.0)
(dph-prim-seq-0.4.0)
(dph-seq-0.4.0)
extensible-exceptions-0.1.1.0
ffi-1.0
filepath-1.1.0.1
(ghc-6.12.1)
ghc-prim-0.1.0.0
haskeline-0.6.2
haskell98-1.0.1.0
hpc-0.5.0.2
integer-gmp-0.1.0.0
mtl-1.1.0.2
old-locale-1.0.0.1
old-time-1.0.0.1
pretty-1.0.1.0
process-1.0.1.1
random-1.0.0.1
rts-1.0
syb-0.1.0.0
template-haskell-2.4.0.0
terminfo-0.3.1
time-1.1.4
unix-2.3.1.0
utf8-string-0.3.4
An installed package is either exposed
or hidden by default. Packages hidden by
default are listed in parentheses
(eg. (lang-1.0)), or possibly in blue if your
terminal supports colour, in the output of ghc-pkg
list. Command-line flags, described below, allow you
to expose a hidden package or hide an exposed one. 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.
Note: if you're using Cabal, then the exposed or hidden status
of a package is irrelevant: the available packages are instead
determined by the dependencies listed in
your .cabal specification. The
exposed/hidden status of packages is only relevant when
using ghc or ghci
directly.
Similar to a package's hidden status is a package's trusted
status. A package can be either trusted or not trusted (distrusted).
By default packages are distrusted. This property of a package only
plays a role when compiling code using GHC's Safe Haskell feature
(see ).
To see which modules are provided by a package use the
ghc-pkg command (see ):
$ ghc-pkg field network exposed-modules
exposed-modules: Network.BSD,
Network.CGI,
Network.Socket,
Network.URI,
Network
The GHC command line options that control packages are:This option causes the installed
package P to be exposed. The
package P can be specified in
full with its version number
(e.g. network-1.0) or the version
number can be omitted if there is only one version of the
package installed. If there are multiple versions
of P installed, then all other
versions will become hidden.The
option also causes package P to
be linked into the resulting executable or shared
object. Whether a packages' library is linked statically
or dynamically is controlled by the flag
pair /.In mode
and mode (see
), 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
options must be given when linking. The one other time you might need to use
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 explicitly.For example, to link a program consisting of objects
Foo.o and Main.o, where
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
Exposes a package like , but the
package is named by its ID rather than by name. This is a
more robust way to name packages, and can be used to
select packages that would otherwise be shadowed. Cabal
passes flags to GHC.
Ignore the exposed flag on installed packages, and hide them
all by default. If you use
this flag, then any packages you require (including
base) need to be explicitly exposed using
options.This is a good way to insulate your program from
differences in the globally exposed packages, and being
explicit about package dependencies is a Good Thing.
Cabal always passes the
flag to GHC, for
exactly this reason.PThis option does the opposite of : it
causes the specified package to be hidden,
which means that none of its modules will be available for import
by Haskell import directives.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.PCauses the compiler to behave as if package
P, and any packages that depend on
P, are not installed at all.Saying -ignore-package P is the same as
giving -hide-package flags for
P and all the packages that depend on
P. Sometimes we don't know ahead of time which
packages will be installed that depend on P,
which is when the -ignore-package flag can be
useful.By default, GHC will automatically link in the
haskell98 package. This flag disables that
behaviour.fooTells GHC the the module being compiled forms part of
package foo.
If this flag is omitted (a very common case) then the
default package main is assumed.Note: the argument to
should be the full
package name-version for the package.
For example:
-package mypkg-1.2.PThis option causes the install package P
to be both exposed and trusted by GHC. This
command functions in the in a very similar way to the command but in addition sets the selected
packaged to be trusted by GHC, regardless of the contents of
the package database. (see ).
PThis option causes the install package P
to be both exposed and distrusted by GHC. This
command functions in the in a very similar way to the command but in addition sets the selected
packaged to be distrusted by GHC, regardless of the contents of
the package database. (see ).
Ignore the trusted flag on installed packages, and distrust
them by default. If you use this flag and Safe Haskell then any
packages you require to be trusted (including base
) need to be explicitly trusted using options. This option does not change the exposed/hidden
status of a package, so it isn't equivalent to applying to all packages on the system. (see
).
The main packageEvery complete Haskell program must define main in
module Main
in package main. (Omitting the flag compiles
code for package main.) Failure to do so leads to a somewhat obscure
link-time error of the form:
/usr/bin/ld: Undefined symbols:
_ZCMain_main_closure
Consequences of packages for the Haskell languageIt is possible that by using packages you might end up with
a program that contains two modules with the same name: perhaps
you used a package P that has a hidden module
M, and there is also a module M in your program. Or perhaps the
dependencies of packages that you used contain some overlapping
modules. Perhaps the program even contains multiple versions of a
certain package, due to dependencies from other packages.None of these scenarios gives rise to an error on its
ownit used to in GHC 6.4, but not since
6.6, but they may have some interesting
consequences. For instance, if you have a type
M.T from version 1 of package
P, then this is not the
same as the type M.T from version 2 of package
P, and GHC will report an error if you try to
use one where the other is expected.Formally speaking, in Haskell 98, an entity (function, type
or class) in a program is uniquely identified by the pair of the
module name in which it is defined and its name. In GHC, an
entity is uniquely defined by a triple: package, module, and
name.Package Databases
A package database is where the details about installed packages
are stored. It is a directory, usually
called package.conf.d, that contains a file
for each package, together with a binary cache of the package
data in the file package.cache. Normally
you won't need to look at or modify the contents of a package
database directly; all management of package databases can be
done through the ghc-pkg tool (see
).
GHC knows about two package databases in particular:
The global package database, which comes with your GHC
installation,
e.g. /usr/lib/ghc-6.12.1/package.conf.d.A package database private to each user. On Unix
systems this will be
$HOME/.ghc/arch-os-version/package.conf.d, and on
Windows it will be something like
C:\Documents And Settings\user\ghc\package.conf.d.
The ghc-pkg tool knows where this file should be
located, and will create it if it doesn't exist (see ).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
flag.Package databases may overlap: for example, packages in the
user database will override (shadow) those
of the same name and version in the global database.You can control the loading of package databases 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
databases.Prevent loading of the user's local package database.The GHC_PACKAGE_PATH environment variableEnvironment variableGHC_PACKAGE_PATHGHC_PACKAGE_PATHThe GHC_PACKAGE_PATH environment variable may be
set to a :-separated (;-separated
on Windows) list of files containing package databases. This list of
package databases is used by GHC and ghc-pkg, with earlier databases in
the list overriding later ones. This order was chosen to match the
behaviour of the PATH environment variable; think of
it as a list of package databases that are searched left-to-right for
packages.If GHC_PACKAGE_PATH ends in a separator, then
the default user and system package databases are appended, in that
order. e.g. to augment the usual set of packages with a database of
your own, you could say (on Unix):
$ export GHC_PACKAGE_PATH=$HOME/.my-ghc-packages.conf:
(use ; instead of : on
Windows).To check whether your GHC_PACKAGE_PATH setting
is doing the right thing, ghc-pkg list will list all
the databases in use, in the reverse order they are searched.Package IDs, dependencies, and broken packagesEach installed package has a unique identifier (the
“installed package ID”, or just “package
ID” for short) , which distinguishes it from all other
installed packages on the system. To see the package IDs
associated with each installed package, use ghc-pkg
list -v:
$ ghc-pkg list -v
using cache: /usr/lib/ghc-6.12.1/package.conf.d/package.cache
/usr/lib/ghc-6.12.1/package.conf.d
Cabal-1.7.4 (Cabal-1.7.4-48f5247e06853af93593883240e11238)
array-0.2.0.1 (array-0.2.0.1-9cbf76a576b6ee9c1f880cf171a0928d)
base-3.0.3.0 (base-3.0.3.0-6cbb157b9ae852096266e113b8fac4a2)
base-4.2.0.0 (base-4.2.0.0-247bb20cde37c3ef4093ee124e04bc1c)
...
The string in parentheses after the package name is the package
ID: it normally begins with the package name and version, and
ends in a hash string derived from the compiled package.
Dependencies between packages are expressed in terms of package
IDs, rather than just packages and versions. For example, take
a look at the dependencies of the haskell98
package:
$ ghc-pkg field haskell98 depends
depends: array-0.2.0.1-9cbf76a576b6ee9c1f880cf171a0928d
base-4.2.0.0-247bb20cde37c3ef4093ee124e04bc1c
directory-1.0.0.2-f51711bc872c35ce4a453aa19c799008
old-locale-1.0.0.1-d17c9777c8ee53a0d459734e27f2b8e9
old-time-1.0.0.1-1c0d8ea38056e5087ef1e75cb0d139d1
process-1.0.1.1-d8fc6d3baf44678a29b9d59ca0ad5780
random-1.0.0.1-423d08c90f004795fd10e60384ce6561
The purpose of the package ID is to detect problems caused by
re-installing a package without also recompiling the packages
that depend on it. Recompiling dependencies is necessary,
because the newly compiled package may have a different ABI
(Application Binary Interface) than the previous version, even
if both packages were built from the same source code using the
same compiler. With package IDs, a recompiled
package will have a different package ID from the previous
version, so packages that depended on the previous version are
now orphaned - one of their dependencies is not satisfied.
Packages that are broken in this way are shown in
the ghc-pkg list output either in red (if
possible) or otherwise surrounded by braces. In the following
example, we have recompiled and reinstalled
the filepath package, and this has caused
various dependencies including Cabal to
break:
$ ghc-pkg list
WARNING: there are broken packages. Run 'ghc-pkg check' for more details.
/usr/lib/ghc-6.12.1/package.conf.d:
{Cabal-1.7.4}
array-0.2.0.1
base-3.0.3.0
... etc ...
Additionally, ghc-pkg list reminds you that
there are broken packages and suggests ghc-pkg
check, which displays more information about the
nature of the failure:
$ ghc-pkg check
There are problems in package ghc-6.12.1:
dependency "filepath-1.1.0.1-87511764eb0af2bce4db05e702750e63" doesn't exist
There are problems in package haskeline-0.6.2:
dependency "filepath-1.1.0.1-87511764eb0af2bce4db05e702750e63" doesn't exist
There are problems in package Cabal-1.7.4:
dependency "filepath-1.1.0.1-87511764eb0af2bce4db05e702750e63" doesn't exist
There are problems in package process-1.0.1.1:
dependency "filepath-1.1.0.1-87511764eb0af2bce4db05e702750e63" doesn't exist
There are problems in package directory-1.0.0.2:
dependency "filepath-1.1.0.1-87511764eb0af2bce4db05e702750e63" doesn't exist
The following packages are broken, either because they have a problem
listed above, or because they depend on a broken package.
ghc-6.12.1
haskeline-0.6.2
Cabal-1.7.4
process-1.0.1.1
directory-1.0.0.2
bin-package-db-0.0.0.0
hpc-0.5.0.2
haskell98-1.0.1.0
To fix the problem, you need to recompile the broken packages
against the new dependencies. The easiest way to do this is to
use cabal-install, or download the packages
from HackageDB
and build and install them as normal.Be careful not to recompile any packages that GHC itself
depends on, as this may render the ghc
package itself broken, and ghc cannot be
simply recompiled. The only way to recover from this would be
to re-install GHC.Package management (the ghc-pkg command)packagesmanagementThe ghc-pkg tool is for querying and
modifying package databases. To see what package databases are
in use, use
ghc-pkg list. The stack of databases that
ghc-pkg knows about can be modified using the
GHC_PACKAGE_PATH environment variable (see , and using
--package-conf options on the
ghc-pkg command line.When asked to modify a database, ghc-pkg modifies
the global database by default. Specifying
causes it to act on the user database, or
can be used to act on another database entirely. When multiple of these
options are given, the rightmost one is used as the database to act
upon.Commands that query the package database (list, latest,
describe, field, dot) operate on the list of databases specified by
the flags , , and
. If none of these flags are
given, the default is
.If the environment variable GHC_PACKAGE_PATH is
set, and its value does not end in a separator (: on
Unix, ; on Windows), then the last database is
considered to be the global database, and will be modified by default by
ghc-pkg. The intention here is that
GHC_PACKAGE_PATH can be used to create a virtual
package environment into which Cabal packages can be installed without
setting anything other than GHC_PACKAGE_PATH.The 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
(e.g. network-1.0), or without the version number.
Naming a package without the version number matches all versions of the
package; the specified action will be applied to all the matching
packages. A package specifier that matches all version of the package
can also be written pkg-*,
to make it clearer that multiple packages are being matched.ghc-pkg init pathCreates a new, empty, package database
at path, which must not already
exist.ghc-pkg register fileReads 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 .The package specification must be a package that isn't already
installed.ghc-pkg update fileThe same as register, except that if a
package of the same name is already installed, it is
replaced by the new one.ghc-pkg unregister PRemove the specified package from the database.ghc-pkg checkCheck consistency of dependencies in the package
database, and report packages that have missing
dependencies.ghc-pkg expose PSets the exposed flag for package
P to True.ghc-pkg hide PSets the exposed flag for package
P to False.ghc-pkg trust PSets the trusted flag for package
P to True.ghc-pkg distrust PSets the trusted flag for package
P to False.ghc-pkg list [P] []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, and any further files specified using the
option on the command line.Hidden packages (those for which the exposed
flag is False) are shown in parentheses in the
list of packages.If an optional package identifier P
is given, then only packages matching that identifier are
shown.If the option is given, then
the packages are listed on a single line separated by spaces, and
the database names are not included. This is intended to make it
easier to parse the output of ghc-pkg list using
a script.ghc-pkg find-module M []This option lists registered packages exposing module
M. Examples:
$ ghc-pkg find-module Var
c:/fptools/validate/ghc/driver/package.conf.inplace:
(ghc-6.9.20080428)
$ ghc-pkg find-module Data.Sequence
c:/fptools/validate/ghc/driver/package.conf.inplace:
containers-0.1
Otherwise, it behaves like ghc-pkg list,
including options.ghc-pkg latest PPrints the latest available version of package
P.ghc-pkg describe PEmit the full description of the specified package. The
description is in the form of an
InstalledPackageInfo, the same as the input file
format for ghc-pkg register. See for details.If the pattern matches multiple packages, the
description for each package is emitted, separated by the
string --- on a line by itself.ghc-pkg field Pfield[,field]*Show just a single field of the installed package description
for P. Multiple fields can be selected by separating
them with commasghc-pkg dot
Generate a graph of the package dependencies in a form
suitable for input for the graphviz tools. For example,
to generate a PDF of the dependency graph:
ghc-pkg dot | tred | dot -Tpdf >pkgs.pdf
ghc-pkg dumpEmit the full description of every package, in the
form of an InstalledPackageInfo.
Multiple package descriptions are separated by the
string --- on a line by itself.This is almost the same as ghc-pkg describe '*', except that ghc-pkg dump
is intended for use by tools that parse the results, so
for example where ghc-pkg describe '*'
will emit an error if it can't find any packages that
match the pattern, ghc-pkg dump will
simply emit nothing.ghc-pkg recache
Re-creates the binary cache
file package.cache for the selected
database. This may be necessary if the cache has somehow
become out-of-sync with the contents of the database
(ghc-pkg will warn you if this might be
the case).
The other time when ghc-pkg recache is
useful is for registering packages manually: it is
possible to register a package by simply putting the
appropriate file in the package database directory and
invoking ghc-pkg recache to update the
cache. This method of registering packages may be more
convenient for automated packaging systems.
Substring matching is supported for M in
find-module and for P in
list, describe, and
field, where a '*' indicates open
substring ends (prefix*, *suffix,
*infix*). Examples (output omitted):
-- list all regex-related packages
ghc-pkg list '*regex*' --ignore-case
-- list all string-related packages
ghc-pkg list '*string*' --ignore-case
-- list OpenGL-related packages
ghc-pkg list '*gl*' --ignore-case
-- list packages exporting modules in the Data hierarchy
ghc-pkg find-module 'Data.*'
-- list packages exporting Monad modules
ghc-pkg find-module '*Monad*'
-- list names and maintainers for all packages
ghc-pkg field '*' name,maintainer
-- list location of haddock htmls for all packages
ghc-pkg field '*' haddock-html
-- dump the whole database
ghc-pkg describe '*'
Additionally, the following flags are accepted by
ghc-pkg:filefileAdds file to the stack of package
databases. Additionally, file will
also be the database modified by a register,
unregister, expose or
hide command, unless it is overridden by a later
, or
option.Causes 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 register,
update, unregister,
expose, and hide
commands.Outputs the command-line syntax.Operate on the current user's local package database.
This flag affects the register,
update, unregister,
expose, and hide
commands.nghc-pkg
option=nghc-pkg option
Control verbosity. Verbosity levels range from 0-2, where
the default is 1, and alone selects
level 2.
Output the ghc-pkg version number.Building a package from Haskell sourcepackagesbuildingWe 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
passing to ghc-pkg when installing your
package. The contents of this file are described in
.The Haskell code in a package may be built into one or more
archive libraries (e.g. libHSfoo.a), or a
single shared object
(e.g. libHSfoo.dll/.so/.dylib). The
restriction to a single shared object is because the package
system is used to tell the compiler when it should make an
inter-shared-object call rather than an intra-shared-object-call
call (inter-shared-object calls require an extra
indirection).Building a static library is done by using the
ar tool, like so:ar cqs libHSfoo-1.0.a A.o B.o C.o ...where A.o,
B.o and so on are the compiled Haskell
modules, and 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 difficulties.To load a package foo, GHCi can load
its libHSfoo.a library directly, but it
can also load a package in the form of a
single HSfoo.o file that has been
pre-linked. Loading the .o file is
slightly quicker, but at the expense of having another copy
of the compiled package. The rule of thumb is that if the
modules of the package were compiled
with then building
the HSfoo.o is worthwhile because it
saves time when loading the package into GHCi.
Without , there is not much
difference in load time between the .o
and .a libraries, so it is better to save
the disk space and only keep the .a
around. In a GHC distribution we
provide .o files for most packages except
the GHC package itself.
The HSfoo.o file is built by Cabal
automatically;
use to disable
it. To build one manually, the following
GNU ld command can be used:ld -r ––whole-archive -o HSfoo.o libHSfoo.a(replace
––whole-archive with
–all_load on MacOS X)When building the package as shared library, GHC can be used to
perform the link step. This hides some of the details
out the underlying linker and provides a common
interface to all shared object variants that are supported
by GHC (DLLs, ELF DSOs, and Mac OS dylibs). The shared
object must be named in specific way for two reasons: (1)
the name must contain the GHC compiler version, so that two
library variants don't collide that are compiled by
different versions of GHC and that therefore are most likely
incompatible with respect to calling conventions, (2) it
must be different from the static name otherwise we would
not be able to control the linker as precisely as necessary
to make
the / flags
work, see .ghc -shared libHSfoo-1.0-ghcGHCVersion.so A.o B.o C.oUsing GHC's version number in the shared object name
allows different library versions compiled by different GHC
versions to be installed in standard system locations,
e.g. under *nix /usr/lib. To obtain the version number of
GHC invoke ghc --numeric-version and use
its output in place
of GHCVersion. See also
on how object files must
be prepared for shared object linking.To compile a module which is to be part of a new package,
use the -package-name option ().
Failure to use the -package-name option
when compiling a package will probably result in disaster, but
you will only discover later when you attempt to import modules
from the package. At this point GHC will complain that the
package name it was expecting the module to come from is not the
same as the package name stored in the .hi
file.It is worth noting with shared objects, when each package
is built as a single shared object file, since a reference to a shared object costs an extra
indirection, intra-package references are cheaper than
inter-package references. Of course, this applies to the
main package as well.InstalledPackageInfo: a package specification
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.An InstalledPackageInfo has a human
readable/writable syntax. The functions
parseInstalledPackageInfo and
showInstalledPackageInfo read and write this syntax
respectively. Here's an example of the
InstalledPackageInfo for the unix package:
$ ghc-pkg describe unix
name: unix
version: 2.3.1.0
id: unix-2.3.1.0-de7803f1a8cd88d2161b29b083c94240
license: BSD3
copyright:
maintainer: libraries@haskell.org
stability:
homepage:
package-url:
description: This package gives you access to the set of operating system
services standardised by POSIX 1003.1b (or the IEEE Portable
Operating System Interface for Computing Environments -
IEEE Std. 1003.1).
.
The package is not supported under Windows (except under Cygwin).
category: System
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.Process.Internals System.Posix.Resource
System.Posix.Temp System.Posix.Terminal System.Posix.Time
System.Posix.Unistd System.Posix.User System.Posix.Signals
System.Posix.Signals.Exts System.Posix.Semaphore
System.Posix.SharedMem
hidden-modules:
trusted: False
import-dirs: /usr/lib/ghc-6.12.1/unix-2.3.1.0
library-dirs: /usr/lib/ghc-6.12.1/unix-2.3.1.0
hs-libraries: HSunix-2.3.1.0
extra-libraries: rt util dl
extra-ghci-libraries:
include-dirs: /usr/lib/ghc-6.12.1/unix-2.3.1.0/include
includes: HsUnix.h execvpe.h
depends: base-4.2.0.0-247bb20cde37c3ef4093ee124e04bc1c
hugs-options:
cc-options:
ld-options:
framework-dirs:
frameworks:
haddock-interfaces: /usr/share/doc/ghc/html/libraries/unix/unix.haddock
haddock-html: /usr/share/doc/ghc/html/libraries/unix
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:freeformAny arbitrary string, no interpretation or parsing is
done.stringA sequence of non-space characters, or a sequence of arbitrary
characters surrounded by quotes "....".string listA 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:namenamepackage specificationThe package's name (without the version).ididpackage specificationThe package ID. It is up to you to choose a suitable
one.versionversionpackage specificationThe package's version, usually in the form
A.B (any number of components are allowed).licenseautopackage specification(string) The type of license under which this package is distributed.
This field is a value of the License type.license-filelicense-filepackage specification(optional string) The name of a file giving detailed license
information for this package.copyrightcopyrightpackage specification(optional freeform) The copyright string.maintainermaintainerpackage specification(optional freeform) The email address of the package's maintainer.stabilitystabilitypackage specification(optional freeform) A string describing the stability of the package
(eg. stable, provisional or experimental).homepagehomepagepackage specification(optional freeform) URL of the package's home page.package-urlpackage-urlpackage specification(optional freeform) URL of a downloadable distribution for this
package. The distribution should be a Cabal package.descriptiondescriptionpackage specification(optional freeform) Description of the package.categorycategorypackage specification(optional freeform) Which category the package belongs to. This field
is for use in conjunction with a future centralised package
distribution framework, tentatively titled Hackage.authorauthorpackage specification(optional freeform) Author of the package.exposedexposedpackage specification(bool) Whether the package is exposed or not.exposed-modulesexposed-modulespackage specification(string list) modules exposed by this package.hidden-moduleshidden-modulespackage specification(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.trustedtrustedpackage specification(bool) Whether the package is trusted or not.import-dirsimport-dirspackage specification(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
the suffix .p_hi. So the package can
contain both normal and profiling versions of the same
library without conflict (see also
library_dirs below).library-dirslibrary-dirspackage specification(string list) A list of directories containing libraries for this
package.hs-librarieshs-librariespackage specification(string list) A list of libraries containing Haskell code for this
package, with the .a or
.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 lib
prefix, and has the normal object suffix for your
platform.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
called:libHSfoo.aThe 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.HSfoo.dllThe name of the dynamic library on Windows
systems (optional).HSfoo.oHSfoo.objThe object version of the library used by
GHCi.extra-librariesextra-librariespackage specification(string list) A list of extra libraries for this package. The
difference between hs-libraries and
extra-libraries 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
extra-libraries.The libraries listed in
extra-libraries may be any libraries
supported by your system's linker, including dynamic
libraries (.so on Unix,
.DLL on Windows).Also, extra-libraries 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-libraries depends on
hs-libraries), and the libraries are
static, you might need to make two separate
packages.include-dirsinclude-dirspackage specification(string list) A list of directories containing C includes for this
package.includesincludespackage specification(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.dependsdependspackage specification(package id list) Packages on which this package
depends.hugs-optionshugs-optionspackage specification(string list) Options to pass to Hugs for this package.cc-optionscc-optionspackage specification(string list) Extra arguments to be added to the gcc command line
when this package is being used (only for via-C
compilations).ld-optionsld-optionspackage specification(string list) Extra arguments to be added to the
gcc command line (for linking) when
this package is being used.framework-dirsframework-dirspackage specification(string list) On Darwin/MacOS X, a list of directories containing
frameworks for this package. This corresponds to the
option. It is ignored on all other
platforms.frameworksframeworkspackage specification(string list) On Darwin/MacOS X, a list of frameworks to link to. This
corresponds to the option. Take a look
at Apple's developer documentation to find out what frameworks
actually are. This entry is ignored on all other platforms.haddock-interfaceshaddock-interfacespackage specification(string list) A list of filenames containing Haddock interface
files (.haddock files) for this package.haddock-htmlhaddock-htmlpackage specification(optional string) The directory containing the Haddock-generated HTML
for this package.