2011-12-29 10 views
12

Tengo un archivo Tools.ml que contiene algunas funciones comunes de utilidad que escribo yo mismo. Debajo de .../Code/ tengo varias carpetas que contienen cada uno un proyecto. Mi pregunta es dónde debo colocar este Tools.ml de manera que todas las carpetas y archivos bajo .../Code/ puedan compartir este módulo por Open Tools.¿Dónde colocar un módulo de utilidad compartido en OCaml?

Espero que mi pregunta esté clara ... ¿Alguien tiene una buena solución?

Edit1: siguiente respuesta de @ Gasché, he escrito tools.ml de la siguiente manera:

module Tools = 
    struct 
    let a_function = ... 
    ... 
    end 

Entonces compilado, y hecho ocamlfind install tools META tools.cmo tools.cmx tools.ml como se sugiere, que parece ir bien. A continuación, he escrito test.ml de la siguiente manera:

open Tools 

let f = Tools.a_function 

entonces compilado con ocamlc test.ml -o test, entonces me dio un error:

File "test.ml", line 1, characters 0-1: 
Error: Error while linking test.cmo: 
Reference to undefined global `Tools' 

Podría alguien decirme qué pasó?

Respuesta

13

Puede empaquetarlo como una biblioteca independiente, instalarlo con otras bibliotecas OCaml y acceder a él, desde su proyecto, como una biblioteca.

Una manera muy simple de hacer esto es escribir un archivo META para ocamlfind. Cree un directorio en el que se sienta cómodo para realizar su proyecto de "biblioteca personal". Supongamos que tiene tools.ml y tools.mli, y su código depende de algún paquete findlib (por ejemplo, unix y bigarray). Usted META se vería así:

name="tools" 
description="personal collection of utilities" 
version="0.1" 
requires="unix,bigarray" 
archive(byte)="tools.cmo" 
archive(native)="tools.cmx" 

Una vez que haya escrito este archivo META, es fácil pedir ocamlfind a "instalar" la biblioteca (y quitarlo si lo desea), y lo utilizan en su otra proyectos. Para instalar, la sintaxis es ocamlfind install <name> <meta-file> <file1> <file2> ... donde <file1>, <file2>.. es el archivo que desea ver incluido en el directorio de instalación. Debe tener al menos tools.cmitools.cmo (y tools.o y tools.cmx para la compilación nativa), pero es una buena práctica tener también tools.mli por ejemplo (y, si desea proporcionar el código, tools.ml).

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli 

(Por supuesto tools.cmo etc. tienen que existir, es decir que debe install después de que haya compilado su paquete. Si ha utilizado ocamlbuild, es probable que sea en un subdirectorio _build, por lo ocamlfind install ... _build/tools.cmo ....)

de sus numerosos proyectos, se puede utilizar fácilmente su biblioteca, ya sea usando el toold ocamlfind directamente si esto es lo que ya lo hacen para compilar sus programas

ocamlfind ocamlc -package tools .... 

oa través de las instalaciones provistas por ocamlbuild por ejemplo, agregando package(tools) a sus etiquetas.

Para volver a instalar la biblioteca de si ha realizado un cambio a él y quiere que se puede acceder desde sus proyectos

ocamlfind remove tools 
ocamlfind install tools META ... 

También puede manejar todo esto a través oasis, que es una capa en la parte superior de ocamlfind/ocamlbuild para automatizar este proceso. No estoy lo suficientemente familiarizado con oasis para dar ejemplos de este tipo fuera de mi cabeza, pero debería ser igualmente simple para un caso tan restringido (biblioteca de un archivo), y escalar mejor si luego desea ampliar su biblioteca (por ej. . También puede manejar generación de documentación, configuración de precompilación ...).

+0

Gracias por su comentario ... ¿Podría echar un vistazo a mi prueba en OP? – SoftTimur

+1

@SoftTimur: el comando de compilación correcto en su caso es 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'. La opción '-package tools' agrega el paquete, y' -linkpkg' lo vincula para producir un ejecutable (necesario cuando se produce un ejecutable, pero no cuando se compila a '.cmo'). Probablemente también podría usar el paquete 'ocamlbuild -tag '' (herramientas) '' test.byte' '(no probado). – gasche

+0

@gashe: 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test' funciona solo cuando' test.ml' está en la misma carpeta que la 'herramienta ejecutable' ... ¿Sabe por qué? – SoftTimur

Cuestiones relacionadas