1

Поэтому я хочу обновить «GHC 7.8.4-45», который поставляется в комплекте с Fedora 22 (любезно предоставлено Fedora Haskell SIG), до GHC 7.10.2 (последняя версия).

Как это сделать легко?

1 ответ1

1

Документы и ссылки

Начальный источник информации находится на haskell.org

Можно установить с помощью:

Более того:

Так...

Мы соберем Glasgow Haskell Compiler ghc используя установщик Haskell-Platform .

Исправить некоторые библиотеки

Нам придется использовать предварительно скомпилированный, последний пакетный инструмент Cabal вместо системы Cabal . К сожалению, это только 32-битная версия.

Вы можете удалить существующую Cabal (позже мы установим PATH для новой Cabal , так что в этом нет особой необходимости)

# as root
dnf erase cabal-install cabal-install-static ghc-Cabal-devel

В 64-битной системе нам нужны 32-битные версии библиотек для новой Cabal:

# as root
dnf install glibc.i686 zlib.i686 gmp-devel.i686 gmp.i686

Для компиляции ghc нам нужен 64-битный gmp-devel:

# as root
dnf install gmp-devel.x86_64

Убедитесь, что 32-разрядная и 64-разрядная версии установлены с помощью:

rpm --query gmp-devel
> gmp-devel-6.0.0-9.fc22.i686
> gmp-devel-6.0.0-9.fc22.x86_64

Предварительно скомпилированный ghc для CentOS, который мы скачаем позже, в какой-то момент будет искать libgmp.3 , поэтому нам нужна символическая ссылка:

# as root
cd /usr/lib64
ln -s libgmp.so.10.2.0 libgmp.so.3

Установить дополнительные пакеты

Будут жалобы на отсутствие Z-библиотек и 3D-библиотек. Так:

# as root
dnf install zlib-devel
dnf install freeglut freeglut-devel

И возможно:

# as root
dnf install ncurses-devel libffi-devel

"libffi" (интерфейс сторонней функции) кажется интересным.

В любом случае, вам нужно make (GNU make):

# as root
dnf install make

Добавьте специального пользователя, который будет запускать процесс сборки

Мы будем строить как пользовательский builder , а не как root:

# as root
useradd builder

Добавьте старый ghc который поставляется как пакет Fedora 22

Нам нужен ghc который поставляется с Fedora 22 для запуска компиляции. Согласно Platform README, ghc должен быть> 7.4 (у Fedora ghc 7.8.4).

# as root
dnf install ghc

Это включает в себя 55 пакетов, включая libffi-devel если его еще не было.

Вам также необходимо:

# as root
dnf install ghc-split

Или вы получите ошибку:

> cabal: At least the following dependencies are missing:
> hastache >=0.6.0, shake >=0.14, split -any, text -any

Добавить новый скомпилированный Cabal

Как уже упоминалось. Вы должны установить предварительно скомпилированный Cabal чтобы заменить более старый, который поставляется с Fedora 22.

Действительно, использование Cabal 1.18.1.0, поставляемого с Fedora, в конечном итоге приведет к ошибке:

> ghc: ghc no longer supports single-file style package databases
> (dist/package.conf.inplace) use 'ghc-pkg init' to create the
> database with the correct format.

Стать builder пользователя:

su - builder

Загрузите новый Cabal со страницы загрузки Cabal , но, как уже было сказано выше, в настоящее время он поставляется только в 32-разрядной версии .

# as builder
cd
wget https://www.haskell.org/cabal/release/cabal-install-1.22.0.0/cabal-1.22.0.0-i386-unknown-linux.tar.gz
# 3.84 MiB; just contains the "cabal" binary
tar xzf cabal-1.22.0.0-i386-unknown-linux.tar.gz 
mkdir cabalbin
mv cabal cabalbin/

Добавить недавний предварительно скомпилированный ghc

Для компиляции нам нужен предварительно упакованный "bindist" (предварительно скомпилированный ghc), который передается в качестве аргумента Platform Haskell.

Самый последний из них можно найти здесь - возьмите "CentOS".

# as builder
cd
wget http://downloads.haskell.org/~ghc/7.10.2/ghc-7.10.2-x86_64-unknown-linux-centos66.tar.bz2

Нет необходимости распаковывать или распаковывать тарболл 131,82 МиБ.

Platform настройки

Проверка README:

Если вы создаете систему, подобную Posix (Linux или BSD), вы можете добавить параметр командной строки --prefix, чтобы указать, где в целевой системе будет размещено дерево встроенных объектов. По умолчанию это "/usr/local/haskell". Сборка будет включать в себя другой каталог с именем "ghc-xyz-arch", и все будет установлено там.

... так что мы ничего не настраиваем, потому что /usr/local/haskell звучит так, как мы хотим.

А также:

Добавление -j [n] к вызову сборки позволит собрать сразу несколько ядер.

Он попробовал это, но это не похоже на работу ...

Получить Platform

Platform клонирования из github в каталог ".sav". Это необходимо, потому что компиляция может закончиться неудачей, и в этом случае вы просто хотите выбросить то, что было сделано, и начать все сначала:

# as builder
cd
git clone https://github.com/haskell/haskell-platform
mv haskell-platform haskell-platform.sav

Исправьте путь пользователя builder ! В какой-то момент, последний, скомпилированный ghc должен использоваться вместо того, который поставляется с системой!

Как пользовательский builder , отредактируйте ваш ~/.bash_profile и добавьте:

PATH=$HOME/cabalbin/:$HOME/haskell-platform/build/ghc-bindist/local/bin/:$PATH:$HOME/.local/bin:$HOME/bin

Как было установлено ранее, $HOME/cabalbin содержит новый Cabal и через некоторое время $HOME/haskell-platform/build/ghc-bindist/local/bin/ будет содержать последнюю ghc .

Выйти / Войти, чтобы использовать новый путь.

строить

Теперь начните строить используя

# as builder
cd
/bin/rm -rf haskell-platform 
cp -a haskell-platform.sav haskell-platform 
cd haskell-platform
./platform.sh ../ghc-7.10.2-x86_64-unknown-linux-centos66.tar.bz2

Эта сборка действительно должна быть успешной, но на медленной машине она может занять около 20 минут. Тогда вы видите:

> To install this build:
> 1) copy build/product/haskell-platform-7.10.2-a-unknown-posix-x86_64.tar.gz to the target machine
> 2) untar it (creates files in the working directory)
> 3) as root, run the script ./install-haskell-platform.sh
> Build completed in 22:54m
> # tar (for build/product/hp-usr-local.tar.gz)
> # cp (for build/product/haskell-platform-7.10.2-a-unknown-posix-x86_64.tar.gz)
> # tar (for build/product/haskell-platform-7.10.2-a-unknown-posix-x86_64.tar.gz)

устанавливать

Действуйте как описано выше

# as root
cp ~builder/haskell-platform/build/product/haskell-platform-7.10.2-a-unknown-posix-x86_64.tar.gz ~
cd
tar xzf haskell-platform-7.10.2-a-unknown-posix-x86_64.tar.gz
./install-haskell-platform.sh

Ты видишь:

> Unpacking ./hp-usr-local.tar.gz to /...
> Running /usr/local/haskell/ghc-7.10.2-x86_64/bin/activate-hs ...
> 
> Haskell set to:
> GHC         /usr/local/haskell/ghc-7.10.2-x86_64
> Haddocks    file:///usr/local/haskell/ghc-7.10.2-x86_64/doc/frames.html
> Other doc   file:///usr/local/haskell/ghc-7.10.2-x86_64/share/doc/ghc/html/index.html
> 
> Symlinks for command line tools (ghc, cabal, etc..) added to:
> /usr/local/bin

Симлинки будут установлены в /usr/local/bin/:

> activate-hs -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/activate-hs
> alex -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/alex
> cabal -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/cabal
> ghc -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghc
> ghc-7.10.2 -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghc-7.10.2
> ghci -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghci
> ghci-7.10.2 -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghci-7.10.2
> ghc-pkg -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghc-pkg
> ghc-pkg-7.10.2 -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/ghc-pkg-7.10.2
> haddock -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/haddock
> haddock-ghc-7.10.2 -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/haddock-ghc-7.10.2
> happy -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/happy
> hp2ps -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/hp2ps
> hpc -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/hpc
> hsc2hs -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/hsc2hs
> HsColour -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/HsColour
> runghc -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/runghc
> runghc-7.10.2 -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/runghc-7.10.2
> runhaskell -> /usr/local/haskell/ghc-7.10.2-x86_64/bin/runhaskell

В принципе, мы можем избавиться от существующих пакетов ghc (приведенная ниже команда работает, только если вы передадите -y в dnf erase)

rpm --query --all | grep -e '^ghc-' | xargs dnf erase

Run Test Suite

Хорошая идея запустить тестовый набор.

На самом деле, я сейчас сталкиваюсь с некоторыми ошибками ...

Они пойдут в дом GHC Trac

Смотрите " запуск тестов " на haskell.org для общих инструкций.

Чтобы запустить тесты, нужно установить источник набора тестов с этой страницы "поверх" дерева исходных текстов, созданного при сборке:

# as builder
cd
# the '..' below is not a typo!
cd ./haskell-platform/build/ghc-bindist/ghc-7.10.2/..
wget http://downloads.haskell.org/~ghc/7.10.2/ghc-7.10.2-testsuite.tar.bz2
bunzip2 ghc-7.10.2-testsuite.tar.bz2
tar xf ghc-7.10.2-testsuite.tar

Вы можете установить дополнительные пакеты cabal для запуска определенных тестов. Некоторые, возможно, уже были установлены. Бежать:

# as builder
## To install hmatrix you will probably have to perform, as root:
## dnf install blas-devel lapack-devel
# Linear systems, matrix decompositions, and other numerical computations
cabal install hmatrix 
# Monad classes using functional dependencies
cabal install mtl
# This package provides a library for parallel programming.
cabal install parallel
# Parsec is designed as an industrial-strength parser library.
cabal install parsec 
# various primitive memory-related operations
cabal install primitive
# library for random testing of program properties.
cabal install QuickCheck
# provides a basic random number generation library
cabal install random
# one module layer over regex-posix to replace Text.Regex
cabal install regex-compat  
# the generics system described in the "Scrap Your Boilerplate" papers
cabal install syb
# A UTF8 layer for Strings
cabal install utf8-string 
# An efficient implementation of Int-indexed arrays
cabal install vector 

Запустите cabal info $PACKAGE чтобы получить информацию о пакете. Конфигурация пакета находится в ~/.ghc/x86_64-linux-7.10.2/package.conf.d/ , содержимое пакета - в ~/.cabal/lib/x86_64-linux-ghc-7.10.2/$PACKAGE .

Тогда начните тесты. Мы запишем вывод в ~/test_output.txt:

# as builder
cd
cd ./haskell-platform/build/ghc-bindist/ghc-7.10.2
make test 2>&1 | tee ~/test_output.txt

Через некоторое время вы получите вывод:

> Unexpected results from:
> TEST="T9203 T9961 parsing001 T9675 T6048"
> 
> OVERALL SUMMARY for test run started at Mon Oct 26 17:52:52 2015 CET
>  0:33:17 spent to go through
>     4142 total tests, which gave rise to
>    15728 test cases, of which
>    11883 were skipped
> 
>       45 had missing libraries
>     3754 expected passes
>       41 expected failures
> 
>        0 caused framework failures
>        0 unexpected passes
>        0 unexpected failures
>        5 unexpected stat failures
> 
> Unexpected stat failures:
>    perf/compiler    T6048 [stat not good enough] (optasm)
>    perf/compiler    T9675 [stat not good enough] (optasm)
>    perf/compiler    T9961 [stat not good enough] (normal)
>    perf/compiler    parsing001 [stat too good] (normal)
>    perf/should_run  T9203 [stat too good] (normal)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .