2011-05-10 15 views
56

No está claro para los recién llegados al ecosistema cuál es la forma canónica preferida para estructurar y administrar proyectos OCaml de tamaño pequeño a mediano. Entiendo los conceptos básicos de ocamlc, & c .-- reflejan los compiladores convencionales UNIX C lo suficiente como para parecer sencillo. Pero, por encima del nivel de compilación única de archivos individuales, no está claro cuál es la mejor manera de administrar la compilación de manera simple y limpia. El problema no es buscar herramientas potenciales, sino ver una o varias formas correctas (suficientes), según lo validado por la experiencia de la comunidad, para estructurar y construir proyectos estándares de OCaml.¿Cuál es la forma preferida de estructurar y construir proyectos OCaml?

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

  1. contiene una serie de archivos de origen
  2. enlaces a una serie de bibliotecas estándar
  3. enlaces a bibliotecas de uno o más de 3 ª parte
  4. incluye opcionalmente una biblioteca C y la envoltura OCaml como subproyecto (aunque esto también podría ser administrado por separado y se incluye como una biblioteca tercera parte, como en (3))

Varias herramientas alternativas destacan:

  • 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 prolijo y complejo, incluso más que para los modestos proyectos 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 construcciones con configuración mínima, pero no está bien documentado para los recién llegados, ni representados por ejemplos en los materiales introductorios en el ecosistema OCaml, ni visiblemente utilizado por cualquiera de los varios publicados Proyectos OCaml que busqué en busca de inspiración.
  • OASIS parece ser una capa de convención y código de biblioteca encima de otros sistemas de compilación para admitir la construcción de un administrador de paquetes y una biblioteca, como Cabal.

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

¿Alguna de estas es 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 administran las dependencias de bibliotecas de terceros? ¿Se prefiere instalarlos a nivel del sistema o existe una forma estándar y directa de administrarlos localmente en un proyecto? Preferiría mucho un modelo en el que los proyectos permanezcan tan autónomos como sea posible.

+0

El enlace ocamlbuild es (ahora) rota. –

+0

El enlace ahora está fijado – ygrek

Respuesta

21

Tiene una lista completa de las opciones disponibles, pero esta pregunta no tendrá una respuesta clara. Mi recomendación personal es también usar ocamlbuild. El archivo myocamlbuild.ml proporcionado here 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 ser útiles.

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

También puede saltar todo esto y utilizar directamente oasis. Es muy nuevo y aún no se ha anunciado su lanzamiento estable, pero es muy útil. Generará el myocamlbuild.ml automáticamente para usted. Este es probablemente el camino a seguir en un futuro muy cercano, si no es que ya lo es. Además, al usar oasis, tendrá inmediatamente el beneficio de oasis-db, un sistema CPAN similar para OCaml que está en desarrollo.

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

+5

Han pasado casi tres años desde esta respuesta. Me gustaría compartir mi experiencia como recién llegado. Después de mucho dolor he llegado a la conclusión de que devorar los documentos y usar 'ocamlc',' ocamlopt', y 'ocamlmklib' a través de' ocamlfind' es la forma menos dolorosa de construir proyectos OCaml. He documentado mis hallazgos aquí https://github.com/pacemkr/ocaml-scrypt/blob/master/Makefile Estoy seguro de que 'oasis' y los archivos' myocamlbuild.ml' resuelven problemas reales. Intenté, realmente lo hice, pero ambas herramientas fallan miserablemente al abstraer la complejidad subyacente. –

+2

Considero mi respuesta obsoleta también. Recientemente he estado usando [OMake] (http://omake.metaprl.org/), pero estoy insatisfecho con todas las herramientas de compilación y espero que finalmente surja algo fundamentalmente mejor. –

+2

Las cosas están mejorando, 'opam' en realidad no se preocupa por el sistema de compilación, lo cual es bueno. 'ocamlfind' hace que usar' ocamlc' y amigos sea mucho más fácil. Estos dos me acercan lo suficiente. La parte más difícil fue comprender todos los artefactos intermedios (cm *) y de dónde vienen, y la indirección de 'cclib' y banderas similares, cómo se transmiten junto con un paquete, compilaciones de tiempo de ejecución personalizadas, etc. –

14

Personalmente daría +1 por ocamlbuild. Sus reglas predeterminadas son lo suficientemente buenas como para compilar proyectos pequeños a medianos con un solo comando y configuraciones de mínimas a mínimas. También impone algunas convenciones muy razonables (no combina fuentes con resultados de compilación). Y para proyectos más grandes, puede personalizarse según sus deseos, con reglas adicionales & complementos.En la empresa donde trabajo lo estamos usando para un large project (+ Ocaml algunos C + + algo de pre-procesamiento ...) y funciona como un encanto (y nos da mucho menos dolores de cabeza que lo haría Makefile).

En cuanto a los manuales, creo que la guía del usuario (disponible en el author's webpage,) debería ser suficiente para comenzar. Las cosas más originales pueden requerir un poco más de excavación.

+0

Totalmente de acuerdo. Estoy involucrado en un gran proyecto que usa ocamlfind, preprocesamiento yc sin demasiados problemas. – nlucaroni

+1

Ciertamente me pareció el más atractivo en mi investigación paralela. Informaré una vez que haya despegado con eso. – jrk

+7

Para todos los fanáticos de ocamlbuild: recuerde que * usted * puede mejorar la herramienta al ayudar a escribir documentación, liberar fragmentos de sus interesantes archivos 'miocamlbuild.ml' caseros, o incluso posiblemente contribuir al código (pero para eso primero debe ponerse en contacto con los desarrolladores) para conocer las características que le gustaría (objetivo fácil en mi lista de deseos: permita llamar a ocamldoc para producir diagramas de puntos). – gasche

10

+1 para OMAKE.

Hemos renovado nuestra infraestructura de construcción hace unos años y eligió OMAKE por las siguientes razones:

  • nuestros productos se componen de una mezcla de C, C++, C++ administrada, Ruby y OCaml.
  • nos dirigimos tanto a Linux como a Windows.
  • interactuamos con bases de datos en tiempo de compilación.
  • para algunas producciones tuvimos que usar OCaml 3.10.
  • nuestro sistema de construcción original utilizado autoconf/automake.
  • requerimos compilaciones fuera de origen *.

Para ser sincero, no sé si podríamos haberlo hecho con ocamlbuild, no lo he probado. La herramienta está en uso con certeza ya que hay algo de actividad a su alrededor en el rastreador de errores de OCaml. Si opta por ocamlbuild, asegúrese de tener una versión actualizada de OCaml.

* OMake admite construcciones fuera de la fuente de una manera poco obvia. También tiene algunos problemas cuando las fuentes son de solo lectura. Tuvimos que parchar y reconstruir nuestra versión para Windows de OMake.

+3

Me gustaría ver una comparación entre omake y ocamlbuild. He usado omake con mucho éxito. No tuve tanta suerte cuando probé ocamlbuild, pero eso fue hace un par de años. – aneccodeal

3

buena pregunta.Yo tendería a decir:

1) ocamlbuild Es probable que sea la forma estándar de compilación, 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 habilitado ocamlfind, por lo que puede administrar 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 su proyecto. La integración con C es básica con ocamlbuild. Así que aquí quizás te recomiende que uses oasis para finalmente responder a tu pregunta. También probé OMake, pero no me gustó.

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

=> ocaml-autoconf con ocamlbuild

Cuestiones relacionadas