Использование cabal с несколькими версиями GHC

У меня на рабочем столе есть ghc6 и ghc7. Чтобы установить новые пакеты (для конкретной версии ghc), я использую cabal с флагом --with-compiler=<ghc-dir>, чтобы указать, для какого ghc я хочу установить пакет.

Я делаю cabal update перед установкой любого нового пакета. Но как мне указать, для какого ghc я хочу обновление? Я имею в виду, что флаг --with-compiler отсутствует как cabal install. Я бы подумал, что, как я использую ghc-pkg7 для ghc7, будет cabal7. Помимо команды cabal install, которую я знаю, к какой ghc-версии она применяется, я не знаю, какой ghc влияет на другие команды cabal.

Кроме того, когда я делаю ghc-pkg check, я обнаруживаю проблемы с некоторыми пакетами, и я не знаю, как это исправить.

Мне бы очень хотелось знать - если у кого-то есть - хорошие практики при использовании нескольких версий ghc на одном компьютере. например как продолжить установку, обновления и т.д.

Ответ 1

Вы можете создать два файла конфигурации, например ~/.cabal/config и ~/.cabal/config7, и использовать параметр un (der), зарегистрированный --config-file, чтобы выбрать между ними.

Ответ 2

Я думал, что --with-ghc является подходящим вариантом. Я использую несколько версий ghc на моей машине. Все они имеют разные имена, такие как ghc-6.12.3 или ghc-7.4.1. Обычно они устанавливаются с этими именами, а компилятор по умолчанию выбирается путем создания символических ссылок от, скажем, от ghc до ghc-7.4.1. Я думаю, вам не нужны разные каталоги для разных версий ghc. Cabal создает подкаталог ghc-6.12.3 для lib/yourpkg для ghc-6.12.3 файлов и т.д. Кроме того, cabal update не обновляет установленные пакеты, он извлекает только текущий список пакетов с ваших любимых серверов пакетов. Это должно быть одинаковым для всех установленных компиляторов.

Ответ 3

cabal update не имеет опции --with-compiler, потому что он полностью компилятор-агностик - он вообще не связан с GHC или каким-либо другим компилятором. Он просто загружает список доступных пакетов из Hackage, не более того. Вы можете ожидать, что что-то подобное применимо к другим командам, которые не позволяют вам выбирать компилятор (так как команда разработчиков старалась избегать создания специфичных для конкретной GHC-функций, особенно для конкретной версии GHC, везде, где это имеет смысл).

Ответ 4

Этот ответ служит дополнением к другим ответам (которые уже просвещают).

Прежде всего, знайте что существуют значительные различия между второстепенными версиями GHC. Например, изменение от GHC 7.8 до GHC 7.10 (см. предложение об открытии мостов). Таким образом, это может быть лучше назвать ваши двойные файлы GHC также включая номера младших версий, например: ghc7.8 и ghc7.10.

Предположим, что у вас установлено несколько GHC со следующими именами:

/usr/bin/ghc
/usr/bin/ghc-pkg
/usr/bin/haddock
...
/usr/bin/ghc-7.8
/usr/bin/ghc-pkg-7.8
/usr/bin/haddock-ghc-7.8
...
/usr/bin/ghc-7.6
/usr/bin/ghc-pkg-7.6
/usr/bin/haddock-ghc-7.6
...
(and so on)

Для GHC 7.8, вы можете создать файл с именем ~/.cabal-ghc-7.8/config со следующим содержанием (это указывает на места, описанные выше):

remote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive
remote-repo-cache: /home/<USER>/.cabal-ghc-7.8/packages
world-file:        /home/<USER>/.cabal-ghc-7.8/world
compiler: ghc
extra-prog-path:   /home/<USER>/.cabal-ghc-7.8/bin
build-summary:     /home/<USER>/.cabal-ghc-7.8/logs/build.log
remote-build-reporting: anonymous
jobs: $ncpus

install-dirs user
  prefix:          /home/<USER>/.cabal-ghc-7.8

program-locations
  ghc-location:     /usr/bin/ghc-7.8
  ghc-pkg-location: /usr/bin/ghc-pkg-7.8
  haddock-location: /usr/bin/haddock-ghc-7.8
  hpc-location:     /usr/bin/hpc-ghc-7.8
  hsc2hs-location:  /usr/bin/hsc2hs-ghc-7.8

Вы можете создать исполняемый файл возможно, называется cabal-ghc-7.8 в вашем PATH (он использует опцию --config-file описанную в ответе n.m.):

#!/bin/bash
exec cabal --config-file=$HOME/.cabal-ghc-7.8/config "[email protected]"

Теперь, в вашем каскадном источнике, вы можете просто запустить cabal-ghc-7.8 build для создания исходных файлов с использованием GHC 7.8. (или cabal-ghc-7.8 test или что-либо еще)

Вы можете повторить процесс для всех установленных вами GHC. Конечно, вы не должны беспокоиться о стандарте GHC. По умолчанию Cabal ищет GHC с именем ghc.

Этот ответ предполагает систему UNIX/Linux (например, использование bash), но может быть адаптирован к другим системам с небольшими изменениями.

Ответ 5

Теперь (версия для каббата 1.24.0.0), можно

$ cabal install <package name> -w path-to-ghc-executable-1 
$ cabal install <package name> -w path-to-ghc-executable-2

для установки пакетов отдельно для нескольких разных GHC.

(Мета-переменная path-to-ghc-executable-i может быть, например, /usr/bin/ghc-7.10.3, /usr/local/bin/ghc-8.4.3 и т.д.)

Откуда я знаю? Эта команда может быть найдена с помощью https://www.haskell.org/cabal/users-guide/installing-packages.html или cabal install --help.

QuickCheck выглядит следующим образом: я установил QuickCheck для ghc-8.0.1 и ghc-6.12.1, затем ~/.cabal/lib выглядит так:

➜  lib pwd      
/home/lee/.cabal/lib
➜  lib tree -L 2
.
├── x86_64-linux-ghc-6.12.1
│   └── QuickCheck-2.8.2-GeOZQRSfeF7EtuZhBovRUq
└── x86_64-linux-ghc-8.0.1
    └── QuickCheck-2.9.2-AzbjWrJo3WFD60ZxKurQ3s