haskell - Usando cabal con múltiples versiones de GHC
(5)
Tengo ambos ghc6 y ghc7 en mi escritorio. Para instalar nuevos paquetes (para la versión específica de ghc), uso cabal
con el indicador --with-compiler=<ghc-dir>
para especificar para qué ghc quiero instalar el paquete.
cabal update
antes de instalar cualquier nuevo paquete. ¿Pero cómo especifico para qué ghc quiero la actualización? Quiero decir, no hay --with-compiler
bandera --with-compiler
como con cabal install
. ghc-pkg7
que al igual que yo uso ghc-pkg7
para ghc7, habría cabal7
. Aparte del comando de cabal install
que conozco a qué versión de ghc se está aplicando, no sé qué ghc está afectado con los otros comandos de cabal.
Además, cuando hago la ghc-pkg check
, encuentro problemas con algunos paquetes y no sé cómo solucionarlos.
Realmente me gustaría saber, si alguien tiene, buenas prácticas al usar varias versiones de ghc en la misma máquina. Por ejemplo, cómo proceder con la instalación, actualizaciones, etc.
Ahora (versión cabal 1.24.0.0), uno puede
$ cabal install <package name> -w path-to-ghc-executable-1
$ cabal install <package name> -w path-to-ghc-executable-2
para instalar paquetes por separado para múltiples GHCs diferentes.
(La meta-variable path-to-ghc-executable-i
puede ser, como, /usr/bin/ghc-7.10.3
, /usr/local/bin/ghc-8.4.3
etc.)
¿Cómo lo supe? Este comando se puede encontrar a través de https://www.haskell.org/cabal/users-guide/installing-packages.html o cabal install --help
.
La condición posterior se ve así: instalé QuickCheck
para ghc-8.0.1
y ghc-6.12.1
, luego ~/.cabal/lib
ve así:
➜ 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
Esta respuesta sirve para complementar las otras respuestas (que ya son esclarecedoras).
En primer lugar, sepa que hay diferencias significativas entre las versiones menores de GHC. Por ejemplo, el cambio de GHC 7.8 a GHC 7.10 (véase la propuesta de quemar puentes ). Por lo tanto, podría ser mejor nombrar los binarios de GHC que también incluyen números de versión menores, como: ghc7.8
y ghc7.10
.
Suponiendo que tiene varios GHC instalados con los siguientes nombres:
/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)
Para GHC 7.8, puede crear un archivo llamado ~/.cabal-ghc-7.8/config
con los siguientes contenidos (que apuntan a las ubicaciones descritas anteriormente):
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
Puede crear un ejecutable posiblemente llamado cabal-ghc-7.8
en su PATH
(usa la opción --config-file
share ):
#!/bin/bash
exec cabal --config-file=$HOME/.cabal-ghc-7.8/config "$@"
Ahora, en su directorio de código fuente cabalizado, simplemente puede ejecutar cabal-ghc-7.8 build
para construir sus archivos de origen utilizando GHC 7.8. (o cabal-ghc-7.8 test
o cualquier otra cosa)
Puede repetir el proceso para todos los GHC que haya instalado. Por supuesto, no debe preocuparse por el estándar llamado GHC. Por defecto, Cabal busca un GHC llamado ghc
.
Esta respuesta asume un sistema UNIX / Linux (como el uso de bash
), pero puede adaptarse a otros sistemas con pequeños cambios.
Pensé que --with-ghc
es la opción apropiada. ghc
tener múltiples versiones de ghc
en mi máquina. Todos tienen nombres diferentes como ghc-6.12.3
o ghc-7.4.1
. Por lo general, se instalan con estos nombres y se elige un compilador predeterminado mediante la creación de enlaces simbólicos, por ejemplo, de ghc
a ghc-7.4.1
. Creo que no necesitas diferentes directorios de cabal para diferentes versiones de ghc
. Cabal crea un subdirectorio ghc-6.12.3
de lib/yourpkg
para archivos GHC-6.12.3
y así sucesivamente. Además, cabal update
no actualiza los paquetes instalados, solo recupera la lista de paquetes actual de sus servidores de paquetes favoritos. Este debería ser el mismo para todos los compiladores instalados.
Puede crear dos archivos de configuración, digamos ~/.cabal/config
y ~/.cabal/config7
, y usar la opción un (der) documentada --config-file
para seleccionar entre los dos.
cabal update
no tiene la opción --with-compiler
porque es completamente independiente del compilador, no involucra a GHC ni a ningún otro compilador. Simplemente descarga una lista de paquetes disponibles de Hackage, nada más. Puede esperar que algo similar se aplique a otros comandos que no le permiten elegir un compilador (ya que el equipo de desarrollo tuvo cuidado de evitar que el cabal sea específico de GHC, y mucho menos específico de una versión particular de GHC, donde sea que tenga sentido).