Создайте статический исполняемый файл Haskell Linux - PullRequest
24 голосов
/ 10 мая 2011

Не часто две вещи, которые я так люблю, собираются вместе, чтобы вызывать у меня столько раздражения (кроме моих детей).На работе я написал программу на 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;если у людей есть опыт и они знают, что text / attoparsec / etc работает в jhc, я бы хотел услышать это.
  • Взломать все хаки: собрать исполняемый файл Windows, установить Wine на свой сервер и запустить его таким образом..

В целом, это ситуации, когда мне действительно хотелось бы иметь бэкэнд JVM для GHC.Я полагаю, я мог бы также попробовать LambdaVM.Но я хотел бы услышать совет сообщества о том, что делать здесь.

Ответы [ 3 ]

30 голосов
/ 10 мая 2011

Этот простой пример «работает для меня»:

$ 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 сочтет это высоким приоритетом, если вы пытаетесь отгружать продукты.

8 голосов
/ 10 мая 2011

Это связано со старой библиотекой glibc в CentOS.Вы должны скомпилировать ту же версию glibc, что и в CentOS.

У меня была точно такая же проблема.Исполняемый файл Haskell, скомпилированный на arch (или ubuntu), не будет работать на CentOS.Хотя в моем случае мне повезло, потому что наш админ только что удалил CentOS и установил Arch для сервера приложений.

5 голосов
/ 11 мая 2011

Я обнаружил проблему.Кажется, что ссылка на страницу Biohaskell точна: это проблема загрузки iconv.Это происходит при вызове openFile, но , а не при вызове openBinaryFile.Так как xml-enumerator использует последний, он работал просто отлично.Переключение оставшейся части кода для использования openBinaryFile вместо (через Data.Enumerator.Binary.enumFile) заставило все работать.

Это хороший обходной путь для моего варианта использования, но ошибка все еще существует.

...