paquetes - ¿Cómo instalo las dependencias al compilar código Haskell?
yaourt (1)
Para comprender este error, debe saber cómo funciona la cabal install
internamente. En esencia, realizará los siguientes pasos:
- Descargue y descomprima el código fuente
- Compile
Setup.hs
(este archivo se usa para la personalización del sistema de compilación, por ejemplo, puede implementar algunos enganches para ejecutar código haskell adicional en la fase deconfigure
). - Ejecute la
setup configure <configure flags> && setup build && setup install
El problema ahora es que la cabal install
usa el GHC dado por --with-ghc
también para el paso 2, ¡pero el ejecutable producido por ese paso debe ejecutarse en el sistema host!
Una solución es hacer los pasos manualmente, lo que significa que tiene control total. Primero, obtenga la fuente:
$ cabal get random
Downloading random-1.0.1.3...
Unpacking to random-1.0.1.3/
$ cd random-1.0.1.3
A continuación, compile Setup.hs
, utilizando el host ghc:
$ ghc ./Setup.hs -o setup
Y finalmente, configure, construya e instale. Como lo sugiere @Yuras en un comentario, también agregamos la opción -x
para ejecutar hsc2hs
:
$ ./setup configure ----with-ghc=arm-unknown-linux-gnueabi-ghc --with-ghc-pkg=arm-unknown-linux-gnueabi-ghc-pkg --with-ld=arm-unknown-linux-gnueabi-ld --hsc2hs-options=-x
$ ./setup build && ./setup install
Ya hay un problema cabal sobre esto: https://github.com/haskell/cabal/issues/2085
He creado con éxito un compilador ghc cross, que me permite compilar el código haskell para armv6h (raspberry pi en mi caso) de mi máquina x64 linux. He ejecutado con éxito un programa hello world en la frambuesa.
No, quiero construir mi aplicación real, que tiene muchas dependencias con otros módulos de Haskell. Cuando compilo para x64 simplemente lo hago
cabal install dependenciy1 depenency2 ...
Sé que podría convertir mi propio programa en un proyecto cabal y automatizar este paso. Pero ese no es el punto aquí.
Cuando intento usar el compilador cruzado
arm-unknown-linux-gnueabi-ghc --make myapp.hs
Me dice acerca de los módulos que no pudo encontrar. Por supuesto, ¡no están instalados!
Leí https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling y de acuerdo con eso probé
cabal --with-ghc=arm-unknown-linux-gnueabi-ghc --with-ghc-pkg=arm-unknown-linux-gnueabi-ghc-pkg --with-ld=arm-unknown-linux-gnueabi-ld install random
al azar es la depenency que estoy tratando de instalar aquí. Obtuve el siguiente error:
Resolving dependencies...
Configuring random-1.0.1.3...
Failed to install random-1.0.1.3
Last 10 lines of the build log ( /home/daniel/.cabal/logs/random-1.0.1.3.log ):
/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: cannot execute binary file
cabal: Error: some packages failed to install:
random-1.0.1.3 failed during the configure step. The exception was:
ExitFailure 126
Cuando lo hago
file /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804
yo obtengo
/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.2, not stripped
No es de extrañar que no pueda ejecutarlo. Está compilado para el brazo.
¿Me estoy perdiendo de algo? Mi objetivo es incorporar todas las dependencias y luego crear una aplicación enlazada estáticamente que pueda implementar en mi frambuesa.