¿Cuál es la forma preferida de estructurar y construir proyectos OCaml?


No está claro para los recién llegados al ecosistema cuál es la forma canónicamente preferida de estructurar y administrar la construcción de proyectos OCaml de tamaño pequeño a mediano. Entiendo los conceptos básicos de ocamlc, &c. mirror reflejan los compiladores convencionales de UNIX C lo suficiente como para parecer sencillo. Pero, por encima del nivel de compilación única de archivos individuales, no está claro cómo administrar la compilación de manera simple y limpia. El problema no es buscar herramientas potenciales, sino ver una o algunas correctas (suficiente) Formas validated validadas por la experiencia de la comunidad for para estructurar y construir proyectos estándar OCaml.

Mi caso de uso del modelo es un proyecto modesto pero no trivial, de OCaml puro u OCaml más una dependencia de C. Tal proyecto:

  1. contiene un número de archivos fuente
  2. enlaces a una serie de bibliotecas estándar
  3. enlaces a una o más bibliotecas de terceros
  4. opcionalmente incluye una biblioteca C y un contenedor OCaml como subproyecto (aunque esto también podría ser administrado por separado e incluido como una biblioteca de terceros, como en (3))

Se destacan varias herramientas alternativas:

  • Los Makefiles personalizados parecen ser el estándar común en la mayoría de los paquetes OCaml de código abierto, pero parecen frustrantemente detallados y complejos, incluso más que para proyectos modestos de C/C++. Peor aún, muchas incluso aparentemente simples bibliotecas OCaml capa autoconf / automake en la parte superior para una complejidad aún mayor.
  • ocamlbuild parece ofrecer un mecanismo moderno y simplificado para automatizar compilaciones con una configuración mínima, pero no está bien documentado para los recién llegados, ni representado por ejemplo en los materiales introductorios en el ecosistema de OCaml, ni visiblemente utilizado por cualquiera de los diversos proyectos publicados de OCaml que he buscado inspiración.
  • OASIS parece ser una capa de código de convenciones y bibliotecas encima de otros sistemas de compilación para soportar la construcción de un gestor de paquetes y una biblioteca, como Cabal.

(también he visto OMake , que parece ser un autodenominado "make++" que también incluye un conjunto de reglas estándar para lenguajes comunes, incluyendo OCaml, y ocaml-make née OCamlMakefile, proporcionando una plantilla de reglas estándar para GNU make.)

¿Es alguna de estas una forma preferida y moderna de administrar las compilaciones de OCaml?

¿Cómo se estructuran mejor los archivos de proyecto?

¿Cómo se incluyen y gestionan las dependencias de bibliotecas de terceros? ¿Se prefiere instalarlos en el sistema nivel, o hay una forma estándar y directa de administrarlos localmente a un proyecto? Preferiría un modelo en el que los proyectos permanezcan lo más autónomos posible.

Author: ygrek, 2011-05-11

4 answers

Tienes una lista completa de las opciones disponibles, pero esta pregunta no tendrá una respuesta clara. Mi recomendación personal es también utilizar ocamlbuild. Las myocamlbuild.ml archivo proporcionado aquí es un buen comienzo. Le permitirá compilar fácilmente proyectos que dependen de varias bibliotecas. No creo que maneje el caso del enlace a bibliotecas C, pero hay ejemplos adicionales en el wiki que pueden ayudar.

Algunas personas se oponen a ocamlbuild porque es otra herramienta de construcción, complicando los trabajos de los administradores de paquetes. Sin embargo, su facilidad de uso y el hecho de que esté incluido en la distribución oficial lo está haciendo cada vez más utilizado.

También puede omitir todo esto y usar oasis directamente. Es muy nuevo, y aún no se ha anunciado una versión estable, pero es muy usable. Generará la myocamlbuild.ml automáticamente para ti. Este es probablemente el camino a seguir en un futuro muy cercano, si no ya. Además, mediante el uso oasis, inmediatamente tendrá el beneficio de oasis-db, un sistema similar a CPAN para OCaml que está en desarrollo.

En cuanto a la gestión de bibliotecas, la respuesta es ocamlfind. Si tiene varias instancias de OCaml instaladas, llamar a la copia apropiada de ocamlfind automáticamente hará que todas las referencias a las bibliotecas sean las de esa instancia en particular, suponiendo que use ocamlfind sistemáticamente para todas las bibliotecas. Actualmente uso godi para instalar OCaml y bibliotecas. Utiliza ocamlfind, y no tengo ningún problema con tener varias instancias de OCaml instaladas.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 12:43:56

Personalmente daría +1 para ocamlbuild. Sus reglas predeterminadas son lo suficientemente buenas como para compilar proyectos pequeños y medianos con un comando y ninguno a una configuración muy mínima. También hace cumplir algunas convenciones muy razonables (no mezclar fuentes con resultados de compilación). Y para proyectos más grandes se puede personalizar según el deseo de uno, con reglas y complementos adicionales. En la empresa donde trabajo lo estamos usando para un gran proyecto (Ocaml + algo de C + algo de preprocesamiento + ...) y funciona como un encanto (y nos da mucho menos dolores de cabeza que Makefiles lo haría).

En cuanto a los manuales, creo que la guía del usuario (disponible en la página web del autor ) debería ser suficiente para comenzar. Más cosas funky puede requerir un poco más de excavación.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-11 15:26:07

+1 para OMake.

Renovamos nuestra infraestructura de construcción hace unos años y elegimos OMake por las siguientes razones:

  • nuestros productos se componen de una mezcla de C, C++, Managed C++, Ruby y OCaml.
  • nos dirigimos tanto a Linux como a Windows.
  • interactuamos con bases de datos en el momento de la compilación.
  • para algunas producciones tuvimos que usar OCaml 3.10.
  • nuestro sistema de construcción original utiliza autoconf/automake.
  • requerimos compilaciones fuera del código fuente*.

A sé honesto No se si podríamos haberlo hecho con ocamlbuild, no lo he probado. La herramienta está en uso con seguridad ya que hay alguna actividad alrededor de ella en el bugtracker de OCaml. Si opta por ocamlbuild, asegúrese de tener una versión actualizada de OCaml.

*OMake soporta compilaciones fuera de código de una manera poco obvia. También tiene algunos problemas cuando las fuentes son de solo lectura. Tuvimos que parchear y reconstruir nuestra versión de OMake para 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 13:57:42

Buena pregunta. Yo tendería a decir :

1) ocamlbuild Es probable que sea la forma estándar de compilar, porque es eficiente, rápida y la herramienta predeterminada dada por la distribución oficial. El hecho de que esté en la distribución oficial es un buen punto, porque es más probable que permanezca con el tiempo. Además, tiene activado ocamlfind, por lo que puede gestionar paquetes instalados con ocamlfind, otro estándar para instalar paquetes (ocamlfind es un poco como pkg-config para C)

2) Pero no será suficiente para tu proyecto. La integración con C es básica con ocamlbuild. Así que aquí quizás te aconsejaría usar oasis para finalmente responder a tu pregunta. También probé OMake, pero no me gustó.

3) Sin embargo, es probable que sus scripts de compilación no funcionen correctamente si no desea que otras personas puedan descargar y compilar su proyecto en su propia máquina. Además, oasis no maneja pkg-config. Por esas razones, tendería a aconsejarle que utilice ocaml-autoconf (macros ocaml para autotools). Porque autotools es el estándar para administrar bibliotecas de C y es bien conocido por los mantenedores de paquetes. También puede manejar la compilación cruzada...

=> ocaml-autoconf con 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 17:57:58