Today I have unmasked ghc-7.6.1 in gentoo‘s haskell overlay. Quite a few of things is broken (like unbumped yet gtk2hs), but major things (like darcs) seem to work fine. Feel free to drop a line on #gentoo-haskell to get the thing fixed.
Some notes and events in the overlay:
- ghc-7.6.1 is available for all major arches we try to support
- a few ebuilds of overlay were converted to EAPI=5 to use subslot depends (see below)
- we’ve got working ghc-9999 ebuild with shared libraries by default! (see below)
ghc-7.6
That beast brought two major problems to it’s users:
- Prelude.catch gone away and is called ‘System.IO.Error.catchIOError’ now
- directory package broke interface to existing function ‘getModificationTime’ without old compatible variant.
While the first breakage is easy to fix by something like:
#if MIN_VERSION_base(4,6,0)
catch :: IO a -> (IOError -> IO a) -> IO a
catch = System.IO.Error.catchIOError
(or just switch to extensible-exceptions package if you need support for really old ghc versions).
The second one is literally a disaster
-getModificationTime :: FilePath -> IO ClockTime
+getModificationTime :: FilePath -> IO UTCTime
It is not as straightforward and "fixes" in various packages break PVP in a very funny way.
Look at this example.
Now that package has random signature type depending on which directory version it decided to build against.
TODO: find a nice and simple ‘:: ClockTime -> IO UTCTime’ compatibility function to end that keep creeping mess. (I wish the directory package to provide that).
Okay. Enough ranting.
EAPI=5
Some of experienced gentoo haskell users already know about the magic haskell-updater tool written by Ivan to fix the mess after ghc upgrade or some base library upgrade.
Typical symptom of broken libraries is the similar ghc-pkg check
result:
There are problems in package data-accessor-monads-fd-0.2.0.3:
dependency "monads-fd-0.1.0.4-830f79a91000e99707aac145b972f786" doesn't exist
There are problems in package LibZip-0.10.2:
dependency "mtl-2.0.1.0-b1b6de8085e5ea10cc0eb01054b69110" doesn't exist
There are problems in package jail-0.0.1.1:
dependency "monads-fd-0.1.0.4-830f79a91000e99707aac145b972f786" doesn't exist
Why it happens?
Well, ghc’s library ABI depends on ABIs on all the libraries it uses. It has quite nasty consequences.
Once you upgrade a library you need to:
- rebuld all the reverse dependencies
- and their reverse dependencies (recursive)
The first point can be solved by EAPI 5 so called SUBSLOT feature.
The second one is not solved yet, but i was said is planned for EAPI=6. Thus you will still need to use haskell-updater time to time.
Anyway, I’ve bumped binary package today and to show how portage picks all it’s immediate users:
# emerge -av1 dev-haskell/binary
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild r U ~] dev-haskell/binary-0.6.4.0:0/0.6.4.0::gentoo-haskell [0.6.2.0:0/0.6.2.0::gentoo-haskell] USE="doc hscolour {test} -hoogle -profile" 0 kB
[ebuild r U ~] dev-haskell/sha-1.6.1:0/1.6.1::gentoo-haskell [1.6.0:0/1.6.0::gentoo-haskell] USE="doc hscolour -hoogle -profile" 2,651 kB
[ebuild r U ~] dev-haskell/zip-archive-0.1.2.1-r2:0/0.1.2.1::gentoo-haskell [0.1.2.1-r1:0/0.1.2.1::gentoo-haskell] USE="doc hscolour {test} -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/data-binary-ieee754-0.4.3:0/0.4.3::gentoo-haskell USE="doc hscolour -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/dyre-0.8.11:0/0.8.11::gentoo-haskell USE="doc hscolour -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/hxt-9.3.1.1:0/9.3.1.1::gentoo-haskell USE="doc hscolour -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/hashed-storage-0.5.10:0/0.5.10::gentoo-haskell USE="doc hscolour {test} -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/dbus-core-0.9.3-r1:0/0.9.3::gentoo-haskell USE="doc hscolour -hoogle -profile" 0 kB
[ebuild rR ~] dev-haskell/hoogle-4.2.14:0/4.2.14::gentoo-haskell USE="doc fetchdb hscolour -fetchdb-ghc -hoogle -localdb -profile" 0 kB
[ebuild rR ~] www-apps/gitit-0.10.0.2-r1:0/0.10.0.2::gentoo-haskell USE="doc hscolour plugins -hoogle -profile" 0 kB
[ebuild r U ~] dev-haskell/yesod-auth-1.1.1.7:0/1.1.1.7::gentoo-haskell [1.1.1.6:0/1.1.1.6::gentoo-haskell] USE="doc hscolour -hoogle -profile" 17 kB
[ebuild rR ~] dev-haskell/yesod-1.1.4:0/1.1.4::gentoo-haskell USE="doc hscolour -hoogle -profile" 0 kB
Total: 12 packages (4 upgrades, 8 reinstalls), Size of downloads: 2,668 kB
Would you like to merge these packages? [Yes/No]
I would like to rebuild all the sha (and so on) revdeps as well, but EAPI can’t express that kind of depends yet.
The EAPI=5 ebuild slowly drift to main portage tree as well.
ghc-9999
The most iteresting thing!
With great Mark’s help we now have live ghc ebuild right out of gti tree!
One of the most notable things is the dynamic linking by default.
# ldd `which happy` # ghc-7.7.20121116
linux-vdso.so.1 (0x00007fffb0bff000)
libHScontainers-0.5.0.0-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/containers-0.5.0.0/libHScontainers-0.5.0.0-ghc7.7.20121116.so (0x00007fe616972000)
libHSarray-0.4.0.1-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/array-0.4.0.1/libHSarray-0.4.0.1-ghc7.7.20121116.so (0x00007fe6166d0000)
libHSbase-4.6.0.0-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/base-4.6.0.0/libHSbase-4.6.0.0-ghc7.7.20121116.so (0x00007fe615df9000)
libHSinteger-gmp-0.5.0.0-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/integer-gmp-0.5.0.0/libHSinteger-gmp-0.5.0.0-ghc7.7.20121116.so (0x00007fe615be6000)
libHSghc-prim-0.3.0.0-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/ghc-prim-0.3.0.0/libHSghc-prim-0.3.0.0-ghc7.7.20121116.so (0x00007fe615976000)
libHSrts-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/rts-1.0/libHSrts-ghc7.7.20121116.so (0x00007fe615715000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe61536c000)
libHSdeepseq-1.3.0.1-ghc7.7.20121116.so => /usr/lib64/ghc-7.7.20121116/containers-0.5.0.0/../deepseq-1.3.0.1/libHSdeepseq-1.3.0.1-ghc7.7.20121116.so (0x00007fe615162000)
libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007fe614ef4000)
libffi.so.6 => /usr/lib64/libffi.so.6 (0x00007fe614cec000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe6149f2000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe6147ea000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe6145e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe616d41000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe6143ca000)
$ ls -lh `which pandoc` # ghc-7.7.20121116
-rwxr-xr-x 1 root root 6.3M Nov 16 16:38 /usr/bin/pandoc
$ ls -lh `which pandoc` # ghc-7.4.2
-rwxr-xr-x 1 root root 27M Nov 18 17:46 /usr/bin/pandoc
Actually, the whole ghc-9999 installation is 150MB smaller, than ghc-7.4.1 on amd64.
Quite a win!
And as a side effect revdep-rebuild (or portage’s FEATURES=preserved-rebuild) can note (and fix) introduced breakages due to upgrades!
Work on the ghc cross-compilation in the ebuild slowly continues (needs some upstream fixes to support toolchains inferred from build/host/target triplets).
Have fun!
5 comments
Comments feed for this article
24 November, 2012 at 10:31 PM
Ganesh Sittampalam
How did you get darcs working?
25 November, 2012 at 7:20 AM
Sergei Trofimovich
For base-4.6 we have switched to custom catch function:
https://github.com/gentoo-haskell/gentoo-haskell/commit/f663de941e89ad3ef5935ecda336497ed1cab808
It’s the largest ans I hope does not break anything (thus can be merged to upstream in some form).
For haskeline-0.7 (shoud be irrelevant to ghc-7.6)
we’ve cheated a bit and assumed user’s locale is UTF-8:
https://github.com/gentoo-haskell/gentoo-haskell/commit/dbd502761c407d99849a2b45dc1d4da44be1cde4
For tar-0.4 the fix is the following:
https://github.com/gentoo-haskell/gentoo-haskell/blob/master/dev-vcs/darcs/files/darcs-2.8.1-tar-0.4.patch
26 November, 2012 at 12:09 AM
Ganesh Sittampalam
Ah, ok, thanks for the details. I’m still in search of a slightly safer fix to the haskeline problem š I’ve fixed the catch problem in HEAD but I guess it’s worth fixing 2.8 as well since I’m not yet sure when 2.10 will happen.
27 November, 2012 at 1:37 AM
Dag Odenhall (@donri)
I have released a package to deal with directory-1.2:
http://hackage.haskell.org/package/time-compat
27 November, 2012 at 6:35 AM
Sergei Trofimovich
Whow! It looks great! I’ll try to port uhc to ghc-7.6 today
with help of your package.
Thank you!