2014-09-10 3 views
15

필자는 ghc 크로스 컴파일러를 성공적으로 만들었습니다. 내 x64 Linux 시스템에서 armv6h (제 경우의 raspberry pi)에 대한 haskell 코드를 컴파일 할 수있게되었습니다. 라즈베리에서 hello world 프로그램을 성공적으로 실행했습니다.haskell 코드를 크로스 컴파일 할 때 어떻게 의존성을 설치합니까?

아니요 다른 haskell 모듈에 많은 의존성이있는 실제 앱을 만들고 싶습니다. 내가 64에 대해 컴파일 할 때 단순히

cabal install dependenciy1 depenency2 ... 

을 나는 내 자신을 programm 음모 프로젝트 만들기이 단계를 자동화 할 수 있습니다 알고 있습니다. 하지만 여기서 중요한 것은 아닙니다.

나는 그것이 찾을 수 없습니다 모듈에 대해 알려줍니다 크로스 컴파일러

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

을 사용하려고

. 물론, 그들은 설치되지 않았습니다!

나는 https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling 를 읽고 그에 따라 나는
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 

임의

내가 여기 설치하는 데 노력하고있어 depenency입니다했습니다. 내가

file /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: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.2, not stripped 

그것을 실행할 수 없습니다 의심 할 여지을 얻을

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 

: 나는 다음과 같은 오류가 발생합니다. 그것은 팔을 위해 컴파일됩니다.

여기에 뭔가가 있습니까? 내 목표는 모든 의존성을 끌어 내 라즈베리에 배포 할 수있는 정적 링크 된 앱을 만드는 것입니다.

+2

당신이'음모 가져 오기 random'을 시도 할 수 있습니다, 다음 CD를 이미 이것에 대해 도당 문제가

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

'random - ???'디렉토리에 복사 한 다음'runhaskell ./Setup.hs install --with-ghc = ... ...'? – bennofs

+0

내가 할 때 '인식 할 수없는'설치 '옵션을 \'--with-ghc = arm-unknown-linux-gnueabi-ghc ' 알 수없는'설치 '옵션 \'--with-ghc-pkg = arm- unknown-linux-gnueabi-ghc-pkg ' 알 수없는'install '옵션 \'--with-ld = arm-unknown-linux-gnueabi-ld '\ –

+0

오, 당신은'runhaskell ./Setup'을 할 필요가 있습니다. hs configure --with ...','runhaskell ./Setup.hs build' 그리고 마지막으로'runhaskell ./Setup.hs install'을 사용합니다. – bennofs

답변

11

이 오류를 이해하려면 cabal install이 내부적으로 어떻게 작동하는지 알아야합니다. 본질적으로, 다음 단계를 수행합니다

  1. 다운로드 (이 파일은 예를 들어, 당신은 추가로 실행하는 데 약간의 후크를 구현할 수, 빌드 시스템의 사용자 정의에 사용되는 소스 코드
  2. 컴파일 Setup.hs를 풀고 configure 단계의 haskell 코드).
  3. 실행 setup configure <configure flags> && setup build && setup install

문제는 cabal install 단계 2도 --with-ghc에 의해 주어진 GHC를 사용하지만, 그 단계에 의해 생성 된 실행 파일이 호스트 시스템에서 실행해야하는 지금!

해결 방법은 단계를 수동으로 수행하는 것입니다. 즉, 모든 단계를 수동으로 수행해야합니다.호스트 GHC를 사용하여, Setup.hs를 컴파일, 그리고

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

:

$ ghc ./Setup.hs -o setup 

를 마지막으로 구축하고, 설치, 구성 첫째, 소스를 얻을. 코멘트에서 @Yuras에 의해 제안, 우리는 또한 hsc2hs을 실행하기위한 -x 옵션을 추가 : https://github.com/haskell/cabal/issues/2085

+0

'ghc ./Setup.hs -osetup'는'ghc ./Setup.hs -o setup'을'-o'와 및'setup'? 공백없이'인식 할 수없는 플래그 : -osetup'을 받았습니다. – HeatfanJohn

+0

@HeatfanJohn 오, 놀랍습니다. 실은 공간이 필요합니다. 나는 왜'-packagelens'가 공간없이 작동하는지 궁금합니다 ... – bennofs

+0

실제로 어떤 cabal이 스크립트에서하고 있는지를 시뮬레이트하는 방법이 있습니까? 'builddir' 옵션을 지정하고 샌드 박스를 지원할 수 있다면 도움이 될 것입니다 ... –