如何在交叉编译haskell代码时安装依赖关系?

我已经成功创建了一个ghc交叉编译器,它允许我从我的x64 linux机器上编译armv6h(在我的例子中是raspberry pi)的haskell代码。 我已经在树莓上成功运行了一个hello world程序。

不,我想构建我的真实应用程序,它对其他haskell模块有很大的依赖性。 当我为x64编译时,我只是做

cabal install dependenciy1 depenency2 ...

我知道我可以将自己的程序设计为cabal-project这一步的自动化。 但这不是重点。

当我尝试使用交叉编译器时

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

随机是我试图在这里安装的依赖性。 我收到以下错误:

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

当我做

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

难怪它不能执行它。 它是为手臂编译的。

我在这里错过了什么吗? 我的目标是引入所有的依赖关系,然后创建一个静态链接的应用程序,我可以在我的覆盆子上部署。


为了理解这个错误,你需要知道cabal install如何在内部工作。 实质上,它将执行以下步骤:

  • 下载并解压缩源代码
  • 编译Setup.hs (该文件用于构建系统的自定义,例如,您可以实现一些挂钩以在configure阶段运行其他haskell代码)。
  • 运行setup configure <configure flags> && setup build && setup install
  • 现在的问题是, cabal install使用--with-ghc给出的GHC也用于第2步,但该步骤生成的可执行文件必须在主机系统上运行!

    解决方法是手动执行这些步骤,这意味着您可以完全控制。 首先,获取源代码:

    $ 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

    $ ghc ./Setup.hs -o setup
    

    最后,配置,构建和安装。 正如@Yuras在评论中所建议的那样,我们还为运行hsc2hs添加了-x选项:

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

    已经有一个关于这个问题的阴谋:https://github.com/haskell/cabal/issues/2085

    链接地址: http://www.djcxy.com/p/64059.html

    上一篇: How do I install dependencies when cross compiling haskell code?

    下一篇: How to install a 32