Tworzenie statycznego pliku wykonywalnego Haskell Linux

Nieczęsto dwie rzeczy, które tak bardzo kocham, spotykają się, aby przysporzyć mi tyle irytacji (oprócz moich dzieci). Napisałem program Haskell w pracy, który używa bibliotek takich jak tekst, XML-enumerator, attoparsec-text, itp. Mam go działa poprawnie na moim komputerze z systemem Windows w pracy, moja maszyna wirtualna Ubuntu w pracy( 32-bit), mój pulpit Ubuntu (32-bit ponownie) i instancja EC2 z Ubuntu (64-bit).

Nasz klient działa CentOS 5.3, 64-bit. Nie mogę tego dostać. wykonywalny do prawidłowego działania. Próbowałem stworzyć statyczny plik wykonywalny używając:

ghc --make myprog.hs -optl-static -optl-pthread

Ale kiedy próbuję uruchomić ten plik wykonywalny na serwerze CentOS, pojawia się komunikat o błędzie:

openFile: invalid argument (Invalid argument)

Zakładam, że jest to związane z opisywanym tu błędem. Próbowałem kompilacji z 32 i 64 bit Ubuntu, próbowałem statycznych i współdzielonych kompilacji, nic nie działa (choć czasami dostaję segfaults zamiast powyższego komunikatu o błędzie). Mogę spróbować pobrać CentOS 5.3 i stworzyć maszynę wirtualną na to, ale pobranie zajmie trochę czasu i nie jestem pewien, która wersja GHC będzie na nim działać(próbowałem dostać GHC 7 na ich serwerze, ale napotkałem problem z libc).

W tym momencie wymyśliłem kilka możliwych podejść, ale chciałbym ich uniknąć, jeśli w ogóle jest to możliwe:

  • przepisać w innym języku(myśl o zrobieniu tego w Javie sprawia, że mdli mnie, choć może to być dobry czas, aby wypróbować Cal / OpenQuark).
  • Może wypróbuj alternatywny kompilator, jak jhc. Ale nie jestem do końca pewien, jak zacząć instalować wszystkie zależności dla tego programu w jhc; jeśli ludzie mają doświadczenie i wiedzą, że text / attoparsec / etc działa w jhc, chciałbym to usłyszeć.
  • Hack wszystkich hacków: zbuduj plik wykonywalny Windows, Zainstaluj wine na swoim serwerze i uruchom go w ten sposób.
Na marginesie, to są sytuacje, w których naprawdę chciałbym mieć backend JVM dla GHC. Myślę, że mógłbym też wypróbować LambdaVM. Ale z przyjemnością wysłuchaj porad społeczności, co tu robić.
Author: Don Stewart, 2011-05-10

3 answers

Ten prosty przykład "działa dla mnie":

$ 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"

(i użyłem tego procesu, via .cabal, aby wysyłać pliki wykonywalne dla klientów w ciągu ostatnich kilku lat).

Myślę, że najlepszym wyjściem jest zgłaszanie błędów i uruchamianie tego. IHG może również finansować takie prace, ale jestem całkiem pewien, że zespół GHC uznałby to za wysoki priorytet, jeśli próbujesz wysłać produkty.

 29
Author: Don Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 17:13:01

Jest powiązany ze starą biblioteką glibc w CentOS. Musisz skompilować z tą samą wersją glibc, co zainstalowana na CentOS.

Miałem dokładnie ten sam problem. Haskell wykonywalny skompilowany na arch (lub ubuntu) nie będzie działać na CentOS. W moim przypadku jednak miałem szczęście, ponieważ nasz admin właśnie usunął CentOS i zainstalował Arch dla serwera aplikacji.

 7
Author: Vagif Verdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 17:21:06

Odkryłem problem. Wygląda na to, że link do strony Biohaskell jest dokładny: jest to problem z ładowaniem iconv. Występuje podczas wywoływania openFile, ale nie podczas wywoływania openBinaryFile. Ponieważ xml-enumerator używa tego ostatniego, działało dobrze. Przełączenie reszty kodu na openBinaryFile zamiast (poprzez Data.Enumerator.Binary.enumFile) sprawiło, że wszystko zaczęło działać.

Jest to dobre obejście dla mojego przypadku użycia, ale błąd nadal istnieje.

 4
Author: Michael Snoyman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 08:52:41