Используя междусобойчик с несколькими версиями с 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 на одной машине. например, как продолжить установку, обновления и т. д.

5 ответов


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


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


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


этот ответ служит для дополнения других ответов (это уже просветление).

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

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

/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 "$@"

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

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

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


теперь (cabal версии 1.24.0.0), можно

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

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

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

как я узнал? Эту команду можно найти через https://www.haskell.org/cabal/users-guide/installing-packages.html или cabal install --help.

post-condition выглядит так: я установил 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