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

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 таки состоялся!

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.