Jaki jest preferowany sposób strukturyzowania i budowania projektów OCaml?

Nie jest jasne, czy nowicjusze w ekosystemie są preferowanymi kanonicznie sposobami tworzenia i zarządzania małymi i średnimi projektami OCaml. Rozumiem podstawy ocamlc, & C. -- odzwierciedlają one konwencjonalne Kompilatory Uniksa C na tyle, że wydają się proste. Jednak, powyżej poziomu jednorazowej kompilacji poszczególnych plików, nie jest jasne, jak najlepiej zarządzać kompilacją w prosty i czysty sposób. Problemem nie jest szukanie potencjalnych narzędzi, ale dostrzeganie jednego lub kilku słusznych (wystarczy) Sposoby-potwierdzone przez doświadczenie społeczności-na strukturyzację i budowanie standardowych projektów OCaml.

Mój modelowy przypadek użycia jest skromnym, ale nietrywialnym projektem, z czystym OCaml lub OCaml plus zależność C. Taki projekt:

  1. zawiera wiele plików źródłowych
  2. linki do wielu bibliotek standardowych
  3. linki do jednej lub więcej bibliotek stron trzecich
  4. opcjonalnie zawiera bibliotekę C i Wrapper OCaml jako podprojekt (choć może to być również zarządzane w przeciwieństwie do innych bibliotek, nie można ich używać.]}

Wyróżnia się kilka alternatywnych narzędzi:

  • niestandardowe pliki Makefile wydają się być powszechnym standardem w większości pakietów open source OCaml, ale wydają się frustrująco gadatliwe i złożone-nawet bardziej niż w przypadku skromnych projektów C/C++. Co gorsza, wiele nawet pozornie prostych bibliotek OCaml warstwuje autoconf / automake na wierzchu dla jeszcze większej złożoności.
  • ocamlbuild wydaje się oferować nowoczesny, usprawniony mechanizm do automatyzacji kompilacji z minimalną konfiguracją, ale nie jest to dobrze udokumentowane dla początkujących, ani nie jest reprezentowane przez przykład w materiałach wprowadzających w ekosystem OCaml, ani widocznie używane przez żaden z różnych opublikowanych projektów OCaml, które przeglądałem dla inspiracji.
  • Oasis wydaje się być warstwą kodu konwencyjnego i bibliotecznego na szczycie innych systemów budowania, aby wspierać budowanie menedżera pakietów i biblioteki, jak Cabal.

(widziałem też OMake , który wydaje się być samodzielnym "make++", który zawiera również zestaw standardowych reguł dla popularnych języków, w tym OCaml, oraz ocaml-make z OCamlMakefile, dostarczający szablon standardowych reguł dla GNU make.)

Czy któraś z nich jest preferowanym, nowoczesnym sposobem zarządzania kompilacjami OCaml?

W Jaki Sposób pliki projektu są najlepiej zorganizowane?

W Jaki Sposób są uwzględniane i zarządzane zależności bibliotek innych firm? Czy preferowane jest instalowanie ich w systemie poziom, czy istnieje standardowy i prosty sposób zarządzania nimi lokalnie do projektu? Zdecydowanie wolałabym model, w którym projekty pozostają jak najbardziej samodzielne.

Author: ygrek, 2011-05-11

4 answers

Masz dokładną listę dostępnych opcji, ale to pytanie nie będzie miało jasnej odpowiedzi. Moją osobistą rekomendacją jest również użycie ocamlbuild. Na myocamlbuild.ml plik dostarczony tutaj jest dobrym początkiem. Pozwoli to na łatwe kompilowanie projektów, które zależą od różnych bibliotek. Nie wydaje mi się, aby zajmowało się ono sprawą wiązania z bibliotekami C, ale istnieją dodatkowe przykłady na wiki , które mogą pomóc.

Niektórzy sprzeciwiają się ocamlbuild, ponieważ to kolejne narzędzie do budowania, komplikujące pracę menedżerów pakietów. Jednak jego łatwość użycia i fakt, że jest zawarty w oficjalnej dystrybucji sprawia, że jest coraz szerzej stosowany.

Możesz również pominąć to wszystko i użyć Oasis bezpośrednio. Jest bardzo Nowy, a stabilne wydanie nie zostało jeszcze ogłoszone, ale jest bardzo użyteczne. Wygeneruje myocamlbuild.ml automatycznie dla Ciebie. Jest to prawdopodobnie sposób, aby przejść w bardzo bliskiej przyszłości, jeśli nie już. Ponadto, za pomocą Oasis, od razu będziesz miał korzyści z Oasis-db, systemu podobnego do CPAN dla OCaml, który jest w fazie rozwoju.

Jeśli chodzi o zarządzanie bibliotekami, odpowiedzią jest ocamlfind. Jeśli masz zainstalowane wiele instancji OCaml, wywołanie odpowiedniej kopii ocamlfind spowoduje, że wszystkie odwołania do bibliotek będą tymi dla tej konkretnej instancji, zakładając, że używasz ocamlfind systematycznie dla wszystkich bibliotek. Obecnie używam godi do instalacji OCaml i bibliotek. Używa ocamlfind, i nie mam problemu z zainstalowaniem wielu instancji OCaml.

 21
Author: Ashish Agarwal,
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 12:43:56

Osobiście dałbym +1 za ocamlbuild. Jego domyślne reguły są wystarczająco dobre, aby kompilować małe i średnie projekty za pomocą jednego polecenia i ŻADNEGO do bardzo minimalnej konfiguracji. Wymusza również pewne bardzo rozsądne konwencje (nie mieszanie źródeł z wynikami kompilacji). A dla większych projektów można go dostosować do własnych potrzeb, z dodatkowymi regułami i wtyczkami. W firmie, w której pracuję, używamy go do dużego projektu (Ocaml + trochę C + trochę wstępnego przetwarzania + ...) i działa jak urok (i daje nam znacznie mniej bólu głowy niż Makefiles).

Jeśli chodzi o podręczniki, myślę, że podręcznik użytkownika (dostępny na stronie autora ,) powinien wystarczyć, aby zacząć. Więcej funky rzeczy może wymagać trochę więcej kopania.

 14
Author: akoprowski,
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-07-11 15:26:07

+ 1 dla OMake.

Kilka lat temu przebudowaliśmy naszą infrastrukturę i wybraliśmy OMake z następujących powodów:

  • nasze produkty składają się z mieszaniny C, C++, Managed C++, Ruby i OCaml.
  • celujemy zarówno w Linuksa, jak i Windows.
  • [5]}współpracujemy z bazami danych w czasie budowania.
  • w niektórych produkcjach musieliśmy użyć OCaml 3.10.
  • nasz oryginalny system budowania używał autoconf / automake.
  • wymagamy kompilacji out-of-source*.

To szczerze mówiąc, Nie wiem, czy moglibyśmy to zrobić z ocamlbuild, nie testowałem tego. Narzędzie jest używane na pewno, ponieważ istnieje pewna aktywność wokół niego w bugtrackerze Ocamla. Jeśli zdecydujesz się na ocamlbuild, upewnij się, że masz aktualną wersję OCaml.

*OMake wspiera Kompilacje out-of-source w nieco nieoczywisty sposób. Ma również pewne problemy, gdy źródła są tylko do odczytu. Musieliśmy łatać i przebudowywać naszą wersję OMake Dla Windows.

 10
Author: bltxd,
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 13:57:42

Dobre pytanie. Chciałbym powiedzieć:

1) ocamlbuild Prawdopodobnie będzie to standardowy sposób kompilacji, ponieważ jest wydajny, szybki i domyślnym narzędziem podanym przez oficjalną dystrybucję. Fakt, że jest w oficjalnej dystrybucji jest dobry punkt, ponieważ jest bardziej prawdopodobne, aby pozostać z czasem. Co więcej, ma włączone ocamlfind, dzięki czemu może zarządzać pakietami zainstalowanymi za pomocą ocamlfind, innego standardu instalacji pakietów (ocamlfind jest trochę jak pkg-config dla C)

2) ale to nie wystarczy dla Twojego projektu. Integracja z C jest podstawowa z ocamlbuild. Więc tutaj może radziłbym użyć oasis, aby w końcu odpowiedzieć na twoje pytanie. Próbowałem również OMake, ale nie podobało.

3) jednak Twoje Skrypty kompilacji prawdopodobnie nie będą działać prosto, jeśli nie chcesz, aby inni ludzie mogli pobrać i zbudować swój projekt na własnej maszynie. Ponadto oasis nie obsługuje pkg-config. Z tych powodów radzę ci używać ocaml-autoconf (makra ocaml dla autotools). Ponieważ autotools są standardem zarządzania bibliotekami C i jest dobrze znany przez opiekunów pakietów. Może również obsługiwać kompilację krzyżową...

= > ocaml-autoconf with ocamlbuild

 3
Author: william3,
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
2012-05-22 17:57:58