Компиляция компилятора Glasgow Haskell на Fedora 22

3024
David Tonhofer

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

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

1
Fedora 24 все еще работает на GHC 7.8.4 ... [точнее] (https://fedoraproject.org/wiki/Haskell_Platform): _ "F24 собирается поставлять с haskell-platform-2014.2 (ghc-7.8.4) .... F25 планируется поставлять с haskell-platform-7.10.3 (ghc-7.10.3) "_ David Tonhofer 7 лет назад 0
Преимущественно, можно получить более новые версии через [страницу SIG Fedora Haskell] (https://fedoraproject.org/wiki/Haskell_SIG). Внизу перечислено то, что называется «Haskell coprs» («copr», похоже, является системой непрерывной сборки, тогда?). Существует [copr для 7.10.3] (https://copr.fedorainfracloud.org/coprs/petersen/ghc-7.10.3/), созданный "[petersen] (https://copr.fedorainfracloud.org/coprs / Petersen /)». Репозиторий copr включается с помощью `dnf copr enable petersen / ghc-7.10.3`, но как мне установить эту обновленную версию? David Tonhofer 7 лет назад 0
Вот как: 1) Включить "` dnf copr enable petersen / ghc-7.10.3` 2) Рекурсивно удалить все пакеты, извлеченные для пакета fedora `haskell-platform`, используя` dnf` (вместо `rpm`, что не не предоставьте эту опцию): "` dnf erase haskell-platform` "3) Повторно добавьте пакеты, которые могут пригодиться позже:" `dnf install ncurses-c ++ - libs freeglut-devel`" и т. д. 4) Просто запустите " `dnf install ghc`". `dnf` извлечет последнюю версию ghc из репозитория` petersen-ghc-7.10.3` и извлечет любые зависимости из репозитория fedora (так как эта опция включена), в моем случае `ncurses-devel и т. д. 5) Выиграй! David Tonhofer 7 лет назад 0
[Fedora 25 поставляется с GHC 7.10.3] (https://docs.fedoraproject.org/en-US/Fedora/25/html/Release_Notes/sect-Release_Notes-Changes_for_Developers.html) James Brock 7 лет назад 0

1 ответ на вопрос

1
David Tonhofer

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

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

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

Более того:

Так...

Мы создадим компилятор Glasgow Haskell 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 ghc7,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.

Действительно, использование Cabal1.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от Кабал загрузки страницы, но, как было сказано выше него в настоящее время поставляется только в 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

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

Самый последний из них можно найти здесь - возьмите "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) 
Принимая мой собственный ответ здесь. Этот вопрос наверняка встречает равнодушие ... David Tonhofer 8 лет назад 0