Difference between revisions of "Upgrading packages/Updating to GHC 6.10"
DonStewart (talk | contribs) |
DuncanCoutts (talk | contribs) |
||
Line 19: | Line 19: | ||
* array |
* array |
||
* bytestring |
* bytestring |
||
+ | * packedstring (deprecated) |
||
* containers |
* containers |
||
* random |
* random |
||
* pretty |
* pretty |
||
+ | * process |
||
+ | * directory |
||
+ | * old-time |
||
+ | * old-locale |
||
+ | ([http://haskell.org/~duncan/ghc/core-packages.png dependency graph of the core libraries]) |
||
− | and more. Dealing with these is a simple matter of installing the |
||
+ | |||
− | packages from hackage, and updating the build-depends in your cabal |
||
+ | These core packages are included with ghc-6.8. Updating your package just involves adding the necessary packages to the build-depends in your cabal file. However if you want to support both ghc-6.6 and ghc-6.8 you need to use the configurations feature in your .cabal file. For example: |
||
− | file. |
||
+ | |||
+ | flag splitBase |
||
+ | description: Choose the new smaller, split-up base package. |
||
+ | |||
+ | library |
||
+ | if flag(splitBase) |
||
+ | build-depends: base >= 3, pretty, directory, old-time, process, containers |
||
+ | else |
||
+ | build-depends: base < 3 |
||
+ | |||
+ | This is a simplified excerpt from Cabal's own [http://darcs.haskell.org/cabal-branches/cabal-1.2/Cabal.cabal Cabal.cabal file]. |
||
=== Data.ByteString api changes === |
=== Data.ByteString api changes === |
||
Line 31: | Line 47: | ||
module Data.ByteString.Base has been split into two. The "unsafe" functions moved to Data.ByteString.Unsafe and the others moved into Data.ByteString.Internal. The stable API going forward is all the modules exposed by the bytestring package except for the .Internal modules and the .Fusion module. |
module Data.ByteString.Base has been split into two. The "unsafe" functions moved to Data.ByteString.Unsafe and the others moved into Data.ByteString.Internal. The stable API going forward is all the modules exposed by the bytestring package except for the .Internal modules and the .Fusion module. |
||
− | The lazy |
+ | The lazy bytestring 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 bytestring into the <hask>Chunk</hask> constructor which reduces the number of indirections to get at the string data from two to one. |
Revision as of 12:05, 28 September 2007
A list of things that need updating when porting packages to newer library/cabal versions.
Updating to GHC 6.8 and Cabal 1.2
Cabal configuration support
Cabal API changes
Many packages that use non-default Setup.hs or Setup.lhs 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 Setup.hs.
A more detailed survey of the packages from the hackage collection is here: http://www.haskell.org/pipermail/libraries/2007-September/008265.html
base package split up
The base package was split up, and new dependencies are now required;
- array
- bytestring
- packedstring (deprecated)
- containers
- random
- pretty
- process
- directory
- old-time
- old-locale
(dependency graph of the core libraries)
These core packages are included with ghc-6.8. Updating your package just involves adding the necessary packages to the build-depends in your cabal file. However if you want to support both ghc-6.6 and ghc-6.8 you need to use the configurations feature in your .cabal file. For example:
flag splitBase description: Choose the new smaller, split-up base package.
library if flag(splitBase) build-depends: base >= 3, pretty, directory, old-time, process, containers else build-depends: base < 3
This is a simplified excerpt from Cabal's own Cabal.cabal file.
Data.ByteString api changes
module Data.ByteString.Base has been split into two. The "unsafe" functions moved to Data.ByteString.Unsafe and the others moved into Data.ByteString.Internal. The stable API going forward is all the modules exposed by the bytestring package except for the .Internal modules and the .Fusion module.
The lazy bytestring representation type has changed. Instead of a newtyped list:
newtype ByteString = LPS [Strict.ByteString]
it is now:
data ByteString = Empty | Chunk !Strict.ByteString ByteString
The crucial difference is that in the latter representation we can unpack the strict bytestring into the Chunk
constructor which reduces the number of indirections to get at the string data from two to one.