Использование Cabal с несколькими версиями GHC - PullRequest
16 голосов
/ 14 октября 2011

У меня на рабочем столе есть и 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 ]

10 голосов
/ 18 октября 2011

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

8 голосов
/ 25 мая 2012

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

5 голосов
/ 16 декабря 2015

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

Прежде всего, знать что есть существенные различия между второстепенными версиями 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 "$@"

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

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

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

5 голосов
/ 07 апреля 2015

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

1 голос
/ 10 января 2017

Теперь (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

установить пакеты отдельно для нескольких различных 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 для 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
...