2014-09-10 16 views
15

Pomyślnie utworzyłem kompilator krzyżowy ghc, który pozwala mi skompilować kod haskell dla armv6h (raspberry pi w moim przypadku) z mojego komputera z linux x64. Z powodzeniem przeprowadzam program cześć świata na malinowym.Jak zainstalować zależności podczas krzyżowego kompilowania kodu haskell?

Nie Chcę zbudować mojej prawdziwej aplikacji, która ma wiele zależności od innych modułów haskell. Kiedy skompilować dla x64 po prostu zrobić

cabal install dependenciy1 depenency2 ... 

Wiem, że mógłbym zrobić własny programowe klika-projekt zautomatyzować tę czynność. Ale nie o to tutaj chodzi.

Kiedy próbuję użyć krzyżu kompilator

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

Opowiada mi o modułach nie mógł znaleźć. Oczywiście nie są one zainstalowane!

czytam https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling i według tego, próbowałem

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 

losowa jest depenency Próbuję zainstalować tutaj. Pojawia się następujący błąd:

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 

Kiedy zrobić

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

uzyskać

/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 

Nic więc dziwnego, że nie może go wykonać. Jest skompilowany na ramię.

Czy tu czegoś brakuje? Moim celem jest pobranie wszystkich zależności, a następnie stworzenie statycznie połączonej aplikacji, którą mogę wdrożyć na mojej malince.

+2

można spróbować 'Cabal get random', a następnie cd do katalogu 'random - ???', a następnie 'runhaskell ./Setup.hs install --with-ghc = ... ...'? – bennofs

+0

Kiedy to zrobię, otrzymuję "nierozpoznaną" opcję instalacji \ "--with-ghc = arm-unknown-linux-gnueabi-ghc" nierozpoznana opcja "instalacji" \ '--with-ghc-pkg = arm- unknown-linux-gnueabi-ghc-pkg ' Nierozpoznana opcja' install '\ '--with-ld = arm-unknown-linux-gnueabi-ld'' –

+0

Och, wydaje ci się, że musisz zrobić' runhaskell ./Setup. hs configure --with ... ', następnie' runhaskell ./Setup.hs build' i wreszcie 'runhaskell ./Setup.hs install'. – bennofs

Odpowiedz

11

Aby zrozumieć ten błąd, musisz wiedzieć, jak działa wewnętrznie cabal install. W istocie, to należy wykonać następujące kroki:

  1. Pobierz i rozpakuj kod źródłowy
  2. Compile Setup.hs (ten plik jest używany do dostosowywania systemu budowania, na przykład, można zaimplementować pewne haczyki uruchomić dodatkowy kod haskell w fazie configure).
  3. Run setup configure <configure flags> && setup build && setup install

Problemem jest to, że teraz cabal install używa GHC podane przez --with-ghc także do kroku 2, ale wykonywalny produkowane przez tego kroku musi działać w systemie hosta!

Obejście polega na ręcznym wykonaniu kroków, co oznacza, że ​​masz pełną kontrolę.Po pierwsze, uzyskać źródło:

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

Następnie skompilować Setup.hs, stosując szereg GHC:

$ ghc ./Setup.hs -o setup 

I wreszcie, konfigurować, budować i instalować. Jak sugeruje @Yuras w komentarzu, możemy również dodać opcję -x do biegania 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 

Istnieje już klika problem ten temat: https://github.com/haskell/cabal/issues/2085

+0

Powinno być 'ghc ./Setup.hs -osetup' powinno być' ghc ./Setup.hs -o setup' z spacją między '-o' i "setup"? Otrzymałem "nierozpoznane flagi" -osetup "bez spacji. – HeatfanJohn

+0

@HeatfanJohn Oh, to zaskakujące, naprawdę potrzebujesz miejsca. Zastanawiam się, dlaczego '-packagelens' działa bez przestrzeni wtedy ... – bennofs

+0

Czy istnieje sposób na symulację tego, co robi kabal w scenariuszu? Byłoby pomocne, aby móc określić opcję 'builddir' i mieć obsługę piaskownic ... –

Powiązane problemy