Difference between revisions of "Upgrading packages/Updating to GHC 6.10"

From HaskellWiki
Jump to navigation Jump to search
m (call them core packages consistently)
Line 3: Line 3:
If you maintain a Haskell package this is for you.
If you maintain a Haskell package this is for you.
For older versions of this document:
== Updating to GHC 6.8 and Cabal 1.2 ==
* [/Updating to GHC 6.8]
So now that GHC 6.8.x is out you'll want to test your package with it. We'd especially like maintainers of packages that are distributed on http://hackage.haskell.org/ to test their packages and update them as necessary.
However everyone would appreciate it if your packages will still work with GHC
6.6.x, so read below for details on how to do that.
== Updating to GHC 6.10 and Cabal 1.6 ==
=== base package split up ===
You'll most likely find that your package fails to build with GHC 6.8.x
with an error message like this:
Could not find module `Data.Map': it is a member of package
containers-, which is hidden.
This is the first symptom of the change in the base library in GHC 6.8.x. Several parts of the old base library got split out into separate packages. For example <hask>Data.Map</hask> is now in the <hask>containers</hask> package (see below for the complete list of [[#New core packages]]). Unfortunately this means most packages need updating.
=== Cabal configuration support ===
Of course you'd also like to make your packages continue to work with
GHC 6.6.x (and perhaps older). If you go and just add <hask>containers</hask> to your package's <hask>build-depends</hask> then it will no longer work with GHC 6.6.x or older. So the solution at the moment is to use Cabal configurations like so:
flag splitBase
description: Choose the new smaller, split-up base package.
if flag(splitBase)
build-depends: base >= 3, containers
build-depends: base < 3
Since this uses a new Cabal feature you'll have to make your packages
require Cabal 1.2 or later:
<pre>cabal-version: >=1.2</pre>
This is ok since Cabal 1.2.x comes with GHC 6.8.x and can also be installed from [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Cabal hackage] for older GHC versions.
For a bigger example see [http://hackage.haskell.org/packages/archive/Cabal/ Cabal's own .cabal file]
The new Cabal syntax is explained in the [http://haskell.org/cabal/release/rc/doc/users-guide/x30.html#configurations Cabal user guide]
=== Cabal API changes ===
Many packages that use non-default <hask>Setup.hs</hask> or <hask>Setup.lhs</hask> files need to be updated as they use Cabal APIs that have changed. In many cases new features in Cabal 1.2 allow these packages to go back to using the default <hask>Setup.hs</hask>.
A more detailed survey of the packages from the [http://hackage.haskell.org hackage] collection is here:
If your package does use the default <hask>Setup.hs</hask> file then you can indicate this by adding the following line to your <hask>.cabal</hask> file:
<pre>build-type: Simple</pre>
This allows tools like [[cabal-install]] to avoid compiling the Setup.hs file at all. The other build types are explained in the [http://haskell.org/cabal/release/rc/doc/users-guide/x30.html#general-fields Cabal user guide].
=== New core packages ===
The base package was split up, and new dependencies are now required;
* array: Data.Array and below
* bytestring: Data.ByteString and below
* packedstring: Data.PackedString (deprecated)
* containers: Data.{Graph,IntMap,IntSet,Map,Sequence,Set,Tree}
* random: System.Random
* pretty: Text.PrettyPrint and below
* process: System.Cmd, System.Process and below
* directory: System.Directory
* old-time: System.Time
* old-locale: System.Locale
([http://www.haskell.org/haskellwiki/Image:Boot-packages.png dependency graph of the core packages])
These core packages are included with GHC 6.8.x. If your package imports any of these modules, you need only add the corresponding package names to the <hask>build-depends</hask> line in your .cabal file.
For example, the GHC error message
Could not find module `System.Directory':
it is a member of package directory-, which is hidden
indicates that <hask>directory</hask> should be added to the <hask>build-depends</hask> line.
=== Data.ByteString api changes ===
Data.ByteString.packCStringLen is no longer a pure function; its signature has changed from
<haskell>packCStringLen :: Foreign.C.String.CStringLen -> ByteString</haskell>
<haskell>packCStringLen :: Foreign.C.String.CStringLen -> IO ByteString</haskell>
<hask>module Data.ByteString.Base</hask> has been split into two. The "unsafe" functions moved to <hask>Data.ByteString.Unsafe</hask> and the others moved into <hask>Data.ByteString.Internal</hask>. The stable API going forward is all the modules exposed by the <hask>bytestring</hask> package except for the <hask>.Internal</hask> modules and the <hask>.Fusion</hask> module.
The lazy <hask>ByteString</hask> representation type has changed. Instead of a newtyped list:
<haskell>newtype ByteString = LPS [Strict.ByteString]</haskell>
it is now:
<haskell>data ByteString = Empty | Chunk !Strict.ByteString ByteString</haskell>
The crucial difference is that in the latter representation we can unpack the strict <hask>ByteString</hask> into the <hask>Chunk</hask> constructor which reduces the number of indirections to get at the string data from two to one.
=== Other core library api changes ===
They are listed in detail in the [http://haskell.org/ghc/docs/latest/html/users_guide/release-6-8-1.html#id3129818 GHC 6.8 release notes]

Revision as of 03:24, 9 October 2008

A list of things that need updating when porting packages to newer library/cabal versions.

If you maintain a Haskell package this is for you.

For older versions of this document:

  • [/Updating to GHC 6.8]

Updating to GHC 6.10 and Cabal 1.6