61 votes

Quelle est la meilleure façon de structurer et de construire des projets OCaml ?

Pour les nouveaux venus dans l'écosystème, il n'est pas clair quelle est la manière canoniquement préférée de structurer et de gérer la construction de projets OCaml de petite et moyenne taille. Je comprends les bases de ocamlc - ils reflètent suffisamment les compilateurs C conventionnels d'UNIX pour sembler simples. Mais, au-delà du niveau de la compilation ponctuelle de fichiers individuels, la meilleure façon de gérer la compilation de manière simple et propre n'est pas claire. La question n'est pas de chercher des outils potentiels, mais de voir une ou quelques bonnes (assez bonnes) façons - validées par l'expérience de la communauté - de structurer et de construire des projets OCaml standard.

Mon cas d'utilisation modèle est un projet modeste mais non trivial, de pur OCaml ou OCaml plus une dépendance C. Un tel projet :

  1. contient un certain nombre de fichiers sources
  2. des liens vers un certain nombre de bibliothèques standard
  3. des liens vers une ou plusieurs bibliothèques de tierces parties
  4. inclut éventuellement une bibliothèque C et un wrapper OCaml en tant que sous-projet (bien que cela puisse également être géré séparément et inclus en tant que bibliothèque tierce, comme dans (3))

Plusieurs outils alternatifs se distinguent :

  • Les Makefiles personnalisés semblent être la norme commune dans la plupart des paquets OCaml open source, mais ils sont frustrants, verbeux et complexes - encore plus que pour les modestes projets C/C++. Pire encore, de nombreuses bibliothèques OCaml, même apparemment simples, superposent autoconf/automake pour une complexité encore plus grande.
  • ocamlbuild semble offrir un mécanisme moderne et rationalisé pour automatiser les constructions avec une configuration minimale, mais il n'est pas bien documenté pour les nouveaux venus, ni représenté par des exemples dans les documents d'introduction de l'écosystème OCaml, ni visiblement utilisé par l'un des divers projets OCaml publiés que j'ai parcourus pour m'en inspirer.
  • OASIS semble être une couche de convention et de code de bibliothèque au-dessus d'autres systèmes de construction pour supporter la construction d'un gestionnaire de paquets et d'une bibliothèque, comme Cabal.

(J'ai également vu OMake qui semble être un groupe qui s'autoproclame " make++ ", qui comprend également une suite de règles standard pour les langages courants, dont OCaml, et ocaml-make née OCamlMakefile, fournissant un modèle de règles standard pour GNU make .)

Est-ce que l'un d'entre eux est un moyen moderne et préféré de gérer les constructions OCaml ?

Comment structurer au mieux les dossiers de projet ?

Comment les dépendances des bibliothèques tierces sont-elles incluses et gérées ? Est-il préférable de les installer au niveau du système, ou existe-t-il un moyen standard et simple de les gérer localement dans un projet ? Je préfère de loin un modèle dans lequel les projets restent aussi autonomes que possible.

23voto

Ashish Agarwal Points 1573

Vous avez dressé une liste exhaustive des options disponibles, mais cette question n'aura pas de réponse claire. Ma recommandation personnelle est également d'utiliser ocamlbuild. Le fichier myocamlbuild.ml fournit aquí est un bon début. Il vous permettra de compiler facilement des projets qui dépendent de diverses bibliothèques. Je ne pense pas qu'il gère le cas de la liaison avec les bibliothèques C, mais il y a des exemples supplémentaires sur le site de l wiki qui pourrait vous aider.

Certaines personnes s'opposent à ocamlbuild parce qu'il s'agit d'un outil de construction supplémentaire qui complique le travail des gestionnaires de paquets. Cependant, sa facilité d'utilisation et le fait qu'il soit inclus dans la distribution officielle font qu'il est de plus en plus utilisé.

Vous pouvez aussi sauter tout cela et utiliser directement l'oasis. Il est très récent, et une version stable n'a pas encore été annoncée, mais il est très utilisable. Il génère automatiquement le fichier myocamlbuild.ml pour vous. C'est probablement la voie à suivre dans un avenir très proche, si ce n'est déjà fait. De plus, en utilisant oasis, vous bénéficierez immédiatement de oasis-db, un système de type CPAN pour OCaml qui est en cours de développement.

En ce qui concerne la gestion des bibliothèques, la réponse est ocamlfind. Si vous avez plusieurs instances d'OCaml installées, appeler la copie appropriée de ocamlfind fera automatiquement en sorte que toutes les références aux bibliothèques soient celles de cette instance particulière, en supposant que vous utilisiez ocamlfind systématiquement pour toutes les bibliothèques. J'utilise actuellement godi pour installer OCaml et les bibliothèques. Il utilise ocamlfind, et je n'ai aucun problème à avoir plusieurs instances d'OCaml installées.

5 votes

Cela fait presque trois ans que j'ai répondu. J'aimerais partager mon expérience en tant que nouvel arrivant. Après avoir beaucoup souffert, j'en suis arrivé à la conclusion que le fait de dévorer les documents relatifs à et d'utiliser ocamlc , ocamlopt y ocamlmklib par le biais de ocamlfind est la façon la moins pénible de construire des projets OCaml. J'ai documenté mes découvertes ici github.com/pacemkr/ocaml-scrypt/blob/master/Makefile Je suis sûr que oasis un myocamlbuild.ml les fichiers résolvent des problèmes réels. J'ai essayé, j'ai vraiment essayé, mais les deux outils échouent lamentablement à abstraire la complexité sous-jacente.

2 votes

Je considère que ma réponse est également dépassée. Récemment, j'ai utilisé OMake Mais je ne suis pas satisfait de tous les outils de construction et j'espère que quelque chose de fondamentalement meilleur finira par émerger.

2 votes

Les choses s'améliorent, opam ne se soucie pas vraiment du système de construction, ce qui est bien. ocamlfind permet d'utiliser ocamlc et les amis beaucoup plus facilement. Ces deux-là me permettent de m'approcher suffisamment. La partie la plus difficile a été de comprendre tous les artefacts intermédiaires (cm*) et leur provenance, ainsi que l'indirection de cclib et d'autres drapeaux similaires, comment ils sont transmis avec un paquet, les constructions d'exécution personnalisées, etc.

15voto

akoprowski Points 2448

Personnellement, je donnerais +1 pour ocamlbuild. Ses règles par défaut sont suffisamment bonnes pour compiler des projets de taille petite à moyenne avec une seule commande et une configuration minimale ou nulle. Il applique également des conventions très raisonnables (ne pas mélanger les sources avec les résultats de la compilation). Et pour les projets plus importants, il peut être personnalisé selon les désirs de chacun, avec des règles et des plugins supplémentaires. Dans l'entreprise où je travaille, nous l'utilisons pour un projet de type projet important (Ocaml + un peu de C + un peu de prétraitement + ...) et cela fonctionne comme un charme (et nous donne beaucoup moins de maux de tête que ne le ferait Makefiles).

En ce qui concerne les manuels, je pense que le guide de l'utilisateur (disponible sur le site Web de l'entreprise) peut être utile. page web de l'auteur ) devrait suffire à vous faire démarrer. Pour les trucs plus funky, il faudra peut-être creuser un peu plus.

0 votes

Tout à fait d'accord. Je suis impliqué dans un grand projet qui utilise ocamlfind, preprocessing, et c sans trop de problèmes.

1 votes

C'est en tout cas ce qui semblait le plus attrayant dans mon enquête parallèle. Je ferai un compte-rendu une fois que j'aurai commencé à l'utiliser.

7 votes

A tous les fans d'ocamlbuild : rappelez-vous que vous peuvent améliorer l'outil en contribuant à la rédaction de la documentation, en publiant des extraits de vos créations personnelles intéressantes. myocamlbuild.ml ou même éventuellement contribuer au code (mais pour cela vous devez d'abord contacter les développeurs) pour les fonctionnalités que vous souhaitez (cible facile sur ma liste de souhaits : permettre d'appeler ocamldoc pour produire des diagrammes en points).

10voto

bltxd Points 4408

+1 pour OMake.

Nous avons réorganisé notre infrastructure de construction il y a quelques années et avons choisi OMake pour les raisons suivantes :

  • nos produits sont composés d'un mélange de C, C++, Managed C++, Ruby et OCaml.
  • nous ciblons à la fois Linux et Windows.
  • nous interagissons avec les bases de données au moment de la construction.
  • pour certaines productions, nous avons dû utiliser OCaml 3.10.
  • notre système de construction original utilisait autoconf/automake.
  • nous exigeons des constructions hors-source*.

Pour être honnête, je ne sais pas si nous aurions pu le faire avec ocamlbuild, je ne l'ai pas testé. L'outil est certainement utilisé puisqu'il y a de l'activité autour de lui dans le bugtracker d'OCaml. Si vous optez pour ocamlbuild, assurez-vous d'avoir une version d'OCaml à jour.

* OMake supporte les constructions hors-source d'une manière un peu moins évidente. Il a également quelques problèmes lorsque les sources sont en lecture seule. Nous avons dû corriger et reconstruire notre version Windows de OMake.

3 votes

J'aimerais voir une comparaison entre omake et ocamlbuild. J'ai utilisé omake avec beaucoup de succès. Je n'ai pas eu autant de chance quand j'ai essayé ocamlbuild, mais c'était il y a quelques années.

7voto

mc10 Points 5494

La recommandation actuelle est d'utiliser Dune un système de construction composable qui supporte la compilation OCaml et Reason. Il est en train de développé activement .

El Page de démarrage rapide offre une variété de modèles de projets pour commencer.

Dune peut également prendre en charge les éléments suivants :

Opam est le gestionnaire de paquets de facto pour OCaml. Outre la recherche et l'installation de paquets, il peut également gérer plusieurs installations OCaml .

Esy est un gestionnaire de paquets plus récent, piloté par package.json, né de la communauté Reason. Sa hauteur est qu'il apporte un sandboxing de projet prêt à l'emploi, et fournit un moyen facile de tirer des paquets opam existants.

3voto

william3 Points 31

Bonne question. J'aurais tendance à dire :

1) ocamlbuild C'est probablement la façon standard de compiler, parce que c'est efficace, rapide, et l'outil par défaut fourni par la distribution officielle. Le fait qu'il soit dans la distribution officielle est un bon point, car il est plus susceptible de rester avec le temps. De plus, il a ocamlfind activé, donc il peut gérer les paquets installés avec ocamlfind, un autre standard pour l'installation de paquets (ocamlfind est un peu comme pkg-config pour C).

2) Mais cela ne sera pas suffisant pour votre projet. L'intégration avec le C est basique avec ocamlbuild. Donc ici je vous conseillerais peut-être d'utiliser oasis pour enfin répondre à votre question. J'ai aussi essayé OMake, mais je ne l'ai pas aimé.

3) Cependant, vos scripts de construction ne fonctionneront probablement pas correctement si vous ne voulez pas que d'autres personnes puissent télécharger et construire votre projet sur leur propre machine. De plus, oasis ne gère pas pkg-config. Pour ces raisons, j'aurais tendance à vous conseiller d'utiliser ocaml-autoconf (macros ocaml pour autotools). Parce que autotools est le standard pour la gestion des bibliothèques C et qu'il est bien connu des mainteneurs de paquets. Il peut également gérer la compilation croisée...

\=> ocaml-autoconf avec ocamlbuild

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X