Как мне установить зависимости при кросс-компиляции кода haskell?

Я успешно создал кросс-компилятор ghc, который позволяет мне скомпилировать код на haskell для armv6h (raspberry pi в моем случае) с моей машины x64 linux. Я успешно запустил программу Hello World на малину.

Нет, я хочу создать свое реальное приложение, которое имеет много зависимостей от других модулей haskell. Когда я компилирую для x64, я просто делаю

cabal install dependenciy1 depenency2 ...

Я знаю, что мог бы сделать свою собственную программу кабальным проектом, чтобы автоматизировать этот шаг. Но дело не в этом.

Когда я пытаюсь использовать кросс-компилятор

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

Не удивительно, что это не может выполнить это. Он составлен для рук.

Я что-то здесь упускаю? Моя цель - установить все зависимости, а затем создать статически связанное приложение, которое я смогу развернуть на своей малине.

1 ответ

Решение

Чтобы понять эту ошибку, вам нужно знать, как cabal install работает внутри. По сути, он будет выполнять следующие шаги:

  1. Скачайте и распакуйте исходный код
  2. компилировать Setup.hs (этот файл используется для настройки системы сборки, например, вы можете реализовать несколько хуков для запуска дополнительного кода на haskell в configure фаза).
  3. Бежать setup configure <configure flags> && setup build && setup install

Проблема в том, что сейчас cabal install использует GHC, данный --with-ghc также для шага 2, но исполняемый файл, созданный этим шагом, должен запускаться в хост-системе!

Обходной путь - выполнить шаги вручную, что означает, что вы имеете полный контроль. Сначала получите источник:

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

Затем скомпилируйте Setup.hs, используя хост ghc:

$ ghc ./Setup.hs -o setup

И, наконец, настроить, собрать и установить. Как предложено @Yuras в комментарии, мы также добавляем -x вариант для бега 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

Об этом уже есть проблема клики: https://github.com/haskell/cabal/issues/2085

Другие вопросы по тегам