Устанавливаем самую свежую версию компилятора Haskell
7 апреля 2014
В 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 таки состоялся!
Метки: Haskell, Функциональное программирование.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.