haskell ghc cabal

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).