Как установить зависимости при перекрестном компиляции кода haskell?
Я успешно создал компилятор ghc cross, который позволяет мне скомпилировать код haskell для armv6h (малиновый pi в моем случае) с моей Linux-машины x64.
Я успешно запускаю приветственную программу мира на малине.
Нет. Я хочу создать свое реальное приложение, которое имеет много зависимостей от других модулей 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
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
работает внутри. По сути, он выполнит следующие шаги:
- Загрузите и распакуйте исходный код
- Компилировать
Setup.hs
(этот файл используется для настройки системы сборки, например, вы можете реализовать некоторые перехватчики для запуска дополнительного кода хэширования на фазе configure
).
- Запустить
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