В 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 для различных окружений доступны на официальном сайте языка. На момент написания этих строк самые свежие сборки были доступны по адресу:

https://www.haskell.org/ghc/dist/7.8.1-rc2/

Прежде, чем действовать, сносим платформу:

sudo apt-get remove haskell-platform
sudo apt-get autoremove

Затем — как-то так:

mkdir ~ / haskell
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 дописываем:

export PATH = / home / eax / haskell / bin: $PATH

… и в консоли говорим:

source ~ / .zshrc
ghci

Если вдруг ghci ругается на то, что не может найти libgmp:

Loading package integer-gmp … <command line>: can’t load .so/.DLL for: libgmp.so (libgmp.so: cannot open shared object file: No such file or directory)

… просто даем ему libgmp:

sudo apt-get install libgmp-dev

В общем-то, это все. Самая свежая бинарная сборка GHC установлена!

Собираем Cabal

Очень грустно писать на Haskell без наличия под рукой cabal . Так давайте же самостоятельно соберем его из исходников! На багтрекере GHC есть замечание к GHC 7.8 , что cabal нужно брать из репозитория на GitHub, а не с haskell.org, иначе он не соберется. Я проверил, действительно не собирается 🙂 Ну ОК, с гитхаба, так с гитхаба:

git clone https: // github.com / haskell / cabal.git
cd cabal / Cabal

Сначала собираем и устанавливаем библиотеку Cabal :

ghc -threaded —make Setup
. / Setup configure —user
. / Setup build
. / Setup install

Затем переходим к установке утилиты cabal , которая на самом деле cabal-install:

cd .. / cabal-install
. / bootstrap.sh

Утилита cabal зависит от некоторых сторонних пакетов, например, network, text и parsec. Скрипт bootstrap.sh тянет и собирает эти зависимости, затем собирает сам cabal.

Снова правим ~/.zshrc:

export PATH = / home / eax / .cabal / bin: $PATH

… и говорим:

source ~ / .zshrc

Пробуем что-нибудь установить:

cabal update
cabal install simple-genetic-algorithm

Если все было сделано правильно, пакет должен успешно установиться, после чего в ghci появится возможность подгрузить модуль GA.Simple и поиграться с ним. Поздравляю, теперь вам доступно более 5000 пакетов с Hackage!

Сборка GHC из исходников

И все-таки, бинарная сборка — это, можно сказать, прошлый век, ведь в ней нет самых-самых последних коммитов! Есть только один способ получить самый свежак, собрать GHC самостоятельно.

Для этого нам понадобятся кое-какие дополнительные инструменты:

sudo apt-get install autoconf automake libtool make
ncurses-dev g++ llvm

Также нам понадобятся свежие версии Alex и Happy :

cabal update
cabal install alex happy

Клонируем git-репозиторий и делаем чекаут нужной ветки:

git clone http: // git.haskell.org / ghc.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 get -b ghc- 7.8

Также с помощью sync-all разработчики GHC подтягивают новые патчи. Команда sync-all pull тянет все новые патчи из оригинального репозитория в дерево репозиториев в локальном каталоге.

Переходим к сборке:

mkdir ~ / ghc- 7.8 -2014mmdd
perl boot
. / configure —prefix = / home / eax / ghc- 7.8 -2014mmdd
make

# … it’s nap time! …

make install

Вновь лезем в ~/.zshrc, после всех ранее добавленных строчек пишем:

export PATH = / home / eax / ghc- 7.8 -2014mmdd / bin: $PATH

… чтобы путь к новому GHC оказался первым в списке $PATH. Потом говорим source ... , ну вы уже поняли. Теперь у вас действительно самый свежак. Осталось разве что добавить задание в crontab, чтобы GHC автоматически пересобирался каждую ночь!

Заключение

Дополнительные материалы:

  • Тут пишут , что есть энтузиасты, поддерживающие PPA со свежими сборками GHC. Я проверял, не такие уж эти сборки и свежие, но может вам и такие норм;
  • Недавно была опубликована занятная статья с обзором новых возможностях Haddock . В частности, документацию наконец-то можно писать на родном японском, и вообще любом юникоде;
  • А тут можно найти много интересных сведений о том, как правильно тестировать GHC, как включить в нем опциональные возможности и тд;
  • На Reddit обсуждаются причины задержки релиза GHC 7.8.1;

Как видите, ничего сложного. Вопросы и дополнения, как это было испокон веков, горячо приветсвуются!

Дополнение: Релиз GHC 7.8.1 таки состоялся !

EnglishRussianUkrainian