2014-09-10 24 views
15

Ho creato con successo un compilatore ghc cross, che mi consente di compilare il codice haskell per armv6h (raspberry pi nel mio caso) dalla mia macchina x64 x64. Ho eseguito con successo un programma Hello World sul lampone.Come si installano le dipendenze quando si compila il codice haskell?

No, voglio costruire la mia vera app, che ha molte dipendenze da altri moduli haskell. Quando compilo per x64 faccio semplicemente

cabal install dependenciy1 depenency2 ... 

So che avrei potuto fare il mio programma una cabala-progetto di una automatizzare questo passo. Ma non è questo il punto qui.

Quando provo ad utilizzare il cross-compilatore

arm-unknown-linux-gnueabi-ghc --make myapp.hs 

Mi dice sui moduli non poteva trovare. Certo, non sono installati!

ho letto https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling e secondo che ho provato

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 

casuale è la depenency che sto cercando di installare qui. Ottengo il seguente errore:

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 

Quando faccio

file /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804 

ottengo

/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 

Non c'è da stupirsi che non può eseguirlo. È compilato per il braccio.

Mi manca qualcosa qui? Il mio obiettivo è inserire tutte le dipendenze, quindi creare un'app collegata staticamente che possa essere distribuita sul mio lampone.

+2

si può provare 'cabala get random', quindi cd nella directory 'random - ???', e quindi 'runhaskell ./Setup.hs install --with-ghc = ... ...' '? – bennofs

+0

Quando lo faccio ottengo l'opzione 'install' non riconosciuta \ '--with-ghc = arm-unknown-linux-gnueabi-ghc ' opzione' install 'non riconosciuta \' --with-ghc-pkg = arm- unknown-linux-gnueabi-ghc-pkg ' opzione' install 'non riconosciuta \ '--with-ld = arm-unknown-linux-gnueabi-ld'' –

+0

Oh, sembra che tu debba fare' runhaskell ./Setup. hs configure --with ... ', quindi' runhaskell ./Setup.hs build' e infine 'runhaskell ./Setup.hs install'. – bennofs

risposta

11

Per comprendere questo errore, è necessario sapere come cabal install funziona internamente. In sostanza, esso deve svolgere le seguenti operazioni:

  1. Scaricare e decomprimere il codice sorgente
  2. Compile Setup.hs (questo file viene utilizzato per la personalizzazione del sistema di compilazione, per esempio, è possibile implementare alcuni ganci per eseguire supplementari codice haskell nella fase configure).
  3. Run setup configure <configure flags> && setup build && setup install

Il problema è ora che cabal install utilizza il GHC data dal --with-ghc anche per la fase 2, ma l'eseguibile prodotto da questo passo deve essere eseguito su sistema host!

Una soluzione è eseguire i passaggi manualmente, il che significa che si ha il pieno controllo.In primo luogo, ottenere la fonte:

$ cabal get random 
Downloading random-1.0.1.3... 
Unpacking to random-1.0.1.3/ 
$ cd random-1.0.1.3 

Poi, compilare Setup.hs, utilizzando il ospite GHC:

$ ghc ./Setup.hs -o setup 

E, infine, configurare, costruire e installare. Come suggerito da @Yuras in un commento, aggiungiamo anche l'opzione per l'esecuzione -xhsc2hs:

$ ./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 

C'è già un problema di cabala su questo: https://github.com/haskell/cabal/issues/2085

+0

Dovremmo 'ghc ./Setup.hs -osetup' essere' ghc ./Setup.hs -o setup' con uno spazio tra '-o' e 'setup'? Ho ricevuto "flag non riconosciuti: -setup" senza spazio. – HeatfanJohn

+0

@HeatfanJohn Oh, è sorprendente, hai davvero bisogno di uno spazio. Mi chiedo perché '-packagelens' funzioni senza spazio, quindi ... – bennofs

+0

Esiste davvero un modo per simulare ciò che la cabal sta facendo in uno script? Sarebbe utile poter specificare l'opzione 'builddir' e avere il supporto per le sandbox ... –