В 99% случаев если вам требуется компилятор Haskell, то Haskell Platform решит все ваши проблемы. В платформу входит не только непосредственно стабильная версия компилятора GHC, но и такие утилиты, как cabal и haddock, а также некоторые часто используемые библиотеки. При этом с помощью cabal можно обновить, пожалуй, всю платформу, не считая разве что самого GHC. Но иногда хочется поиграться с версией GHC посвежее. Вот тому, как это сделать, и посвящена сия заметка.
Причин отказаться от стабильной и надежной версии GHC в пользу сырой и непроверенной может быть много. Кому-то просто хочется поиграться с новыми возможностями, кто-то желает проверить совместимость своих пакетов с грядущей версией компилятора, а кто-то, например, может надеяться увеличить производительность своего приложения, собрав его компилятором поновее. Есть и такие, кому просто нравится использовать все самое новое и собирать в связи с этим кучу граблей. Ну и, конечно же, не забудем самих разработчиков GHC, а также людей, решивших помочь с его бета-тестированием.
На момент написания этих строк стабильной версией GHC считается 7.6.3, а новой, уже почти готовой к релизу, но все еще допиливаемой — 7.8.1. Сначала мы попробуем установить бинарную сборку GHC 7.8.1, а затем рассмотрим сборку GHC из исходников. Я проделовал все написанное ниже под Ubuntu Linux, но подозреваю, что многое также будет справедливо в отношении других операционных систем и дистрибутивов Linux. Вся приведенная информация может сильно устареть к моменту, когда вы будете читать эти строки. Поэтому прежде, чем действовать, обязательно сверяйтесь с информацией в багтрекереах, файлами README, INSTALL и так далее.
Устновка последней бинарной сборки GHC
Бинарные сборки GHC для различных окружений доступны на официальном сайте языка. На момент написания этих строк самые свежие сборки были доступны по адресу:
Прежде, чем действовать, сносим платформу:
sudo apt-get autoremove
Затем — как-то так:
cd temp
wget https: // www.haskell.org / path / to / some / file.tar.bz2
tar -xvjf ghc-7.8.0.20140228-x86_64-unknown-linux-deb7.tar.bz2
cd ghc-7.8.0.20140228 /
. / configure —prefix = / home / eax / haskell
make install
В свой ~/.zshrc или ~/.bashrc дописываем:
… и в консоли говорим:
ghci
Если вдруг ghci ругается на то, что не может найти libgmp:
… просто даем ему libgmp:
В общем-то, это все. Самая свежая бинарная сборка GHC установлена!
Собираем Cabal
Очень грустно писать на Haskell без наличия под рукой cabal . Так давайте же самостоятельно соберем его из исходников! На багтрекере GHC есть замечание к GHC 7.8 , что cabal нужно брать из репозитория на GitHub, а не с haskell.org, иначе он не соберется. Я проверил, действительно не собирается 🙂 Ну ОК, с гитхаба, так с гитхаба:
cd cabal / Cabal
Сначала собираем и устанавливаем библиотеку Cabal :
. / Setup configure —user
. / Setup build
. / Setup install
Затем переходим к установке утилиты cabal , которая на самом деле cabal-install:
. / bootstrap.sh
Утилита cabal зависит от некоторых сторонних пакетов, например, network, text и parsec. Скрипт bootstrap.sh тянет и собирает эти зависимости, затем собирает сам cabal.
Снова правим ~/.zshrc:
… и говорим:
Пробуем что-нибудь установить:
cabal install simple-genetic-algorithm
Если все было сделано правильно, пакет должен успешно установиться, после чего в ghci появится возможность подгрузить модуль GA.Simple и поиграться с ним. Поздравляю, теперь вам доступно более 5000 пакетов с Hackage!
Сборка GHC из исходников
И все-таки, бинарная сборка — это, можно сказать, прошлый век, ведь в ней нет самых-самых последних коммитов! Есть только один способ получить самый свежак, собрать GHC самостоятельно.
Для этого нам понадобятся кое-какие дополнительные инструменты:
ncurses-dev g++ llvm
Также нам понадобятся свежие версии Alex и Happy :
cabal install alex happy
Клонируем git-репозиторий и делаем чекаут нужной ветки:
cd ghc
git checkout -b ghc- 7.8 origin / ghc- 7.8
Для удобства исходный код GHC разбит на несколько репозиториев. К сорсам прилагается скрипт sync-all. Это такой скрипт на Perl , который подтягивает зависимости GHC из других репозиториев. Что-то вроде самопального rebar из мира Erlang . Список зависимостей задается в файле packages, складываются зависимости в каталог libraries. Например, чтобы подтянуть все зависимости GHC 7.8, говорим:
Также с помощью sync-all разработчики GHC подтягивают новые патчи. Команда sync-all pull
тянет все новые патчи из оригинального репозитория в дерево репозиториев в локальном каталоге.
Переходим к сборке:
perl boot
. / configure —prefix = / home / eax / ghc- 7.8 -2014mmdd
make
# … it’s nap time! …
make install
Вновь лезем в ~/.zshrc, после всех ранее добавленных строчек пишем:
… чтобы путь к новому GHC оказался первым в списке $PATH. Потом говорим source ...
, ну вы уже поняли. Теперь у вас действительно самый свежак. Осталось разве что добавить задание в crontab, чтобы GHC автоматически пересобирался каждую ночь!
Заключение
Дополнительные материалы:
- Тут пишут , что есть энтузиасты, поддерживающие PPA со свежими сборками GHC. Я проверял, не такие уж эти сборки и свежие, но может вам и такие норм;
- Недавно была опубликована занятная статья с обзором новых возможностях Haddock . В частности, документацию наконец-то можно писать на родном японском, и вообще любом юникоде;
- А тут можно найти много интересных сведений о том, как правильно тестировать GHC, как включить в нем опциональные возможности и тд;
- На Reddit обсуждаются причины задержки релиза GHC 7.8.1;
Как видите, ничего сложного. Вопросы и дополнения, как это было испокон веков, горячо приветсвуются!
Дополнение: Релиз GHC 7.8.1 таки состоялся !