Создайте статический исполняемый файл Haskell Linux
Не так часто две вещи, которые я так люблю, объединяются, чтобы вызвать у меня столько раздражения (помимо моих детей). Я написал программу Haskell на работе, которая использует библиотеки, такие как text, xml-enumerator, attoparsec-text и т.д. Я работаю правильно на своей машине Windows на работе, моя виртуальная машина Ubuntu на работе (32-разрядная), моя Рабочий стол Ubuntu (снова 32-бит) и экземпляр EC2 с Ubuntu (64-разрядной версией).
Наш клиент работает CentOS 5.3, 64-бит. Я не могу на всю жизнь получить этот исполняемый файл для правильной работы. Я попытался создать статический исполняемый файл, используя:
ghc --make myprog.hs -optl-static -optl-pthread
Но когда я пытаюсь запустить этот исполняемый файл на сервере CentOS, появляется сообщение об ошибке:
openFile: invalid argument (Invalid argument)
Я предполагаю, что это связано с ошибка, описанная здесь. Я пробовал компиляцию из 32-битного и 64-битного Ubuntu, ставил статические и общие сборки, ничего не работает (хотя иногда я получаю segfaults вместо вышеупомянутого сообщения об ошибке). Я могу попробовать загрузить CentOS 5.3 и создать для нее виртуальную машину, но для ее загрузки потребуется некоторое время, и я не уверен, какая версия GHC будет работать над ней (я пытался получить GHC 7 на своем сервере, но я побежал в проблему с libc).
В этот момент я придумал несколько возможных подходов, но я хотел бы избежать их, если это вообще возможно:
- Перепишите на другом языке (мысль о том, чтобы делать это в Java, делает меня тошнотворным, хотя было бы неплохо попробовать Cal/OpenQuark).
- Возможно, попробуйте альтернативный компилятор, например jhc. Но я не совсем уверен, как начать установку всех зависимостей для этой программы в jhc; если люди имеют опыт и знают, что текст /attoparsec/etc работают в jhc, я бы хотел его услышать.
- Взлом всех хаков: создайте исполняемый файл Windows, установите вино на свой сервер и запустите его таким образом.
В целом, это ситуации, когда я действительно хочу, чтобы у нас был JVM-сервер для GHC. Полагаю, я тоже мог попробовать LambdaVM. Но я хотел бы услышать советы сообщества о том, что делать здесь.
Ответы
Ответ 1
Этот простой пример "работает для меня":
$ cat A.hs
main = print "yes"
$ ghc -O2 --make -static -optc-static -optl-static A.hs -fvia-C -optl-pthread
$ ldd A
not a dynamic executable
$ ./A
"yes"
(и я использовал этот процесс через .cabal для отправки исполняемых файлов для клиентов за последние пару лет).
Я считаю, что лучше всего зарегистрировать ошибки и заставить их работать. IHG также может финансировать работу, как это, но я уверен, что команда GHC считает это приоритетным, если вы пытаетесь отправить продукцию.
Ответ 2
Это связано со старой библиотекой glibc в CentOS. Вы должны скомпилировать ту же версию glibc, что и на CentOS.
У меня была точно такая же проблема. Исполняемый файл Haskell, скомпилированный на arch (или ubuntu), не будет работать в CentOS. В моем случае, хотя мне повезло, потому что наш администратор просто удалил CentOS и установил Arch для сервера приложений.
Ответ 3
Я выяснил эту проблему. Кажется, что ссылка на страницу Biohaskell является точной: это проблема загрузки iconv. Это происходит при вызове openFile
, но не при вызове openBinaryFile
. Так как xml-enumerator
использует последнее, он работал отлично. Переключение остальной части кода на использование openBinaryFile
вместо этого (через Data.Enumerator.Binary.enumFile
) заставил все работать.
Это хороший способ для моего использования, но ошибка все еще существует.