Quelle est la manière préférée 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 taille petite à moyenne. Je comprends les bases d’ ocamlc , etc. – elles reflètent suffisamment les compilateurs UNIX C classiques pour sembler simples. Mais, au-delà du niveau de compilation unique des fichiers individuels, il est difficile de savoir comment gérer la compilation simplement et proprement. Le problème n’est pas de chercher des outils potentiels, mais de voir une ou plusieurs bonnes manières (validées par l’expérience de la communauté) pour structurer et construire des projets OCaml standard.

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

  1. contient un certain nombre de fichiers sources
  2. liens vers un certain nombre de bibliothèques standard
  3. des liens vers une ou plusieurs bibliothèques tierces
  4. inclut facultativement 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 courante dans la plupart des paquets OCaml open source, mais ils apparaissent de manière frustrante et complexe – plus encore que pour les projets C / C ++ modestes. Pire encore, de nombreuses bibliothèques OCaml, apparemment simples, superposent autoconf / automake pour une complexité encore plus grande.
  • ocamlbuild semble offrir un mécanisme moderne et automatisé pour automatiser les builds avec une configuration minimale, mais il n’est pas bien documenté pour les nouveaux venus, ni représenté par exemple dans les matériaux d’introduction de l’écosystème OCaml, ni visiblement utilisé par les différents projets OCaml publiés. J’ai cherché de l’inspiration.
  • OASIS semble être une couche de code de convention et de bibliothèque au-dessus d’autres systèmes de construction pour prendre en charge la création d’un gestionnaire de paquets et d’une bibliothèque, comme Cabal.

(J’ai également vu OMake , qui semble être un ” make++ ” autoproclamé , qui comprend également une suite de règles standard pour les langages communs, notamment OCaml et OCamlMakefile, fournissant un modèle de règles standard pour GNU make . )

Est-ce que l’une de ces méthodes est une façon moderne et préférée de gérer les builds OCaml?

Comment les fichiers de projet sont-ils mieux structurés?

Comment les dépendances de 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érerais de beaucoup un modèle dans lequel les projets restnt aussi autonomes que possible.

Vous avez une liste complète 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 fourni ici est un bon début. Cela vous permettra de comstackr facilement des projets qui dépendent de différentes 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 wiki qui peuvent aider.

Certaines personnes s’opposent à ocamlbuild, car il s’agit d’un autre outil de génération, ce qui complique les tâches des gestionnaires de packages. Cependant, sa facilité d’utilisation et le fait qu’il soit inclus dans la dissortingbution officielle le rendent de plus en plus utilisé.

Vous pouvez également ignorer tout cela et utiliser directement oasis. C’est très nouveau, et une version stable n’a pas encore été annoncée, mais elle est très utilisable. Cela générera automatiquement myocamlbuild.ml pour vous. C’est probablement la voie à suivre dans un avenir très proche, si ce n’est déjà. De plus, en utilisant oasis, vous bénéficierez immédiatement de oasis-db, un système similaire à CPAN pour OCaml en cours de développement.

En ce qui concerne la gestion des bibliothèques, la réponse est ocamlfind. Si plusieurs instances d’OCaml sont installées, l’appel de la copie appropriée d’ocamlfind provoquera automatiquement toutes les références aux bibliothèques pour cette instance particulière, en supposant que vous utilisiez systématiquement ocamlfind 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.

Personnellement, je donnerais +1 pour ocamlbuild. Ses règles par défaut sont suffisantes pour comstackr des projets de petite et moyenne taille avec une seule commande et aucune avec une configuration très minimale. Il applique également des conventions très raisonnables (ne pas mélanger les sources avec les résultats de la construction). Et pour les projets plus importants, il peut être personnalisé à volonté, avec des règles et des plugins supplémentaires. Dans l’entreprise où je travaille, nous l’utilisons pour un grand projet (Ocaml + un peu de C + prétraitement + …) et cela fonctionne comme un charme (et nous donne beaucoup moins de maux de tête que les Makefiles).

En ce qui concerne les manuels, je pense que le guide de l’utilisateur (disponible sur la page Web de l’ auteur ) devrait suffire pour vous permettre de démarrer. Des trucs plus funky peuvent nécessiter un peu plus de fouilles.

+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 de mélange de C, C ++, C ++ Managed, 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 d’origine utilisait autoconf / automake.
  • nous avons besoin de versions 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 bien sûr utilisé car il y a une certaine activité autour de lui dans le bugtracker d’OCaml. Si vous optez pour ocamlbuild, assurez-vous d’avoir une version à jour d’OCaml.

* OMake prend en charge les versions hors source de manière peu évidente. Il existe également des problèmes lorsque les sources sont en lecture seule. Nous avons dû patcher et reconstruire notre version Windows d’OMake.

bonne question. J’aurais tendance à dire:

1) ocamlbuild Il s’agit probablement de la méthode standard de compilation, car elle est efficace, rapide et l’outil par défaut de la dissortingbution officielle. Le fait que ce soit dans la dissortingbution officielle est un bon point car il a plus de chances de restr avec le temps. De plus, ocamlfind est activé, donc il peut gérer les paquets installés avec ocamlfind, une autre norme pour installer des paquets (ocamlfind est un peu comme pkg-config pour C)

2) Mais ce ne sera pas suffisant pour votre projet. L’intégration avec 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 ça ne m’a pas plu.

3) Toutefois, vos scripts de génération ne fonctionneront probablement pas si vous ne voulez pas que d’autres personnes puissent télécharger et créer votre projet sur leur propre ordinateur. De plus, oasis ne gère pas pkg-config. Pour ces raisons, j’aurais tendance à vous conseiller d’utiliser ocaml-autoconf (macros ocaml pour les autotools). Parce que les autotools sont la norme pour la gestion des bibliothèques C et sont bien connus des responsables de paquets. Il peut également gérer la compilation croisée …

=> ocaml-autoconf avec ocamlbuild